Форум РадиоКот https://radiokot.ru/forum/ |
|
STM32+NRF24L01. Проблема с флагами в регистре STATUS https://radiokot.ru/forum/viewtopic.php?f=59&t=152433 |
Страница 1 из 1 |
Автор: | Alex-Elektron [ Пт фев 09, 2018 09:18:45 ] |
Заголовок сообщения: | STM32+NRF24L01. Проблема с флагами в регистре STATUS |
Доброго времени суток! Такая вот ситуация у меня: есть передатчик, есть приёмник. Передатчик передаёт без проблем, приёмник без проблем принимает. Решил снять логи и выяснил следующее: приёмник при приёме посылки поднимает флаг 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 [ Пт фев 09, 2018 15:52:39 ] |
Заголовок сообщения: | Re: STM32+NRF24L01. Проблема с флагами в регистре STATUS |
после отправки посылки через такое нормальноt количество времени (порядка 2 - 4 мс) прилетает флаг MAX_RT, и отсутствует флаг TX_DT. Это значит, что передатчик, в моём случае, аж 16 раз через каждые 250 мкс повторил вещание и не получил (!) подтверждение приёма. ПЫ.СЫ. Чип радиомодуля именно NRF24L01, без "+"(!!!). а в версии без плюса вообще есть это самое MAX_RT, ACK-и и авторетрансмит? |
Автор: | Alex-Elektron [ Пт фев 09, 2018 21:52:45 ] |
Заголовок сообщения: | Re: STM32+NRF24L01. Проблема с флагами в регистре STATUS |
Да, конечно. Я Уже сравнил ДШ. Добавлено after 5 hours 16 minutes 52 seconds: Отключил нафиг ACK и всё нормально стало... |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |