|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区
您需要 登录 才可以下载或查看,没有账号?立即注册
×
SPI_RW_Reg(WRITE_REG + EN_AA, 0x00); // 失能通道0自动应答 |
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00); // 失能接收通道0 |
SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00); // 失能自动重发 |
有了以上这三个配置,发送方的流程就变成了发送-触发 |
。这样就抛开了接收方,可以专心去调试发送,可是怎么样才知道发送是否成功呢,要用到另外两个寄存器,STATUS和FIFO_STATUS。 |
•配置寄存器使芯片工作于接收模式后拉高CE端至少130us |
然后在初始化配置寄存器的时候要和发送方保持一致,比较重要的是要失能自动应答,使能通道0接收: |
SPI_RW_Reg(WRITE_REG + EN_AA, 0x00); // 失能通道0自动应答 |
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 接收要使能接收通道0 |
这样就可以了,接收方就可以进入接收模式去接收数据了,这次的调试就会灵活一些,因为是接收数据,可以在接收方添加一个显示设备把数据直观的显示出来,去对照看是否正确,当然还可以使用和发送方一样的方法:观察STATUS和FIFO_STATUS的值,对照寄存器描述,接收正确时STATUS的值应该是0x40,对于FIFO_STATUS的情况就多了些,因为数据宽度的不同也会造成寄存器的值不一样,24L01最大支持32字节宽度,就是说一次通讯最多可以传输32个字节的数据,在这种情况下,接收成功读数据之前寄存器值应该为0x12,读数据之后就会变成0x11;如果数据宽度定义的小于32字节,那么接收成功读数据之前寄存器值应该为0x10,读数据之后就会变成0x11。这个看起来挺复杂,其实很清晰,大家可以试着分析下,对照数据手册分析每个位的状态就可以得到结果。 |
好了,到这里对nRF24L01的调试基本上就算通了,但是要明白这些只是调试方法,最终的产品如果不加上应答和重发的话那么数据的稳定性是很难保证的,所以在基本的通讯建立之后就要把发送的配置改为: |
SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 使能接收通道0自动应答 |
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 使能接收通道0 |
SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a); // 自动重发10次,间隔500us |
SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 失能通道0自动应答 |
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 接收要使能接收通道0 |
#include <intrins.h> |
typedef unsigned char uchar; |
typedef unsigned char uint; |
void inerDelay_us(unsigned char n) |
SCK=0; // Spi clock line init high |
SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 写本地地址 |
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址 |
SPI_RW_Reg(WRITE_REG + EN_AA, 0x00); // 频道0自动 ACK应答禁止 |
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 允许接收地址只有频道0,如果需要多频道可以参考Page21 如果 |
SPI_RW_Reg(WRITE_REG + RF_CH, 0); // 设置信道工作为2.4GHZ,收发必须一致 |
SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节 |
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //设置发射速率为2MHZ,发射功率为最大值0dB |
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // IRQ收发完成中断响应,16位CRC,发射模式 |
} //ps:波特率用设置么?IRQ用拉高么?不响应中断? |
for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit |
MOSI = (uuchar & 0x80); // output 'uchar', MSB to MOSI |
uuchar = (uuchar << 1); // shift next bit into MSB.. |
SCK = 1; // Set SCK high.. |
uuchar | = MISO; // capture current MISO bit |
SCK = 0; // ..then set SCK low again |
return(uuchar); // return read uchar |
uchar SPI_Read(uchar reg) |
CSN = 0; // CSN low, initialize SPI communication... |
SPI_RW(reg); // Select register to read from.. |
reg_val = SPI_RW(0); // ..then read registervalue |
CSN = 1; // CSN high, terminate SPI communication |
return(reg_val); // return register value |
uint SPI_RW_Reg(uchar reg, uchar value) |
CSN = 0; // CSN low, init SPI transaction |
status = SPI_RW(reg); // select register |
SPI_RW(value); // ..and write value to it.. |
CSN = 1; // CSN high again |
return(status); // return nRF24L01 status uchar |
uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars) |
for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++) // |
void nRF24L01_TxPacket(unsigned char * tx_buf) |
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址 |
SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); // 装载数据 |
// SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // IRQ收发完成中断响应,16位CRC,主发送 |
void inerDelay_us(unsigned char n) |
SCK=0; // Spi clock line init high |
SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 写本地地址 |
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址 |
SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 频道0自动 ACK应答允许禁止 |
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 允许接收地址只有频道0,如果需要多频道可以参考Page21 |
SPI_RW_Reg(WRITE_REG + RF_CH, 0); // 设置信道工作为2.4GHZ,收发必须一致 |
SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节 |
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //设置发射速率为1MHZ,发射功率为最大值0dB |
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // IRQ收发完成中断响应,16位CRC ,主接收 |
for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit |
MOSI = (uchar & 0x80); // output 'uchar', MSB to MOSI |
uchar = (uchar << 1); // shift next bit into MSB.. |
SCK = 1; // Set SCK high.. |
uchar | = MISO; // capture current MISO bit |
SCK = 0; // ..then set SCK low again |
return(uchar); // return read uchar |
uchar SPI_Read(uchar reg) |
CSN = 0; // CSN low, initialize SPI communication... |
SPI_RW(reg); // Select register to read from.. |
reg_val = SPI_RW(0); // ..then read registervalue |
CSN = 1; // CSN high, terminate SPI communication |
return(reg_val); // return register value |
uint SPI_RW_Reg(uchar reg, uchar value) |
CSN = 0; // CSN low, init SPI transaction |
status = SPI_RW(reg); // select register |
SPI_RW(value); // ..and write value to it.. |
CSN = 1; // CSN high again |
return(status); // return nRF24L01 status uchar |
uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars) |
CSN = 0; // Set CSN low, init SPI tranaction |
status = SPI_RW(reg); // Select register to write to and read status uchar |
for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++) |
pBuf[uchar_ctr] = SPI_RW(0); // |
return(status); // return nRF24L01 status uchar |
uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars) |
for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++) // |
// SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // IRQ收发完成中断响应,16位CRC ,主接收 |
unsigned char nRF24L01_RxPacket(unsigned char* rx_buf) |
sta=SPI_Read(STATUS); // 读取状态寄存其来判断数据接收状况 |
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer |
SPI_RW_Reg(WRITE_REG+STATUS,sta); //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志 |
//************************************串口初始化********************************************************* |
//************************************通过串口将接收到数据发送给PC端************************************** |
void R_S_Byte(uchar R_Byte) |
//************************************主函数************************************************************ |
if(nRF24L01_RxPacket(RxBuf)) |
);
//Delay(600);
}
}
}
} |
|