【发布时间】:2019-01-19 12:11:51
【问题描述】:
我一直在尝试为 NRF24L01+ 编写自己的代码。我有一个问题,我无法解决它
作为接收器,我使用 STM32F103C8T6,作为发射器,我使用 Arduino Uno。
问题与RX操作有关。
正如我上面提到的,
作为接收器,我使用 STM32F103C8T6,作为发射器,我使用 Arduino Uno。
双方;
- 正在通过同一地址进行通信。
- 具有相同的 CRC 长度
- 不要使用增强模式
- 具有相同的地址宽度
- 具有相同的有效载荷宽度
- 具有相同的通信数据速率。 (1Mbps)
这是我用来从发射器获取数据的算法。 顺便说一下,我不使用 IRQ Pin。
- 设置 CE 高
- 检查 STATUS 寄存器中的 RX_DR 位。如果一个值到达 RX FIFO,则设置该位。如果是这样,将 CE 拉低以停止 RX 操作。 (数据表说 RX_DR 位是数据就绪 RX FIFO 中断。当新数据到达 RX FIFO 时断言)
- 使用数据表中描述的 R_RX_Payload 命令并将数据分配给变量。
- 清除 RX FIFO
- 清除 STATUS 寄存器中的 RX_DR 位,(写入 1)
但它不起作用。
void RX_Mode()
{
ChipEnable_high(); // CE=1
//Check RX_DR bit. Wait until a value appears.
while(check)
{
ReadRegister(REG_STATUS,1);
if( (reg_data & 0x40) == 0x40 ){check = false;}
}
ChipEnable_low(); // CE=0
csn_low(); //CSN=0
HAL_SPI_TransmitReceive(&hspi1, (uint8_t*)COMD_R_RX_PAYLOAD, &received_data, 1, 150); // Read the data
csn_high(); // CSN=1
Flush_RX(); //Clear RX FIFO
// Clear RX_DR bit. (Write 1)
ReadRegister(REG_STATUS,1);
data2write = ( reg_data | 0x40);
WriteRegister(REG_STATUS,data2write,1);
CDC_Transmit_FS(&received_data,1); // Print the received data out.
}
当我在代码中禁用 while 循环时,我不断读取 0x0E。
编辑:我的新问题与 Flush 命令有关。 我想在数据到达时刷新 RX FIFO。在发送器发送数据时,我一直在读取寄存器,我可以观察到新数据到达 RX FIFO,这意味着 RX_DR 位已设置并且 RX_FIFO 状态已更改。然后我关闭tx并在rx端执行FLUSH_RX命令,无法刷新fifo。寄存器仍然说RX FIFO中有数据。
void Flush_RX()
{
csn_low();
HAL_SPI_Transmit(&hspi1, (uint8_t *)COMD_FLUSH_RX, 1, 150);
while(HAL_SPI_GetState(&hspi1) != HAL_SPI_STATE_READY);
csn_high();
}
我们将不胜感激任何建议、帮助和指导。 提前致谢。
【问题讨论】: