Привет, Знатоки!
Настраиваю программу комплекта устройств, содержащих Si4432-B1. Подпрограмма приема выглядит так:
byte RF_Receive (void) { register unsigned GPTR;
if (RfState!=sRFIdle) return STATUS_ERROR_STATE;
SI4432B1_Get_Interrupt_Status (); // #03/04 Get Interrupt Status // for Clear All Interrupts SI4432B1_FIFO_RX_Clear_Index (); // #08 Clear RX FIFO Buffer SI4432B1_RX_Mode_On (); // #07 Enable Receiver while (TIMEOUT_PTR) { SI4432B1_Get_Interrupt_Status(); // #03 if (ItStatus1 & 0x02) { SI4432B1_FIFO_Get (RXBUFF,RX_PACKET_LEN); RSSI = SI4432B1_Get_RSSI (); return STATUS_OK; } } if (ItStatus1 & 0x10) { SI4432B1_FIFO_RX_Clear_Index ();//#08 continue; } WDT(); TIMEOUT_PTR--; } SI4432_Data_Ready=0; return STATUS_TIMEOUT; }
// **************************************
Переменная TIMEOUT_PTR определяет количество циклов приема (длительность). В нашем случае = 1500. В цикле while (TIMEOUT_PTR) первым делом читается статус SI4432B1_Get_Interrupt_Status(); Величина ItStatus1 содержит бит 0х02, который говорит, принят правильный фрейм )Valid Packet Received.When set to 1 a valid packet has been received). Однако чтение FIFO сразу дает нулевой фрейм. Если же после чтения статуса сделать достаточно большую задержку в несколько десятков миллисекунд, то читается правильный фрейм. Приходится многократно считывать данные с FIFO до тех пор, пока не будет принят ненулевой фрейм. Это выглядит примерно так:
while (TIMEOUT_PTR) { SI4432B1_Get_Interrupt_Status(); // #03 if (ItStatus1 & 0x02) { GPTR = 2000; while (GPTR--) {
SI4432B1_FIFO_Get (RXBUFF,RX_PACKET_LEN); // Read FIFO Delay (50); if (SI4432B1_ZERO_TEST()) // Testing Buffer { SI4432_Data_Ready=1; // External READY Flag RSSI = SI4432B1_Get_RSSI (); // Read RSSI Blue_Blink(3); // Receive LED Blink return STATUS_OK; // Return } } } if (ItStatus1 & 0x10) { SI4432B1_FIFO_RX_Clear_Index ();//#08 continue; } WDT(); TIMEOUT_PTR--; } SI4432_Data_Ready=0; return STATUS_TIMEOUT; }
byte SI4432B1_ZERO_TEST (void) { register byte RESULT=0, i;
for (i=0; i<RX_PACKET_LEN; i++) RESULT += RXBUFF[i]; return RESULT; }
// **************************************
Явление замечено впервые на партии кристаллов SI4432 - B1, до этого долго работали на V2 and A0 versions. Ничего подобного не замечали. Такое впечатление, что внутри кристалла на самом деле два буфера, сперва заполняется один, выдается статус, затем медленно заполняется другой.
Может кто сталкивался с явлением? Или имеет другое объяснение явления?
--------------------
Regards, Oleg Nicolaiciuc (onic777)
|