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

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Alex-Elektron
Встал на лапы
Сообщения: 113
Зарегистрирован: Сб янв 11, 2014 21:25:55

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

Сообщение Alex-Elektron »

Доброго времени суток! Такая вот ситуация у меня: есть передатчик, есть приёмник. Передатчик передаёт без проблем, приёмник без проблем принимает. Решил снять логи и выяснил следующее: приёмник при приёме посылки поднимает флаг 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, без "+"(!!!).
Реклама
arkhnchul
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

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

Сообщение arkhnchul »

[uquote="Alex-Elektron",url="/forum/viewtopic.php?p=3304532#p3304532"]после отправки посылки через такое нормальноt количество времени (порядка 2 - 4 мс) прилетает флаг MAX_RT, и отсутствует флаг TX_DT. Это значит, что передатчик, в моём случае, аж 16 раз через каждые 250 мкс повторил вещание и не получил (!) подтверждение приёма.[/uquote]
[uquote="Alex-Elektron",url="/forum/viewtopic.php?p=3304532#p3304532"]ПЫ.СЫ. Чип радиомодуля именно NRF24L01, без "+"(!!!).[/uquote]
а в версии без плюса вообще есть это самое MAX_RT, ACK-и и авторетрансмит?
Реклама
Alex-Elektron
Встал на лапы
Сообщения: 113
Зарегистрирован: Сб янв 11, 2014 21:25:55

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

Сообщение Alex-Elektron »

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

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

Вернуться в «ARM»