根据 NRF52840 微控制器数据表,数据包指针是“用于下一次发送或接收的数据包地址。发送时,该地址指向的数据包将被发送,接收时,接收到的数据包将写入此地址地址。” 使用直接寄存器寻址,我试图将变量的地址分配给指向 NRF52 的数据包指针寄存器地址的取消引用指针。代码编译没有错误,并且正在发送一条消息,但收到的数据不是我打算发送的。因为这是我第一次需要重铸一个指向 int 的指针,所以我认为我做错了。
Cplusplus.com说 reinterpret_cast “......也可以将指针转换为整数类型或从整数类型转换。” 我在这里也发现应该遵守正确的类型。有人可以看看我的 Radio::read 函数并验证 reinterpret_cast 的正确用法吗?
#include <cstdint>
#define BASE_ADDRESS_RADIO 0x40001000
#define OFFSET_REGISTER_PACKETPTR 0x504 // Packet pointer
#define OFFSET_REGISTER_STATE 0x550 // Current radio state
unsigned int Radio::read (void){
unsigned int rx_buff;
static std::uintptr_t * packet_pointer = (unsigned int *)
(BASE_ADDRESS_RADIO + OFFSET_REGISTER_PACKETPTR);
static unsigned int * radioState_reg = (unsigned int *)
(BASE_ADDRESS_RADIO + OFFSET_REGISTER_STATE);
while((*radioState_reg != RXIDLE)&&(*radioState_reg != TXIDLE)&&
(*radioState_reg != DISABLED)){}
if (*radioState_reg == TXIDLE){
radio_disable();
}
if(*radioState_reg == DISABLED){
rx_en();
}
*packet_pointer = reinterpret_cast<std::uintptr_t>(&rx_buff);
start_job();
return rx_buff;
}
接收无线电信号在另一无线电启动传输后几乎立即接收;但是,发送单个字节的数据会导致在另一端读取完整的 4 个字节。