В соответствии с таблицей микроконтроллеров 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 байтов на другом конце.