0

根据 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 个字节。

4

0 回答 0