24L01+带数据包的ACK-用于双向传输_第1页
24L01+带数据包的ACK-用于双向传输_第2页
24L01+带数据包的ACK-用于双向传输_第3页
24L01+带数据包的ACK-用于双向传输_第4页
24L01+带数据包的ACK-用于双向传输_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

发现网上关于 24L01 带数据包的 ACK 介绍的比较少 自己之前做四轴的时候想说用 24L01 做双向通讯 但是对于频繁切换发送 接收模式很是麻烦 时间调的不好很容易造 成通讯失败 后来想到 24L01 的带数据包的 ACK 做双向通讯 在网上找了资料 但是就只 做了简单介绍 没有介绍用的时候是怎么实现 下面我就对我使用的过程做一个总结 在 附上测试程序 C51 本人热衷于使用 STC 单片机做东西 四轴也是用 STC 单片机来做的 控制板 飞的也还行 对于初学者来讲 STC 单片机的程序看起来也比较容易看得懂 对 于双向传输 我看过 STM32 的程序 想要移植到 51 上 但是对于发送接收部分没有详细 的注释 所以刚开始也是一头雾水 找半天都找不到什么时候吧带数据的 ACK 包送入缓存 所以也就放弃了 但是我觉得初始化部分写的比较好 所以也就移植了部分程序 好了不 多说 下面开始将原理 带数据包的 ACK 应答传输 有的人说只能用在 24L01 上 没有 的用不了 然而我刚 好只有带 的 没带 的用不用的了这个我就不知道了 但是我看过没带 的芯片手册 并没 有看到有关带数据包的 ACK 的介绍 然后又看了带 的芯片手册 在带 的手册上发现有相 关带数据包的 ACK 的介绍 所以我也认为 ACK 要能带数据包 只能用在有 的芯片上 利用这个 ACK 做数据传输 首先要配置正确 对于配置 你们网上找找 也能找到 我也在这里直接复制粘贴别人的说法 1 需要设置成为可变长度的接收与发送 2 需要将接收数据的 ACK 使能 3 由于 ACK 带有数据因此自动重发的时间要改成 500 S 4 将数据写入等待发送使用的是 W ACK PAYLOAD 命令 作为接收模式 若要让 ACK 带上数据包 那就得在接收到数据之前 把数据包送到 ACK 发送缓存 将数据写入 W ACK PAYLOAD 这个地址里面 详细介绍如下 从这里可以看出 W ACK PAYLOAD 的地址为 0 xA8 0 xAD 用哪个地址由你喜欢 缓存 字节数为 32 字节 所以 初始化为接收模式之后 就先装载 ACK 包 然后在进入接收循环 每当接收到 发送端发送过来的数据 读取数据完毕 马上把 ACK 数据包再写进去 不写的话发送端就 接收不到带数据包的 ACK 作为发送端 在发送完数据之后立马就读取到 ACK 数据包了 我刚开始用的时候也是 犯傻 怎么把 ACK 里面的数据提取出来 想了半天 后来也是灵光一现 想着 手册上说 通道 0 是接收应答信号的 那收到的 ACK 数据包读取方式应该跟一般接收到的数据读取方 式是一样的 所以我就尝试了一下 果然成了 能接收到数据了 废话不多说 我文采不 好 不想打这么多字了 下面直接附上程序 以下是 h 文件 ifndef NRF24L01 H define NRF24L01 H define uchar unsigned char define uint unsigned int 1 GND 2 Vcc 3 CE 4CSN 5 SCK 6 MOSI 7 MISO 8 IRQ sbit CE P7 3 Chip Enable pin signal output sbit CSN P7 2 Slave Select pin output to CSN nRF24L01 sbit SCK P7 1 Interrupt signal from nRF24L01 input sbit MOSI P7 0 Master In Slave Out pin input sbit MISO P3 7 Serial Clock pin output sbit IRQ P3 6 Master Out Slave In pin output sbit CE P0 4 Chip Enable pin signal output sbit CSN P0 3 Slave Select pin output to CSN nRF24L01 sbit SCK P0 2 Interrupt signal from nRF24L01 input sbit MOSI P0 1 Master In Slave Out pin input sbit MISO P0 0 Serial Clock pin output sbit IRQ P4 6 Master Out Slave In pin output SPI nRF24L01 commands define READ REG 0 x00 读寄存器指令 define WRITE REG 0 x20 写寄存器指令 define R RX PL WID 0 x60 读接收到的数据长度 define RD RX PLOAD 0 x61 读接收数据指令 define WR TX PLOAD 0 xA0 写待发送数据指令 define W ACK PAYLOAD0 xA8 写 ACK 数据指令 用于接收模式 define FLUSH TX 0 xE1 冲洗发送 FIFO 指令 define FLUSH RX 0 xE2 冲洗接收 FIFO 指令 define REUSE TX PL 0 xE3 重复装载数据指令 define NOP 0 xFF 空指令 用于读出状态字 寄存器地址 define CONFIG 0 x00 配置寄存器 define EN AA 0 x01 自动应答 禁止自动应答后可以与 2401 通讯 define EN RXADDR 0 x02 接收地址允许 define SETUP AW 0 x03 设置地址宽度 define SETUP RETR 0 x04 自动重发 define RF CH 0 x05 射频通道 define RF SETUP 0 x06 射频寄存器 define STATUS 0 x07 状态寄存器 define OBSERVE TX 0 x08 发送检测寄存器 define CD 0 x09 地址检查 define RX ADDR P0 0 x0A 数据通道 0 接收地址 最大长度 5 个字节 先写低字节 所有字节数量由 SETUP AW 设定 define RX ADDR P1 0 x0B 数据通道 1 接收地址 最大长度 5 个字节 先写低字节 所有字节数量由 SETUP AW 设定 define RX ADDR P2 0 x0C 数据通道 2 接收地址 最低字节可设定 高字节部分必 须与 RX ADDR P1 39 8 相等 define RX ADDR P3 0 x0D 数据通道 3 接收地址 最低字节可设定 高字节部分 必须与 RX ADDR P1 39 8 相等 define RX ADDR P4 0 x0E 数据通道 4 接收地址 最低字节可设定 高字节部分必 须与 RX ADDR P1 39 8 相等 define RX ADDR P5 0 x0F 数据通道 5 接收地址 最低字节可设定 高字节部分必 须与 RX ADDR P1 39 8 相等 define TX ADDR 0 x10 发送地址 define RX PW P0 0 x11 通道 0 接收数据长度 define RX PW P1 0 x12 通道 1 接收数据长度 define RX PW P2 0 x13 通道 2 接收数据长度 define RX PW P3 0 x14 通道 3 接收数据长度 define RX PW P4 0 x15 通道 4 接收数据长度 define RX PW P5 0 x16 通道 5 接收数据长度 define FIFO STATUS 0 x17 FIFO 状态寄存器 define DYNPD 0 x1C define FEATURE0 x1D define Mode RX1 1 普通接收模式 define Mode TX1 2 普通发送模式 define Mode RX2 3 双向传输接收模式 define Mode TX2 4 双向传输发送模式 define TX ADR WIDTH 5 5 字节宽度的发送地址 define RX ADR WIDTH 5 5 字节宽度的接收地址 define TX PLOAD WIDTH 32 数据通道有效数据宽度 define RX PLOAD WIDTH 32 数据通道有效数据宽度 extern uchar code TX ADDRESS TX ADR WIDTH extern uchar code RX ADDRESS RX ADR WIDTH extern uchar RX BUF TX PLOAD WIDTH 接收缓存 extern uchar TX BUF TX PLOAD WIDTH 发送缓存 extern uchar RX flag 接收标志 extern uchar Length 数据长度 void Init 24L01 Byte ModeDat Byte ch 初始化 24L01 void Delay12us uchar SPI RW uchar byte SPI 读写函数 uchar SPI Write Reg uchar reg uchar value uchar SPI Read uchar reg uchar SPI Read Buf uchar reg uchar pBuf uchar bytes uchar SPI Write Buf uchar reg uchar pBuf uchar bytes void NRF TX uchar pBuf uchar Len 发送数据包 用于发送模式 2 4 void NRF TX AP uchar pBuf uchar Len 发送数据包 接收模式 2 uchar Check ACK bit clear void Read 24L01 data void endif 以下是 c 文件 include include nrf24l01 h include include uart1 h uchar bdata sta sbit RX DR sta 6 sbit TX DS sta 5 sbit MAX RT sta 4 uchar code TX ADDRESS TX ADR WIDTH 0 x13 0 x14 0 x52 0 x05 0 x20 定义一个静 态发送地址 uchar code RX ADDRESS RX ADR WIDTH 0 x13 0 x14 0 x52 0 x05 0 x20 定义一个静 态发送地址 uchar RX BUF TX PLOAD WIDTH 接收缓存 uchar TX BUF TX PLOAD WIDTH 发送缓存 uchar RX flag 接收标志 uchar Length 数据长度 函数 init io 描述 初始化 IO void Init 24L01 Byte ModeDat Byte ch CE 0 待机 CSN 1 SPI 禁止 SCK 0 SPI 时钟置低 IRQ 1 中断复位 Delay12us CE 0 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 为了 应答接收设备 接收通道 0 地址和发送地址相同 SPI Write Reg WRITE REG EN AA 0 x01 使能接收通道 0 自动应答 SPI Write Reg WRITE REG EN RXADDR 0 x01 使能接收通道 0 SPI Write Reg WRITE REG SETUP RETR 0 x1a 自动重发延时等待 500us 自 动重发 10 次 SPI Write Reg WRITE REG RF CH ch 选择射频通道 ch SPI Write Reg WRITE REG RF SETUP 0 x0f 数据传输率 1Mbps 发射功率 0dBm 低噪声放大器增益 switch ModeDat case 1 SPI Write Reg WRITE REG RX PW P0 RX PLOAD WIDTH 接 收通道 0 选择和发送通道相同有效数据宽度 SPI Write Reg WRITE REG CONFIG 0 x0f break case 2 SPI Write Reg WRITE REG RX PW P0 RX PLOAD WIDTH SPI Write Reg WRITE REG CONFIG 0 x0e break case 3 SPI Write Reg FLUSH TX 0 xff SPI Write Reg FLUSH RX 0 xff SPI Write Reg WRITE REG CONFIG 0 x0f IRQ 收发完成中断开启 16 位 CRC 主接收 SPI RW 0 x50 SPI RW 0 x73 SPI Write Reg WRITE REG DYNPD 0 x01 SPI Write Reg WRITE REG FEATURE 0 x06 break case 4 SPI Write Reg WRITE REG CONFIG 0 x0e IRQ 收发完成 中断开启 16 位 CRC 主发送 SPI Write Reg FLUSH TX 0 xff SPI Write Reg FLUSH RX 0 xff SPI RW 0 x50 SPI RW 0 x73 SPI Write Reg WRITE REG DYNPD 0 x01 SPI Write Reg WRITE REG FEATURE 0 x06 break default break CE 1 函数 delay ms 描述 延迟 x 毫秒 void Delay12us 18 432MHz unsigned char i nop nop nop i 52 while i 函数 SPI RW 描述 根据 SPI 协议 写一字节数据到 nRF24L01 同时从 nRF24L01 读出一字节 uchar SPI RW uchar byte uchar i for i 0 i 8 i 循环 8 次 MOSI byte 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 寄存器 uchar SPI Write Reg uchar reg uchar value uchar status CSN 0 CSN 置低 开始传输数据 status SPI RW reg 选择寄存器 同时返回状态字 SPI RW value 然后写数据到该寄存器 CSN 1 CSN 拉高 结束数据传输 return status 返回状态寄存器 函数 SPI Read 描述 从 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 Read Buf 描述 从 reg 寄存器读出 bytes 个字节 通常用来读取接收通道 数据或接收 发送地址 uchar SPI Read Buf uchar reg uchar pBuf uchar bytes uchar status i CSN 0 CSN 置低 开始传输数据 status SPI RW reg 选择寄存器 同时返回状态字 for i 0 i bytes i pBuf i SPI RW 0 逐个字节从 nRF24L01 读出 CSN 1 CSN 拉高 结束数据传输 return status 返回状态寄存器 函数 SPI Write Buf 描述 把 pBuf 缓存中的数据写入到 nRF24L01 通常用来写入发 射通道数据或接收 发送地址 uchar SPI Write Buf uchar reg uchar pBuf uchar bytes uchar status i CSN 0 CSN 置低 开始传输数据 status SPI RW reg 选择寄存器 同时返回状态字 for i 0 i bytes i SPI RW pBuf i 逐个字节写入 nRF24L01 CSN 1 CSN 拉高 结束数据传输 return status 返回状态寄存器 void NRF TX uchar pBuf uchar Len 发送数据包 用于发送模式 2 4 CE 0 SPI Write Buf WRITE REG RX ADDR P0 TX ADDRESS TX ADR WIDTH 装载接 收端地址 SPI Write Buf WR TX PLOAD pBuf Len 装载数据 CE 1 Delay12us void NRF TX AP uchar pBuf uchar Len 发送数据包 接收模式 2 CE 0 SPI Write Buf W ACK PAYLOAD pBuf Len CE 1 判断寄存器状态是否有接收到数据或者发送完数据 void Read 24L01 data void while IRQ sta SPI Read READ REG STATUS 读状态寄存器 if RX DR 判断是否接受到数据 Length SPI Read READ REG R RX PL WID if Length 33 SPI Read Buf RD RX PLOAD RX BUF Length 从 RX FIFO 读出数据 RX flag 1 将标志位置 1 表示接收到数据 好让主函数去处理接收 到的数据 else SPI Write Reg FLUSH RX 0 xff 清空缓冲区 if TX DS if MAX RT if sta SPI Write Reg WRITE REG STATUS sta 清除 RX DS 中断标志 以下是主函数 发送与接收模式用一样的 c h 文件 初始化为不同模式就行了 发送模式 include include include uart1 h include nrf24l01 h void Delayxms Word xms 18 432MHz Word j for xms 0 xms for j 1110 j 0 j Byte a void main Delayxms 10 延时 10ms 让器件稳定一下 Init all IO 初始化所有 IO 口为准双向模式 uart1 Init 初始化串口 Init 24L01 Mode TX2 40 初始化 24L01 为发送模式 2 通道 40 while 1 Length 30 发送数据长度为 30 字节 测试用的 你改多少都行 不要超 过 32 for a 0 a Length a TX BUF a a NRF TX TX BUF Length 发送

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论