Столкнулся с подвисанием приема у CC2500.
GDO0 в режиме 0x06.
Фиксированная длина пакета, используются FEC, data whitening и CRC. Адрес не используется. Синхрослово 30/32 бита, преамбула 8 байт. RX FIFO Autoflush=ON.
Модуляция GFSK скорость 100кбит. RXOFF Mode=IDLE.
Сигнал от GDO0 заведен на вход INT0 атмеги, прерывания настроены по спаду, что дает прерывание по приходу валидного пакета. После обработки полученного пакета программа сбрасывает фифо и запускает прием заново.
Трансивер работает в режиме приема.
Пакеты поступают каждые 64мс, через несколько десятков минут прием зависает.
Если пакеты не поступают то не виснет (или еще не обнаружил).
Исследования показали что зависание происходит из-за того что при приеме пакета не формируется сигнал GDO0 (во всяком случае не возникает прерывание). Состояние зависшего трансивера - IDLE, в RX FIFO правильный принятый пакет. Перезапуск приема возобновляет работу.
Если рассуждать логически то прерывание по GDO0 может не формироваться только если GDO0 не устанавливается по приему синхрослова. Тем не менее последний пакет на котором связь виснет принимается, причем без ошибок.
Пока сделал периодическую проверку состояния CC2500 и если она перешла в IDLE в момент когда должна быть в RX перезапускаю прием. Но это как-то некрасиво. Хорошо бы разобраться в причине эффекта.
Изучение даташита и эрраты ни на какие мысли пока не натолкнуло.