- /*************************************************************
- **函数名: SPI_NRF_MOD_RX()
- **描述 : 配置NRF进入 发送模式
- **参数 :
- **返回值:
- **注意 : 仅用于测试 无参无返 可改成带配置参数的模块函数
- RX通道0 地址TX_ADDR=0xB3B4B5B605
- ************************************************************/
- void SPI_NRF_MOD_RX(void)
- {
- u8 TX_Array[5];
- u8 _TX_RX_ADDR_[5]={0xB3,0xB4,0xB5,0xB6,0x05};
-
- SPI1_CE_LOW();//CE=0 待机模式
- TX_Array[0]=0x03;//允许接收通道0000 0011
- SPI_NRF_Write(SPI1,W_REGISTER+EN_RXADDR,TX_Array,1);
- TX_Array[0]=0x03;//设置地址宽度 11--5字节 10--4字节 01-3字节 00--不合法
- SPI_NRF_Write(SPI1,W_REGISTER+SETUP_AW,TX_Array,1);
- TX_Array[0]=0x20;//射频通道 X000 0010
- SPI_NRF_Write(SPI1,W_REGISTER+RF_CH,TX_Array,1);
- TX_Array[0]=0x0f;//射频参数寄存器 0000 1111 2Mbps 发射功率 00-18dBm 01-12dBm 10-6dBm 11-0dBm 1--低噪声放大器增益
- SPI_NRF_Write(SPI1,W_REGISTER+RF_SETUP,TX_Array,1);
- TX_Array[0]=0x3f;//xx11 1111 0-5通道允许自动应答
- SPI_NRF_Write(SPI1,W_REGISTER+EN_AA,TX_Array,1);
- TX_Array[0]=0x04;//xx11 1111 数据通道0 有效数据宽度 (1-32)字节
- SPI_NRF_Write(SPI1,W_REGISTER+RX_PW_P0,TX_Array,1);
- TX_Array[0]=0xfe;//1111 xxxx STATUS寄存器 写‘1’清除所有标志
- SPI_NRF_Write(SPI1,W_REGISTER+STATUS,TX_Array,1);
-
- SPI_NRF_Write(SPI1,W_REGISTER+TX_ADDR,_TX_RX_ADDR_,5);//写入接收发送数据的地址,这个地址是接收端收件的凭证
- SPI_NRF_Write(SPI1,W_REGISTER+RX_ADDR_P0,_TX_RX_ADDR_,5);//写入接收发送数据的地址,这个地址是接收端收件的凭证
-
-
-
- TX_Array[0]=0x0f;//接收模式 PRIM_RX=1 PWR_UP=1 允许接收终端
- SPI_NRF_Write(SPI1,W_REGISTER+CONFIG,TX_Array,1);
-
- SPI1_CE_HIGH();//CE=1 使能发射模式
- Delay_us(100);//CE拉高需要一定的延时才能进行发送 延时之后 即可通过SPI接口发送TX_PLD
- //轮询中断24L01中断的到来 NRF_Read_IRQ()
- }
下面是两种模式的测试- /*************************************************************
- **函数名: SPI_NRF_TX_DATAS()
- **描述 : 配置NRF发送 数据
- **参数 : TBuff[ByteNUM] ByteNUM
- **返回值: ErrorStatus
- **注意 :
- ************************************************************/
- ErrorStatus SPI_NRF_TX_DATAS(u8* TBuff,u8 ByteNUM)
- {
- u8 Status[1];
- do{
- SPI1_CE_LOW();//拉低待机
- SPI_NRF_Write(SPI1,W_TX_PAYLOAD,TBuff,ByteNUM);//发送TBuff数组
- SPI1_CE_HIGH();//拉低待机
- }while(NRF_Read_IRQ()!=0);//中断产生时,IRQ引脚低电平
- SPI_NRF_Write(SPI1, FLUSH_TX,TBuff,0);
- SPI1_CE_LOW();//拉低待机
- Delay_us(100);
- SPI_NRF_Read(SPI1,R_REGISTER+STATUS,Status,1);//读取Status
- LCD_Num_6x12_O(200,20,Status[0], WHITE);
- if(Status[0]&0x10)
- {
- Status[0]&=0x10;
- SPI_NRF_Write(SPI1,W_REGISTER+STATUS,Status,1);//
- LCD_Str_6x12_O_P(220 , 10 ,"Tx Error!", WHITE);//重发超时 发送失败
- return ERROR;
- }
- else
- {
- Status[0]&=0x20;
- SPI_NRF_Write(SPI1,W_REGISTER+STATUS,Status,1);//
- LCD_Str_6x12_O_P(240 , 10 ,"Tx Success", WHITE);//发送成功
- return SUCCESS;
- }
- }
- /*************************************************************
- **函数名: SPI_NRF_RX_DATAS()
- **描述 : 配置NRF发送 数据
- **参数 : RBuff[ByteNUM] ByteNUM
- **返回值: ErrorStatus
- **注意 :
- ************************************************************/
- ErrorStatus SPI_NRF_RX_DATAS(u8* RBuff)
- {
- ErrorStatus RX_Status=SUCCESS;
- u8 Status[1];
- while(NRF_Read_IRQ()!=0);//中断产生时,IRQ引脚低电平
- SPI1_CE_LOW();//拉低待机,才能操作寄存器
- Delay_us(100);
- SPI_NRF_Read(SPI1,R_REGISTER+STATUS,Status,1);//读取Status
- switch(Status[0]&0x0e)
- {
- case 0x0e: RX_Status=ERROR; break; //RX_FIFO 空
- default :LCD_Str_6x12_O_P(200 , 10 ,"Rx Success!", WHITE);//RX_FIFO非空
- break;
- /*
- case 0x00: break; //通道0
- case 0x02: break; //通道1
- case 0x04: break; //通道2
- case 0x06: break; //通道3
- case 0x08: break; //通道4
- case 0x0A: break; //通道5*/
- }
-
- SPI_NRF_Read(SPI1,R_RX_PAYLOAD,RBuff,4);//读RX_FIFO
- SPI_NRF_Write(SPI1,W_REGISTER+STATUS,Status,1);//处理状态寄存器标志
- return RX_Status;
- }
-
特别要注意的是在发射模式的时候,应该先拉低CE,先在TX FIFO里写入要发射的数据,再拉高CE真正发射。