Nrf24L01发送程序.pdf
《Nrf24L01发送程序.pdf》由会员分享,可在线阅读,更多相关《Nrf24L01发送程序.pdf(15页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 /*头文件:NRF24L01.h*文件名:NRF24L01.c*创建人:动车组*日期:2012-8-21 *功能描述:用 NRF24L01 发送一定字节数的数据或者接收数据 *占用资源:四位控制 SPI 总线的 IO 线和 1 位 NRF24L01 模式控制引脚 *占用一个中段*/#includenrf24l01.h uchar code TX_ADDRESSTX_ADR_WIDTH=0 x34,0 x43,0 x10,0 x10,0 x01;/本地地址 uchar code RX_ADDRESS_0RX_ADR_WIDTH=0 x34,0 x43,0 x10,0 x10,0 x01;/为了
2、应答 接收设备,接收通道 0 地址和发送地址相同/uchar code RX_ADDRESS_1RX_ADR_WIDTH=0 x34,0 x43,0 x10,0 x10,0 x01;/接收通 道 1 地址/通道 1-5 最有最低字节不一样 /uchar code RX_ADDRESS_2RX_ADR_WIDTH=0 x34,0 x43,0 x10,0 x10,0 x01;/接收通 道 2 地址/且写地址的时候是低字节先写/uchar code RX_ADDRESS_3RX_ADR_WIDTH=0 x34,0 x43,0 x10,0 x10,0 x01;/接收通 道 3 地址/uchar cod
3、e RX_ADDRESS_4RX_ADR_WIDTH=0 x34,0 x43,0 x10,0 x10,0 x01;/接收通 道 4 地址/uchar code RX_ADDRESS_5RX_ADR_WIDTH=0 x34,0 x43,0 x10,0 x10,0 x01;/接收通 道 5 地址 bit RX_OK=0;/接收数据完成标志,在中断中置位 bit TX_OK=1;/数据发送完毕标志,在中断置位 由于第一次要可以发送 所以 初值为 1 bit MAX_RT_OK=0;/发送次数超过设置的次数的标志 在中断置位 uchar bdata sta=0 x00;/状态标志 sbit RX_DR
4、=sta6;sbit TX_DS=sta5;sbit MAX_RT=sta4;/*以下是 SPI 的读写函数 */*/*函数:uchar SPI_RW(uchar date)/*功能:SPI 一个字节写时序/*/uchar SPI_RW(uchar byte)uchar i;SCK=0;for(i=0;i8;i+)/循环 8 次 MOSI=(byte&0 x80);/byte 最高位输出到 MOSI byte=1;/低一位移位到最高位 SCK=1;/拉高 SCK,nRF24L01 从 MOSI 读入 1 位数 据,同时从 MISO 输出 1 位数据 byte|=MISO;/读 MISO 到 b
5、yte 最低位 SCK=0;/SCK 置低 return(byte);/返回读出的一字节 /*/*函数:uchar SPI_Read(uchar reg)/*功能:SPI 从 reg 中读出一个字节时序/*/uchar SPI_Read(uchar reg)uchar reg_val;CSN=0;/CSN 置低,开始传输数据 SPI_RW(reg);/选择寄存器 reg_val=SPI_RW(0);/然后从该寄存器读数据 CSN=1;/CSN 拉高,结束数据传输 return(reg_val);/返回寄存器数据 /*/*功能:SPI 在 reg 中写入数据 value 函数/*/void SP
6、I_RW_Reg(uchar reg,uchar value)CSN=0;/CSN 置低,开始传输数据 SPI_RW(reg);/选择寄存器,同时返回状态字 SPI_RW(value);/然后写数据到该寄存器 CSN=1;/CSN 拉高,结束数据传输 /*/*函数:uint SPI_Read_Buf(uchar reg,uchar*pBuf,uchar uchars)/*功能:用于 SPI 连读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数/*/void SPI_Read_Buf(uchar reg,uchar*pBuf,uchar bytes)uchar
7、 i;CSN=0;/CSN 置低,开始传输数据 SPI_RW(reg);/选择寄存器,同时返回状态字 for(i=0;ibytes;i+)pBufi=SPI_RW(0);/逐个字节从 nRF24L01 读出 CSN=1;/CSN 拉高,结束数据传输 /*/*函数:uchar SPI_Write_Buf(uchar reg,uchar*pBuf,uchar uchars)/*功能:用于 SPI 连写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入 数据的个数/*/void SPI_Write_Buf(uchar reg,uchar*pBuf,uchar bytes)uchar
8、i;CSN=0;/CSN 置低,开始传输数据 SPI_RW(reg);/选择寄存器,同时返回状态字 for(i=0;ibytes;i+)SPI_RW(pBufi);/逐个字节写入 nRF24L01 CSN=1;/CSN 拉高,结束数据传输 /*以下是 nrf24l01 的应用层函数 */void nrf_delay()uint a=130*10;while(a-);/*NRF24L01 初始化/*/void init_NRF24L01(void)CE=0;/待机/SPI_RW_Reg(WRITE_REG+CONFIG,0 x0f);/配置寄存器 设置为接收模式 SPI_RW_Reg(WRITE
9、_REG+EN_AA,0 x01);/通道 0 自动 ACK 应 答 允 许 0 x01 SPI_RW_Reg(WRITE_REG+EN_RXADDR,0 x01);/允许接收地址只有通道 0,如果需要多频道可以参考 Page21 0 x01 /SPI_RW_Reg(WRITE_REG+SETUP_AW,0 x03);/收发地址宽度设置为 5 个字节 SPI_RW_Reg(WRITE_REG+SETUP_RETR,0 x0a);/等待 250+86us 重发 10 次 SPI_RW_Reg(WRITE_REG+RF_CH,0);/设置信道工作为 2.4GHZ,收发必须一致 SPI_RW_Reg
10、(WRITE_REG+RF_SETUP,0 x07);/设置发射速率为 1MHZ,发射 功率为最大值 0dB SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,RX_ADDRESS_0,RX_ADR_WIDTH);/为了应答接收设备,接收通道 0 地址和发送地址相同 SPI_Write_Buf(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);/写本地发送地址 SPI_RW_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);/设置接收数据长度,本次设置为 32 字节 EX1=1;/开外部中断 1 IT1=1;/
11、下降沿触发 EA=1;/开总中断 /*/*设置模式:b 为 0 时是发送模式 为 1 时是接收模式*/*/void Set_Mode(char b)CE=0;SPI_RW_Reg(WRITE_REG+CONFIG,0 x0e+b);/IRQ 收发完 成中断响应,16 位 CRC,主接收 CE=1;/模式转换要等待 130Us nrf_delay();/*/*函数:bit nRF24L01_TxPacket(unsigned char*tx_buf)/*功能:发送 tx_buf 中数据 返回 1 数据发送 /*/bit nRF24L01_TxPacket(uchar*tx_buf)bit val
12、=0;if(TX_OK)TX_OK=0;CE=0;/StandBy I 模式 SPI_RW_Reg(WRITE_REG+STATUS,sta);/发送完数据后 RX_DR,TX_DS,MAX_PT 都置高为 1,通过写 1 来清楚中断标志/CSN=0;/CSN 置低,开始传输数据/SPI_RW(FLUSH_TX);/数据成功发送到了接收端,此时状态寄存器的 TX_DS 位置 高并把数据从 TX FIFO 中清除掉 /所以这里就不要再清除 TX FIFO 了/CSN=1;/CSN 置低,开始传输数据 SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH)
13、;/装载 数据 SPI_RW_Reg(WRITE_REG+CONFIG,0 x0e);/IRQ 收发完成中断响应,16 位 CRC,主发送 CE=1;/置高 CE,激发数据发送 val=1;else if(MAX_RT_OK)MAX_RT_OK=0;SPI_RW_Reg(WRITE_REG+STATUS,sta);/发送完数据后 RX_DR,TX_DS,MAX_PT 都置高为 1,通过写 1 来清楚中断标志 CSN=0;/CSN 置低,开始传输数据 SPI_RW(FLUSH_TX);/MAX_RT 位置高,不清除 TX FIFO 中的数据 所以这里要 清除 TX FIFO CSN=1;TX_O
14、K=1;return val;/*/*函数:bit nRF24L01_RxPacket(uchar*rx_buf)/*功能:数据读取后放如 rx_buf 接收缓冲区中/*/bit nRF24L01_RxPacket(uchar*rx_buf)bit revale=0;if(RX_OK)/判断是否接收到数据 RX_OK=0;/接收数据标志清零 CE=0;/SPI 使能 SPI_Read_Buf(RD_RX_PLOAD,rx_buf,RX_PLOAD_WIDTH);/read receive payload from RX_FIFO buffer SPI_RW_Reg(WRITE_REG+STAT
15、US,sta);/接收到数据后RX_DR,TX_DS,MAX_PT 都置高为 1,通过写 1 来清楚中断标志 CSN=0;/CSN 置低,开始传输数据 SPI_RW(FLUSH_RX);/用于清空 FIFO!CSN=1;/CSN 置低,开始传输数据 revale=1;/读取数据完成标志 Set_Mode(1);/重新设置为接收模式 return revale;/*NRF24L01 IRQ 引脚产生的中断函数*/void Int_1()interrupt 2 sta=SPI_Read(STATUS);/读取状态寄存其来判断数据接收状况 if(RX_DR)/接收到数据了 RX_OK=1;if(TX
16、_DS)/数据发送完毕 TX_OK=1;if(MAX_RT)MAX_RT_OK=1;/*/*文件名:NRF24L01.h*创建人:动车组*日期:2012-8-21 *功能描述:用 NRF24L01 发送一定字节数的数据或者接收数据 *占用资源:四位控制 SPI 总线的 IO 线和 1 位 NRF24L01 模式控制引脚 *占用一个中段*/#ifndef _NRF24L01_H_#define _NRF24L01_H_#include#define uint unsigned int#define uchar unsigned char/*SPI 引脚号*sbit MISO=P16;/7 主入从
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Nrf24L01 发送 程序
限制150内