51和stm32之间通过nrf24l01通信的一些总结

stm32的代码复杂些,而且某宝卖家给的代码写得有点乱而且注释有问题啊。。

吐槽完毕,还是要脑子清醒思路清晰才能高效完成工作发现问题分析问题解决问题

总结下睡觉。

1.地址、接收通道、通信频道什么的,反正收发模式设置要相同

2.数据宽度、地址宽度

3.关键一点:数值和字符!

      ASCII码表在线查询(1.0 beta 1)

  由于stm32上的与24l01有关的代码现在还是用的某宝卖家的,还没完全吃透。就这么说吧,其中的函数的参数是数字(不知道是不是这样表达的即表里的代码,另外c语言的变量不允许数字开头),而我发送的数据是字符串,发现问题花了一会儿,想办法解决又花了好一会儿。两边代码都不好改,参数如果是数组(指针)那真是传来传去如果要改都不知道改哪了,stm32的代码更是,想想其他的解决办法吧。

一个解决方法:step1.数值,字符嘛,查ascⅡ码表呗

       step2.见下面的4,用 if ,只把数组的第一个元素拿出来,转换成数字或者把数字变回去。

 

4.再来一个关键一点24l01发数据的时候不知道为什么,在把数据宽度设定为8字节后,接收方还是收到32字节的数据,而且前8位后那些会混杂好多数据。当传输数据为字符串数组时,如果只有一组数据,那后面的会混杂乱码,只要传输过程不丢帧什么的,每一次的乱码都一样;如果有多组数组,则会包含这一数组和下一数组的数据,也是每一次都一样。这是用串口看到的,即收到数据后存入rx_buf[],然后通过串口在电脑上显示。显示的应该就是收到的数据。

一个解决方法是用 if 来个判断,

if(!strcmp(RX_Buffer,"Forward "))
            {
                ES = 0;            
                for(i=0;i<8;i++)
                {
                    SBUF = RX_Buffer[i];
                    RX_Buffer[i]=0;
                    while(!TI);
                    TI = 0;
                }
                ES = 1;
            }

 

因为前面8字节在不丢帧的情况下是正确的,那就在 if 里面用 strcmp 比较一下,如果和预期的相同再进行下一步处理。这样就能控制在串口助手上显示8字节的数据,也就可以作为舍弃多余数据的条件。

另外当把数据宽度调整到32字节时,串口助手就能一次收到252字节的数据(可能是丢包了,看着应该像256=32*8 字节)。

这个问题先撂下了,如果有朋友知道请多指教:)

 

 

就到这吧,感觉有点乱。。以后再整理吧,这里只做个备忘。

现在只是验证性的完成了,即51和stm32之间能通过24l01通信了(控制点亮led),还要做好多事情呢。只是这么简单的整理完又花了不下40分钟,表达能力捉急。。睡觉

 

附:

参考这里

nrf24l01发送数据的步骤:

  0.CE清0,进入待机状态

  1.写本机身份地址到TX_ADDR

  2.写0通道接收地址到RX_ADDR_P0(与TX_ADDR一样)

  3.设置自动应答允许,EN_AA

  4.设置0通道允许接收,EN_RXADDR

  5.配置自动重发次数SETUP_RETR

  6.选择通信频道RF_CH

  7.配置发射参数(如发射功率,数据传输速率)RF_SETUP

  8.设置0通道有效数据宽度RX_PW_P0(就是要传送数据包的长度)

  9.设置模块配置寄存器CONFIG到发送模式

  10.将要传送的数据写入发送缓冲寄存器TX_FIFO

  11.将CE置1,进入发送状态,CE高电平至少维持10us

 

设置接收数据的步骤:

  0.CE=0,进入待机状态

  1.写发送机身份地址到0

  2.设置自动应答允许EN_AA

  3.设置允许0通道接收数据EN_RXADDR

  4.选择通信频道RF_CH

  5.选择0通道有效数据宽度RX_PW_P0

  6.配置发射参数(发射功率、传输速率等)RF_SETUP

  7.设置模块的配置寄存器CONFIG在接收模式

  9.CE=1,进入接收状态,高电平至少维持10us

 

 

 

转载于:https://www.cnblogs.com/Cmfvacks-IsLjj/p/3537728.html

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的示例代码,用于在STM32C8T6微控制器和NRF24L01无线通信模块之间进行基本的SPI通信。请注意,这只是一个示例代码,你需要根据你的具体需求进行适当的修改。 ```c #include "stm32f10x.h" #include "nrf24l01.h" // 定义NRF24L01引脚连接 #define NRF_CE_PIN GPIO_Pin_0 #define NRF_CE_PORT GPIOA #define NRF_CS_PIN GPIO_Pin_1 #define NRF_CS_PORT GPIOA // 定义SPI引脚连接 #define SPI_SCK_PIN GPIO_Pin_5 #define SPI_SCK_PORT GPIOA #define SPI_MISO_PIN GPIO_Pin_6 #define SPI_MISO_PORT GPIOA #define SPI_MOSI_PIN GPIO_Pin_7 #define SPI_MOSI_PORT GPIOA void SPI_Configuration(void) { SPI_InitTypeDef SPI_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; // 使能SPI时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); // 配置SPI引脚 GPIO_InitStructure.GPIO_Pin = SPI_SCK_PIN | SPI_MISO_PIN | SPI_MOSI_PIN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(SPI_SCK_PORT, &GPIO_InitStructure); // 配置SPI片选引脚 GPIO_InitStructure.GPIO_Pin = NRF_CS_PIN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(NRF_CS_PORT, &GPIO_InitStructure); // 配置SPI相关参数 SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(SPI1, &SPI_InitStructure); // 使能SPI SPI_Cmd(SPI1, ENABLE); } void NRF24L01_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; // 配置NRF24L01片选引脚 GPIO_InitStructure.GPIO_Pin = NRF_CE_PIN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(NRF_CE_PORT, &GPIO_InitStructure); // 默认禁用NRF24L01 GPIO_SetBits(NRF_CE_PORT, NRF_CE_PIN); } void NRF24L01_Init(void) { NRF24L01_Configuration(); SPI_Configuration(); // 初始化NRF24L01 NRF24L01_Init(SPI1, NRF_CS_PORT, NRF_CS_PIN, NRF_CE_PORT, NRF_CE_PIN); } int main(void) { // 初始化NRF24L01 NRF24L01_Init(); while (1) { // 进行数据发送或接收操作 // ... } } ``` 这只是一个基本的示例代码,用于初始化和配置STM32C8T6和NRF24L01之间的SPI通信。你需要根据你的具体需求进行进一步的开发和修改。你还需要根据你的硬件连接情况进行引脚配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值