stm32 - NRF24L01+ TX 和 RX 时序问题?
问题描述
我使用 STM32F103C8T6 作为发送器,使用 Arduino Uno 作为接收器。
我无法收到我感兴趣的值。我在每次发送后更改了延迟持续时间以及 CE 脉冲。我有时会通过玩延迟时间来使其符合规范。
举例来说,我在执行 TX 功能并且接收器接收良好之后添加了 200 毫秒的延迟,然后我断开接收器,然后当我再次连接它时,它只接收到零。当我玩 CE 脉冲持续时间时,会发生非常相似的情况。我无法使用自动确认或简单的 rx-tx 操作使其正常工作。我想提一下,当我改变角色(TX 设备是 Arduino,RX 设备是 STM)时,一切正常。
我已经通过逻辑分析仪检查了 STM32 以查看有效负载是否正确填充并且看不到任何问题。填充有效负载后,我检查 FIFO_STATUS 寄存器,一切都很好。在我施加一个脉冲一段时间后,我检查 STATUS 寄存器,可以看到 TX_DS 位已设置。
我发现仅在 CE 上施加 10us 脉冲可能还不够。它最多可能需要 500us。然后决定将 CE 引脚设置为高电平,直到设置了 TX_DS 位,但这种方法也不起作用。
void TX_Mode(uint8_t data2send)
{
Flush_TX();
CleanInterrupts();
SetPRIM(PRIM_TX); //set as transmitter
csn_low(); //CSN=0
HAL_SPI_Transmit(&hspi2, &COMD_W_TX_PAYLOAD, 1,150); //send command to write to payload
HAL_SPI_TransmitReceive(&hspi2, &data2send, &dummy, 1, 150); // fill the payload
while(HAL_SPI_GetState(&hspi2) != HAL_SPI_STATE_READY);
csn_high();
ChipEnable_high();
while( !(TXDS_Bit_Is_Set() )); //wait until payload is sent
ChipEnable_low();
}
解决方案
推荐阅读
- c++ - 用于实时信号处理的快速 C++ 正弦和余弦替代方案
- javascript - 将 php 中的开始日期时间和结束日期时间与 Javascript 中的日期进行比较
- spring - spring-boot 2中数据库初始化后避免重复主键
- logstash - Logstash 6.2.4 - 匹配时间不默认为当前日期
- javascript - 尝试通过 Web Audio API 使用超过 4Gb 的 RAM 时,64 位 Chrome 和 Edge 浏览器选项卡崩溃
- apache - Apache:代理平衡器,在两个通道上发送某些请求
- python - 如何使用 R 数据框中的数据从 R 脚本中调用 python 脚本并将结果添加到新列
- python - 使用 selenium chrome 驱动程序自动“另存为 PDF”时缺少元素
- grails - 如何在 Grails 3 的编辑视图中修改 ID 列(或列)的值?
- jenkins - 使用 Java 的 Jenkins PipelineShared 库