Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

STM32+NRF24L01. Проблема с флагами в регистре STATUS

Пт фев 09, 2018 09:18:45

Доброго времени суток! Такая вот ситуация у меня: есть передатчик, есть приёмник. Передатчик передаёт без проблем, приёмник без проблем принимает. Решил снять логи и выяснил следующее: приёмник при приёме посылки поднимает флаг RX_DT в STATUS. Естественно, я читаю регистр и сбрасываю флаг ну и забираю данные из приёмного буфера. Передатчик же творит дичь: после отправки посылки через такое нормальноt количество времени (порядка 2 - 4 мс) прилетает флаг MAX_RT, и отсутствует флаг TX_DT. Это значит, что передатчик, в моём случае, аж 16 раз через каждые 250 мкс повторил вещание и не получил (!) подтверждение приёма. Плюс ко всему, в передатчике в STATUS вместе с MAX_RT поднимаются флаги, что регистр приёма данных пуст, то есть, в статусе лежит 0X0E.
Кусок кода передатчика:
Код:
void nrf24_init(){
   w_register(CONFIG, (1<<PWR_UP)|(1<<EN_CRC)|(0<<PRIM_RX));
   for(unsigned int t=0; t<5800; t++);
   w_register(CONFIG, (1<<PWR_UP)|(1<<EN_CRC)|(1<<PRIM_RX));
   CE_HI;
   for(unsigned int t=0; t<600; t++);

   w_register(RX_PW_P0,9);
   w_register(RF_CH, 4);

   set_txaddr(tx_address);
   set_rxaddr(rx_address);

}

void ptx(){
    CE_LO;
   
    CSN_LO;
    w_register(CONFIG,(1<<PWR_UP)|(1<<EN_CRC)|(0<<PRIM_RX));
    CSN_HI;
   
    CE_HI;
    for(unsigned char i=0; i<32; i++);
    CE_LO;
    for(unsigned int t=0; t<600; t++);
}

void prx(){
       
    CSN_LO;
    w_register(CONFIG,(1<<PWR_UP)|(1<<EN_CRC)|(1<<PRIM_RX));
    CSN_HI;
   
    CE_HI;
 
    for(unsigned int t=0; t<600; t++);
}

void nrf24_dataWrite(unsigned char* data, unsigned char nmbr){
       
    CSN_LO;
    SPI(FLUSH_TX);
    CSN_HI;
   
    CSN_LO;
    SPI(W_TX_PAYLOAD);
    for(unsigned char i=0; i<nmbr; i++){
        SPI(data[i]);
    }
    CSN_HI;
       
   ptx();
}

void nrf24_dataRead(unsigned char* data, unsigned char nmbr){

   CSN_LO;
   SPI(R_RX_PAYLOAD);

for(unsigned char i=0; i<nmbr; i++){
      data[i] = SPI(0xFF);
   }

   CSN_HI;

}

int main( void ){
  unsigned long tick = 800000;
     
  spi_init();
  nrf24_init();

  for(unsigned int t=0; t<5800; t++);
   

 
  while(1){
   
    if(--tick == 0){
      nrf24_dataWrite(snd, 9);
   
      tick = 800000;
    }
   
    if(!(PIN_SPI&DD_IRQ)){
      unsigned char tmp = r_register(STATUS);
      w_register(STATUS, tmp);
      prx();
   
    }
   
  }
}


Есть у кого идеи, в чём может быть косяк?

Добавлено after 2 hours 54 minutes 19 seconds:
ПЫ.СЫ. Чип радиомодуля именно NRF24L01, без "+"(!!!).

Re: STM32+NRF24L01. Проблема с флагами в регистре STATUS

Пт фев 09, 2018 15:52:39

после отправки посылки через такое нормальноt количество времени (порядка 2 - 4 мс) прилетает флаг MAX_RT, и отсутствует флаг TX_DT. Это значит, что передатчик, в моём случае, аж 16 раз через каждые 250 мкс повторил вещание и не получил (!) подтверждение приёма.

ПЫ.СЫ. Чип радиомодуля именно NRF24L01, без "+"(!!!).

а в версии без плюса вообще есть это самое MAX_RT, ACK-и и авторетрансмит?

Re: STM32+NRF24L01. Проблема с флагами в регистре STATUS

Пт фев 09, 2018 21:52:45

Да, конечно. Я Уже сравнил ДШ.

Добавлено after 5 hours 16 minutes 52 seconds:
Отключил нафиг ACK и всё нормально стало...
Ответить