nRF2401三点通信设计(9)

2020-02-21 13:37

沈阳航空航天大学电子信息工程学院毕业设计(论文)

i = 0;

for(i=0; i

j = 250; while(--j); j = 250; while(--j); } } /**

*函数:SPI_RW()

*描述:根据SPI协议,写一字节数据到nRF2401,同时从nRF2401读出一字节 *参数:byte *返回值:byte */

uchar SPI_RW(uchar byte) { uchar i;

for(i=0; i<8; i++) // 循环8次 { MOSI = (byte & 0x80); // byte最高位输出到MOSI byte <<= 1; // 低一位移位到最高位 SCK = 1; // 拉高SCK,nRF24L01从MOSI读入1位数据,同时从MISO输出1位数据 byte |= MISO; // 读MISO到byte最低位 SCK = 0; // SCK置低 }

return(byte); // 返回读出的一字节 } /**

*函数:SPI_RW_Reg()

*描述:写数据value到reg寄存器 * 参数:reg,value *返回值:static */

uchar SPI_RW_Reg(uchar reg, uchar value) { uchar status;

CSN = 0; // CSN置低,开始传输数据 status = SPI_RW(reg); // 选择寄存器,同时返回状态字 SPI_RW(value); // 然后写数据到该寄存器 CSN = 1; // CSN拉高,结束数据传输 return(status); // 返回状态寄存器 } /**

*函数:SPI_Write_Buf()

*描述:把pBuf缓存中的数据写入到nRF2401,通常用来写入发射通道数据或接收/发送地址 *参数:reg,*pBuf,bytes *返回值:static

- 41 -

沈阳航空航天大学电子信息工程学院毕业设计(论文)

*/

uchar SPI_Write_Buf(uchar reg, uchar * pBuf, uchar bytes) { uchar status, i;

CSN = 0; // CSN置低,开始传输数据 status = SPI_RW(reg); // 选择寄存器,同时返回状态字 for(i=0; i

*函数:TX_Send_One_Mode()

*描述:这个函数设置nRF24L01为发送模式,(CE=1持续至少10us),130us后启动发射,数

据发送结束后,发送模块自动转入接收模式等待应答信号。

*参数:*BUF *返回值:空 */

void TX_Send_One_Mode(uchar * BUF) { CE = 0;

SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 写入发送地址

SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 为了应答接收设备,接收通道0地址和发送地址相同

SPI_Write_Buf(WR_TX_PLOAD, BUF, TX_PLOAD_WIDTH); // 写数据包到TX FIFO

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, 0x0a); // 自动重发延时等待250us+86us,自动重发10次

SPI_RW_Reg(WRITE_REG + RF_CH, 40); // 选择射频通道0x40

SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); // 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益

SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // CRC使能,16位CRC校验,上电 CE = 1; } /**

*函数:TX_Send_Two_Mode()

*描述:这个函数设置nRF24L01为发送模式,(CE=1持续至少10us),130us后启动发射,数

据发送结束后,发送模块自动转入接收模式等待应答信号

*参数:*BUF *返回值:空 */

void TX_Send_Two_Mode(uchar * BUF) { CE = 0;

SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS2, TX_ADR_WIDTH); // 写入

- 42 -

沈阳航空航天大学电子信息工程学院毕业设计(论文)

发送地址

SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS2, TX_ADR_WIDTH); // 为了应答接收设备,接收通道0地址和

// 发送地址相同

SPI_Write_Buf(WR_TX_PLOAD, BUF, TX_PLOAD_WIDTH); // 写数据包到TX FIFO

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, 0x0a); // 自动重发延时等待250us+86us,自动重发10次

SPI_RW_Reg(WRITE_REG + RF_CH, 40); // 选择射频通道0x40

SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); // 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益

SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // CRC使能,16位CRC校验,上电 CE = 1; } /**

*函数:Check_ACK()

*描述:检查接收设备有无接收到数据包,设定没有收到应答信号是否重发 发送特有。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 *参数:clear

*返回值:是否接到数据 */

uchar Check_ACK(bit clear) { while(IRQ); sta = SPI_RW(NOP); // 返回状态寄存器 if(MAX_RT) if(clear) // 是否清除TX FIFO,没有清除在复位MAX_RT中断标志后重发 SPI_RW(FLUSH_TX); SPI_RW_Reg(WRITE_REG + STATUS, sta); // 清除TX_DS或MAX_RT中断标志 IRQ = 1; if(TX_DS) return(0x00); else return(0xff); } /**

*函数:CheckButtonsOne()

*描述:检查按键是否按下,按下则发送一字节数据 发送特有。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 *参数:空 *返回值:空 */

void CheckButtonsOne() {

- 43 -

沈阳航空航天大学电子信息工程学院毕业设计(论文)

TX_BUF[0] = ~DATA; // 数据送到缓存 TX_Send_One_Mode(TX_BUF); // 把nRF24L01设置为发送模式并发送数据,发送模式的寄存器配置 LED = ~DATA; // 数据送到LED显示 delay_ms(100); Check_ACK(1); // 等待发送完毕,清除TX FIFO delay_ms(250); delay_ms(250); LED = 0xff; // 关闭LED while(!(P3 & 0x01)); DATA = 0x00; if(!DATA) { DATA = 0x01; } } /**

*函数:CheckButtonsTwo()

*描述:检查按键是否按下,按下则发送一字节数据 发送特有。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 *参数:空 *返回值:空 */

void CheckButtonsTwo() { TX_BUF[0] = ~DATA2; // 数据送到缓存 TX_Send_Two_Mode(TX_BUF); // 把nRF24L01设置为发送模式并发送数据,发送模式的寄存器配置 LED = ~DATA2; // 数据送到LED显示 delay_ms(100); Check_ACK(1); // 等待发送完毕,清除TX FIFO delay_ms(250); delay_ms(250); LED = 0xff; // 关闭LED while(!(P3 & 0x01)); DATA2 = 0x00; if(!DATA2) { DATA2 = 0x02; } } /**

*函数:main() *描述:主函数 *参数:空 *返回值:空 */

void main(void) {

init_io(); // 初始化IO

- 44 -

沈阳航空航天大学电子信息工程学院毕业设计(论文)

P3 |= 0x00;

if(!(P3 & 0x01)) { delay_ms(20); if(!(P3 & 0x01)) { while(1) {

if(while_flag == 0) { CheckButtonsOne(); //receive_information(); //接收信号 while_flag = 1; } else if(while_flag == 1) { while_flag = 0; }

break; } } }

else if(!(P3 & 0x02)) { delay_ms(20); if(!(P3 & 0x02)) { while(1) {

if(while_flag == 0) { CheckButtonsTwo(); //receive_information(); //接收信号 while_flag = 1; } else if(while_flag == 1) { while_flag = 0; } break; } } }

接收端

/**

*描述:nRF2401发送端发送数据 *作者:丁豫 *版本:1.0 */

#ifndef _API_DEF_

- 45 -


nRF2401三点通信设计(9).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:小学数学二年级下册练习题暑假日日练(每日20道口算、5道笔算、

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: