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