资源预览内容
第1页 / 共19页
第2页 / 共19页
第3页 / 共19页
第4页 / 共19页
第5页 / 共19页
第6页 / 共19页
第7页 / 共19页
第8页 / 共19页
第9页 / 共19页
第10页 / 共19页
亲,该文档总共19页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
说实话,对于一个初次调试这个模块的同学,想要找一个直接可用的程序不好找,同时是找到的片 段程序很多又是木有注释的,我们(菜鸟)没有很好的理解芯片资料的能力,看着都是一头雾水。 在这儿,我贴出发送和接收两部分,希望可以让学习者轻松一点理解和掌握其操作流程。同时声明 一下,下面的程序不是我写的,但是99%的注释是我写的,对于掌握的人来说,不需要这样多的注 释,我是面对需要学习的人而写的。这样也算是我对电子技术给我的乐趣的回馈。在没有和程序作 者取得联系的情况下我修改一部分且直接贴上百度,希望见谅,我们都是希望这对大家的学习有所 帮助! 注释的位置需要调整一下哦 以下是发送端程序: #include #include #define MODE 0 /MODE=1时为发送代码MODE=0时为接收代码 typedef unsigned char uchar; /*IO 端口定义* sbit MISO = P23; sbit MOSI = P22; sbit SCK = P21; sbit CE = P25; sbit CSN = P20; sbit IRQ = P32; sbit led = P12; /* uchar bdata sta; /状态标志 sbit RX_DR = sta6; sbit TX_DS = sta5; sbit MAX_RT = sta4; /*NRF24L01* #define TX_ADR_WIDTH5 / 5 uints TX address width #define RX_ADR_WIDTH5 / 5 uints RX address width #define TX_PLOAD_WIDTH32 / 32 uints TX payload #define RX_PLOAD_WIDTH32 / 32 uints TX payload uchar const TX_ADDRESS TX_ADR_WIDTH = 0x34,0x43,0x10,0x10,0x01; /本地地址 uchar const RX_ADDRESS RX_ADR_WIDTH = 0x34,0x43,0x10,0x10,0x01; /接收地址 ucharcodeTx_BufTX_PLOAD_WIDTH= 0xff,0xee,0x11,0x22,0x33,0xaa,0xbb,0x11,0x22,0x33,0xaa,0xbb, 0x11,0x22,0x33,0xaa, 0xbb,0x11,0x22,0x33,0xaa,0xbb,0x11,0x22,0x33,0xaa,0xbb,0x11,0x22,0x33,0xee,0xff;/发 送数据 uchar Rx_BufRX_PLOAD_WIDTH;/接收数据 /*NRF24L01 寄存器指令* #define READ_REG0x00 / 读寄存器指令 #define WRITE_REG0x20 / 写寄存器指令 #define RD_RX_PLOAD0x61 / 读取接收数据指令 #define WR_TX_PLOAD0xA0 / 写待发数据指令 #define FLUSH_TX0xE1 / 冲洗发送FIFO指令 #define FLUSH_RX0xE2 / 冲洗接收FIFO指令 #define REUSE_TX_PL0xE3 / 定义重复装载数据指令 #define NOP0xFF / 保留 /*SPI(nRF24L01) 寄存器地址* #define CONFIG0x00 / 配置收发状态,CRC校验模式以及收发状态响应方式 #define EN_AA0x01 / 自动应答功能设置 #define EN_RXADDR0x02 / 可用信道设置 #define SETUP_AW0x03 / 收发地址宽度设置 #define SETUP_RETR0x04 / 自动重发功能设置 #define RF_CH0x05 / 工作频率设置 #define RF_SETUP0x06 / 发射速率、功耗功能设置 #define STATUS0x07 / 状态寄存器 #define OBSERVE_TX0x08 / 发送监测功能 #define CD0x09 / 地址检测 #define RX_ADDR_P00x0A / 频道0接收数据地址 #define RX_ADDR_P10x0B / 频道1接收数据地址 #define RX_ADDR_P20x0C / 频道2接收数据地址 #define RX_ADDR_P30x0D / 频道3接收数据地址 #define RX_ADDR_P40x0E / 频道4接收数据地址 #define RX_ADDR_P50x0F / 频道5接收数据地址 #define TX_ADDR0x10 / 发送地址寄存器 #define RX_PW_P00x11 / 接收频道0接收数据长度 #define RX_PW_P10x12 / 接收频道0接收数据长度 #define RX_PW_P20x13 / 接收频道0接收数据长度 #define RX_PW_P30x14 / 接收频道0接收数据长度 #define RX_PW_P40x15 / 接收频道0接收数据长度 #define RX_PW_P50x16 / 接收频道0接收数据长度 #define FIFO_STATUS0x17 / FIFO栈入栈出状态寄存器设置 /*延时函数 */ void Delay( unsigned int s )/长延时 unsigned int i,j; for( i = 0;i 1000; i+ )for( j = 0; j s; j+ ); void delay_ms( unsigned int x )/短延时 unsigned int i,j; i = 0; for( i = 0; i x; i+ ) j = 108; while( j- ); /*IO口模拟SPI总线代码 */ uchar SPI_RW( uchar byte )/SPI边发送边接收,这儿写法值得学习,减少形参 uchar bit_ctr; for( bit_ctr = 0; bit_ctr 8; bit_ctr+ ) MOSI = ( byte /取最高位发送 byte = ( byte 1 );/不断地填补到最高位 SCK = 1; byte |= MISO;/把接收到的数据一位一位的补充到byte中去,这样就不 需要多定义变量 /led=MISO;Delay(150); SCK = 0; return( byte );/byte就是从机的答复 /* 通 过 spi 通 讯 的 方 式 对 模 块 进 行 写 操 作 * uchar SPI_RW_Reg ( uchar reg, uchar value ) / 向寄存器REG写一个字节,同时返回状态字节, 这里关系到模块的操作, /你要给模块发送命令, 然后它回复你表示收到了指 令,然后执行你的指令 uchar status; CSN = 0; status = SPI_RW(reg);/ reg就是我们按照资料给模块的指令,SPI_RW(reg)的 return值就是模块的答复,也就是告诉单片机它现在的状态,它要干什么。 SPI_RW( value );/ value就是我们需要传输的内容,这里就是给它发送我们要 它发送东西的指令,接着我们就把要发送的东西给它。 CSN = 1; return( status );/之所以要return一个status, 是因为我们要知道模块有没有发送 了 /* 通 过 spi 通 讯 方 式 将 模 块 收 到 的 数 据 读 取 到 单 片 机 * uchar SPI_Read ( uchar reg )/这里的reg和上面的reg不一样,他们在不同的作用域,所以不 会有什么干扰,就是看起来会乱 uchar reg_val; CSN = 0; SPI_RW( reg ); reg_val = SPI_RW(0);/0是什么指令呢?到上面看一下,哦, ,原来是读寄存器 指令,返回来的自然是寄存器里面存下来已经接收到的值 CSN = 1; return( reg_val );/将模块接收到的值返回给单片机老大 /* 告 诉 模 块 写 信 人 和 收 信 人 的 地 址 的 函 数 * uchar SPI_Write_Buf( uchar reg, uchar *pBuf, uchar bytes ) uchar status,byte_ctr; CSN = 0; / Set CSN low, init SPI tranaction这不用说了,看时序图 status = SPI_RW( reg ); / Select register to write to and read status byte告诉模块 我准备发送东西 for( byte_ctr = 0; byte_ctr bytes; byte_ctr+ ) / then write all byte in buffer(*pBuf) 告诉模块我要发送东西 SPI_RW( *pBuf+ );/每发出去指针就后移一位,这写法值得学习 CSN = 1; / Set CSN high again这不用说了,看时序图 return( status ); / return nRF24L01 status byte看看模块的状态,知道它是否发送 了还是在偷懒 /*发 *送 *模 *式 *代 *码 */ void TX_Mode(void)/开始我也不习惯TX是发送的意思,总
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号