新手上路
- 积分
- 29
- 金钱
- 29
- 注册时间
- 2011-6-1
- 在线时间
- 0 小时
|
<p> 。。。。。。<br />
#include "..\config.h"</p>
<p>#define BEEP ( 3 << 0)<br />
#define BEEP_INIT() GPIO2DIR |= BEEP /* 蜂鸣器初始化P2^0,P2^1 */<br />
#define BEEPOFF() GPIO2DATA |= BEEP /* 蜂鸣器关 */<br />
#define BEEPON() GPIO2DATA &= ~BEEP /* 蜂鸣器开 */</p>
<p>#define KEY (1ul << 0) //GPIO3-0<br />
<br />
//CE P0^7<br />
#define CE0 (1ul << 7) <br />
#define CE_INIT() GPIO0DIR |= CE0 /*CE是GPIO0_1且为输出*/<br />
#define CEH() GPIO0DATA |= CE0 /* CE为高电平 */<br />
#define CEL() GPIO0DATA &= ~CE0 /* CE为低电平 */ <br />
//CSN = P0^2; <br />
#define CSN0 (1ul << 2) <br />
#define CSN_INIT() GPIO0DIR |= CSN0 /*CSN是GPIO0_2*/<br />
#define CSNH() GPIO0DATA |= CSN0 /* CE为高电平 */<br />
#define CSNL() GPIO0DATA &= ~CSN0 /* CE为低电平 */ <br />
//sbit IRQ = P0^3; <br />
#define IRQ0 (1ul << 3) <br />
#define IRQ_INIT() GPIO0DIR &= ~IRQ0 /*IRQ是GPIO0_3*/<br />
//sbit MISO = P0^4; <br />
#define MISO0 (1ul << 4) <br />
#define MISO_INIT() GPIO0DIR &= ~MISO0 /*IRQ是GPIO0_4*/ <br />
//#define MISO GPIO0DIR &= MISO0 /*MISO是GPIO0_4*/</p>
<p>//sbit MOSI = P0^5; <br />
#define MOSI0 (1ul << 5) <br />
#define MOSI_INIT() GPIO0DIR |= MOSI0 /*MOSI是GPIO0_5*/<br />
#define MOSIH() GPIO0DATA |= MOSI0 /* CE为高电平 */<br />
#define MOSIL() GPIO0DATA &= ~MOSI0 /* CE为低电平 */ <br />
//sbit MOSI = P0^6; <br />
#define SCK0 (1ul <<6) <br />
#define SCK_INIT() GPIO0DIR |= SCK0 /*MOSI是GPIO0_6*/<br />
#define SCKH() GPIO0DATA |= SCK0 /* CE为高电平 */<br />
#define SCKL() GPIO0DATA &= ~SCK0 /* CE为低电平 */ <br />
/***************************************************************************************/<br />
//CE P2^7<br />
#define R_CE0 (1ul << 7) <br />
#define R_CE_INIT() GPIO2DIR |= R_CE0 /*CE是GPIO0_1且为输出*/<br />
#define R_CEH() GPIO2DATA |= R_CE0 /* CE为高电平 */<br />
#define R_CEL() GPIO2DATA &= ~R_CE0 /* CE为低电平 */ </p>
<p>//CSN = P2^2; <br />
#define R_CSN0 (1ul << 2) <br />
#define R_CSN_INIT() GPIO2DIR |= R_CSN0 /*CSN是GPIO0_2*/<br />
#define R_CSNH() GPIO2DATA |= R_CSN0 /* CE为高电平 */<br />
#define R_CSNL() GPIO2DATA &= ~R_CSN0 /* CE为低电平 */ <br />
//sbit IRQ = P2^3; <br />
#define R_IRQ0 (1ul << 3) <br />
#define R_IRQ_INIT() GPIO2DIR &= ~R_IRQ0 /*IRQ是GPIO0_3*/<br />
//sbit MISO = P2^4; <br />
#define R_MISO0 (1ul << 4) <br />
#define R_MISO_INIT() GPIO2DIR &= ~R_MISO0 /*IRQ是GPIO0_4*/ <br />
//#define MISO GPIO0DIR &= MISO0 /*MISO是GPIO0_4*/</p>
<p>//sbit MOSI = P2^5; <br />
#define R_MOSI0 (1ul << 5) <br />
#define R_MOSI_INIT() GPIO2DIR |= R_MOSI0 /*MOSI是GPIO0_5*/<br />
#define R_MOSIH() GPIO2DATA |= R_MOSI0 /* CE为高电平 */<br />
#define R_MOSIL() GPIO2DATA &= ~R_MOSI0 /* CE为低电平 */ <br />
//R_SCK=P2^6<br />
#define R_SCK0 (1ul <<6) <br />
#define R_SCK_INIT() GPIO2DIR |= R_SCK0 /*MOSI是GPIO0_6*/<br />
#define R_SCKH() GPIO2DATA |= R_SCK0 /* CE为高电平 */<br />
#define R_SCKL() GPIO2DATA &= ~R_SCK0 /* CE为低电平 */ </p>
<p><br />
// SPI(nRF24L01) commands<br />
#define READ_REG 0x00 // Define read command to register<br />
#define WRITE_REG 0x20 // Define write command to register<br />
#define RD_RX_PLOAD 0x61 // Define RX payload register address<br />
#define WR_TX_PLOAD 0xA0 // Define TX payload register address<br />
#define FLUSH_TX 0xE1 // Define flush TX register command<br />
#define FLUSH_RX 0xE2 // Define flush RX register command<br />
#define REUSE_TX_PL 0xE3 // Define reuse TX payload register command<br />
#define NOP 0xFF // Define No Operation, might be used to read status register</p>
<p>// SPI(nRF24L01) registers(addresses)<br />
#define CONFIG 0x00 // 'Config' register address<br />
#define EN_AA 0x01 // 'Enable Auto Acknowledgment' register address<br />
#define EN_RXADDR 0x02 // 'Enabled RX addresses' register address<br />
#define SETUP_AW 0x03 // 'Setup address width' register address<br />
#define SETUP_RETR 0x04 // 'Setup Auto. Retrans' register address<br />
#define RF_CH 0x05 // 'RF channel' register address<br />
#define RF_SETUP 0x06 // 'RF setup' register address<br />
#define STATUS 0x07 // 'Status' register address<br />
#define OBSERVE_TX 0x08 // 'Observe TX' register address<br />
#define CD 0x09 // 'Carrier Detect' register address<br />
#define RX_ADDR_P0 0x0A // 'RX address pipe0' register address<br />
#define RX_ADDR_P1 0x0B // 'RX address pipe1' register address<br />
#define RX_ADDR_P2 0x0C // 'RX address pipe2' register address<br />
#define RX_ADDR_P3 0x0D // 'RX address pipe3' register address<br />
#define RX_ADDR_P4 0x0E // 'RX address pipe4' register address<br />
#define RX_ADDR_P5 0x0F // 'RX address pipe5' register address<br />
#define TX_ADDR 0x10 // 'TX address' register address<br />
#define RX_PW_P0 0x11 // 'RX payload width, pipe0' register address<br />
#define RX_PW_P1 0x12 // 'RX payload width, pipe1' register address<br />
#define RX_PW_P2 0x13 // 'RX payload width, pipe2' register address<br />
#define RX_PW_P3 0x14 // 'RX payload width, pipe3' register address<br />
#define RX_PW_P4 0x15 // 'RX payload width, pipe4' register address<br />
#define RX_PW_P5 0x16 // 'RX payload width, pipe5' register address<br />
#define FIFO_STATUS 0x17 // 'FIFO Status Register' register address<br />
/********************************************************************************/<br />
#define TX_ADR_WIDTH 5<br />
#define RX_ADR_WIDTH 5<br />
#define TX_PLOAD_WIDTH 8<br />
#define RX_PLOAD_WIDTH 8 //32字节有效数据宽度<br />
uint8 TX_ADDRESS[TX_ADR_WIDTH] = {0x34,0x43,0x10,0x10,0x01}; <br />
uint8 RX_ADDRESS[RX_ADR_WIDTH] = {0x34,0x43,0x10,0x10,0x01}; //发送地址<br />
//uint8 RX_BUF[TX_PLOAD_WIDTH];<br />
//uint8 TX_BUF[TX_PLOAD_WIDTH];<br />
uint8 flag;<br />
uint8 sta; <br />
uint8 mode;<br />
uint8 Buffer[]={0X00,0X01,0X02,0X03,0X04,0X05,0X06,0X07};<br />
uint8 Buffer1[]={0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00}; <br />
/****** STATUS寄存器bit位定义 *******/<br />
#define MAX_RT 0x10 //达到最大发送次数中断<br />
#define TX_DS 0x20 //TX发送完成中断<br />
#define RX_DR 0x40 //接收到数据中断</p>
<p>/*********************************************************************************/<br />
void myDelay (INT32U ulTime)<br />
{<br />
uint8 i; <br />
i = 0;<br />
while (ulTime--) {<br />
for (i = 0; i < 5000; i++);<br />
}<br />
}<br />
void Delay_10us(void)<br />
{<br />
uint8 i = 0;<br />
for( i =100; i>0; i--); <br />
}<br />
void Delay_130us(void)<br />
{<br />
INT32U i = 0;<br />
for( i =1400; i>0; i--); <br />
<br />
}<br />
/************************************************************************************/<br />
void INIT_IO(void)<br />
{<br />
IRQ_INIT(); //IRQ输入<br />
MISO_INIT(); //MISO输入<br />
MOSI_INIT(); //MOSI输出<br />
SCK_INIT(); //SCK输出<br />
CE_INIT(); //CE输出<br />
CSN_INIT(); //CSN输出<br />
R_IRQ_INIT(); //IRQ输入<br />
R_MISO_INIT(); //MISO输入<br />
R_MOSI_INIT(); //MOSI输出<br />
R_SCK_INIT(); //SCK输出<br />
R_CE_INIT(); //CE输出<br />
R_CSN_INIT(); //CSN输出<br />
BEEP_INIT(); //P2^0,P2^1输出<br />
CEL(); //选中24L01<br />
R_CEL();<br />
CSNH(); // CSN为高代表SPI禁止,见时序图<br />
R_CSNH();<br />
SCKL(); // SPI时钟置低,为后面上升沿读入做准备,下降沿输出 <br />
R_SCKL();<br />
}</p>
<p>uint8 SPI_RW(uint8 byte,uint8 mode)<br />
{<br />
uint8 i;<br />
if(!mode)<br />
{<br />
for(i=0; i<8; i++) // 循环8次<br />
{<br />
if(byte & 0x80) // byte最高位输出到MOSI<br />
MOSIH();<br />
else <br />
MOSIL(); <br />
byte = (byte << 1); // 低一位移位到最高位 <br />
SCKH(); // 拉高SCK,nRF24L01从MOSI读入1位数据,同时从MISO输出1位数据 <br />
if( GPIO0DATA & MISO0 ) <br />
byte |= 1; // 读MISO到byte最低位<br />
SCKL(); // SCK置低<br />
}<br />
return(byte); // 返回读出的一字节<br />
}<br />
else<br />
{<br />
for(i=0; i<8; i++) // 循环8次<br />
{<br />
if(byte & 0x80) // byte最高位输出到MOSI<br />
R_MOSIH();<br />
else <br />
R_MOSIL(); <br />
byte = (byte << 1); // 低一位移位到最高位 <br />
R_SCKH(); // 拉高SCK,nRF24L01从MOSI读入1位数据,同时从MISO输出1位数据 <br />
if( GPIO2DATA & R_MISO0 ) <br />
byte |= 1; // 读MISO到byte最低位<br />
R_SCKL(); // SCK置低<br />
}<br />
return(byte); // 返回读出的一字节<br />
<br />
}<br />
}</p>
<p>uint8 SPI_RW_Reg(uint8 reg, uint8 value ,uint8 mode)<br />
{<br />
uint8 status;<br />
if(!mode)<br />
{<br />
CSNL(); // CSN置低,开始传输数据<br />
status = SPI_RW(reg,mode); // 选择寄存器,同时返回状态字<br />
SPI_RW(value,mode); // 然后写数据到该寄存器<br />
CSNH(); // CSN拉高,结束数据传输<br />
Delay_10us();<br />
return(status); // 返回状态寄存器<br />
}<br />
else<br />
{<br />
R_CSNL(); // CSN置低,开始传输数据<br />
status = SPI_RW(reg,mode); // 选择寄存器,同时返回状态字<br />
SPI_RW(value,mode); // 然后写数据到该寄存器<br />
R_CSNH(); // CSN拉高,结束数据传输<br />
Delay_10us();<br />
return(status); // 返回状态寄存器<br />
<br />
}<br />
}</p>
<p>uint8 SPI_Read(uint8 reg,uint8 mode)<br />
{<br />
uint8 reg_val;<br />
if(!mode)<br />
{ <br />
CSNL(); // CSN置低,开始传输数据<br />
SPI_RW(reg,mode); // 选择寄存器<br />
reg_val = SPI_RW(0,mode); // 然后从该寄存器读数据<br />
CSNH(); // CSN拉高,结束数据传输<br />
Delay_10us();<br />
return(reg_val); // 返回寄存器数据<br />
}<br />
else<br />
{<br />
R_CSNL(); // CSN置低,开始传输数据<br />
SPI_RW(reg,mode); // 选择寄存器<br />
reg_val = SPI_RW(0,mode); // 然后从该寄存器读数据<br />
R_CSNH(); // CSN拉高,结束数据传输<br />
Delay_10us();<br />
return(reg_val); // 返回 <br />
}<br />
}</p>
<p>uint8 SPI_Read_Buf(uint8 reg, uint8 *pBuf, uint8 bytes,uint8 mode)<br />
{<br />
uint8 status, i;<br />
if(!mode)<br />
{<br />
CSNL(); // CSN置低,开始传输数据<br />
status = SPI_RW(reg,mode); // 选择寄存器,同时返回状态字<br />
for(i=0; i<bytes; i++)<br />
pBuf = SPI_RW(0,mode); // 写0个字节到nrf24l01,同时逐个字节从nRF24L01读出<br />
CSNH(); // CSN拉高,结束数据传输<br />
Delay_10us();<br />
return(status); // 返回状态寄存器<br />
}<br />
else<br />
{<br />
R_CSNL(); // CSN置低,开始传输数据<br />
status = SPI_RW(reg,mode); // 选择寄存器,同时返回状态字<br />
for(i=0; i<bytes; i++)<br />
pBuf = SPI_RW(0,mode); // 写0个字节到nrf24l01,同时逐个字节从nRF24L01读出<br />
R_CSNH(); // CSN拉高,结束数据传输<br />
Delay_10us();<br />
return(status); // 返回状态寄存器<br />
}<br />
}</p>
<p>uint8 SPI_Write_Buf(uint8 reg, uint8 *pBuf, uint8 bytes,uint8 mode)<br />
{<br />
uint8 status, i;<br />
if(!mode)<br />
{<br />
CSNL(); // CSN置低,开始传输数据<br />
status = SPI_RW(reg,mode); // 选择寄存器,同时返回状态字<br />
for(i=0; i<bytes; i++)<br />
SPI_RW(*pBuf++,mode); // 逐个字节写入nRF24L01<br />
CSNH(); // CSN拉高,结束数据传输<br />
Delay_10us();<br />
return(status); // 返回状态寄存器<br />
}<br />
else<br />
{<br />
R_CSNL(); // CSN置低,开始传输数据<br />
status = SPI_RW(reg,mode); // 选择寄存器,同时返回状态字<br />
for(i=0; i<bytes; i++)<br />
SPI_RW(*pBuf++,mode); // 逐个字节写入nRF24L01<br />
R_CSNH(); // CSN拉高,结束数据传输<br />
Delay_10us();<br />
return(status); // 返回状态寄存器 <br />
}<br />
}</p>
<p>void RX_Mode(void)<br />
{<br />
R_CEL();<br />
Delay_10us();<br />
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH,1); // 接收设备接收通道0使用和发送设备相同的发送地址<br />
SPI_RW_Reg(WRITE_REG + EN_AA, 0x01,1); // 使能接收通道0自动应答<br />
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01,1); // 使能接收通道0<br />
SPI_RW_Reg(WRITE_REG + RF_CH, 40,1); // 选择射频通道0x40<br />
SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH,1); // 接收通道0选择和发送通道相同有效数据宽度<br />
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07,1); // 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益<br />
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f,1); // CRC使能,16位CRC校验,上电,接收模式<br />
R_CEH(); // 拉高CE启动接收设备<br />
Delay_130us();<br />
Delay_10us();<br />
}</p>
<p>void TX_Mode(void)<br />
{<br />
CEL();</p>
<p> SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH,0); // 写入发送地址<br />
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH,0); // 为了应答接收设备,接收通道0地址和发送地址相同<br />
SPI_Write_Buf(WR_TX_PLOAD, Buffer, TX_PLOAD_WIDTH,0); // 写数据包到TX <br />
<br />
SPI_RW_Reg(WRITE_REG + EN_AA, 0x01,0); // 使能接收通道0自动应答<br />
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01,0); // 使能接收通道0<br />
SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x01,0); // 自动重发延时等待250us+86us,自动重发10次<br />
SPI_RW_Reg(WRITE_REG + RF_CH, 40,0); // 选择射频通道0x40<br />
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07,0); // 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益<br />
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e,0); // CRC使能,16位CRC校验,上电<br />
CEH();<br />
Delay_10us();<br />
Delay_10us();<br />
}<br />
<br />
void CheckButtons()<br />
{<br />
GPIO3DIR &= ~KEY;<br />
if((GPIO3DATA&KEY)==0x00) // 读取P3^0状态<br />
{<br />
flag = 1; <br />
}<br />
}</p>
<p>int main(void)<br />
{<br />
targetInit(); /* 初始化目标板,切勿删除 */<br />
pinInit(); /* 引脚初始化 */<br />
SYSAHBCLKCTRL |= (1ul << 6); /* 使能GPIO模块时钟 使能16位定时器计时器0的时钟 */ <br />
INIT_IO(); // 初始化IO<br />
BEEPOFF(); //初始化让P2^0,P2^1小灯熄灭 <br />
<br />
TX_Mode();<br />
RX_Mode();<br />
while(1)<br />
{ <br />
CheckButtons();<br />
if(flag==1)<br />
{<br />
flag = 0;<br />
TX_Mode();<br />
myDelay(10);<br />
if(!(GPIO0DATA&IRQ0))<br />
{<br />
sta=SPI_Read(STATUS,0);<br />
switch(sta & 0x30)<br />
{<br />
case 0x10: //MAX_RT IRQ<br />
GPIO2DATA &= ~(1<<0);<br />
SPI_RW_Reg(FLUSH_TX,0,0);break;<br />
case 0x20: //TX_DS IRQ<br />
GPIO2DATA &= ~(1<<1);break;<br />
default:GPIO2DATA &= ~(3<<0);break;<br />
}<br />
SPI_RW_Reg(WRITE_REG+STATUS,0xff,0);// clear RX_DR or TX_DS or MAX_RT interrupt flag<br />
}<br />
if(!(GPIO2DATA&R_IRQ0))<br />
{<br />
sta=SPI_Read(STATUS,1);<br />
if(sta&RX_DR) // if renRF24L01_CEive data ready (RX_DR) interrupt<br />
{<br />
SPI_Read_Buf(RD_RX_PLOAD,Buffer1,TX_PLOAD_WIDTH,1);// read renRF24L01_CEive payload from RX_FIFO buffer<br />
// GPIO2DATA |= 0XFD;<br />
}<br />
SPI_RW_Reg(WRITE_REG+STATUS,0xff,1);// clear RX_DR or TX_DS or MAX_RT interrupt flag<br />
RX_Mode();<br />
}<br />
<br />
}<br />
<br />
<br />
}</p>
<p>}</p>
<p><br />
</p> |
|