Всем доброго времени суток
Нужна консультация по CAN интерфейсу, - как правильно настроить прерывания при RXB0DBEN = 1 (дублировании буфера) - сколько уходит времени на считывание информации из буфера, шина 125кГц, кварц 10 МГц.
Конкретно, собрано устройство на PIC18F258, считывает номер iButton (DS1990) и отсылает по шине CAN в базовое устройство в ответ приходит около 6-ти пакетов с управляющими командами. Так вот часть этих пакетов пропадает и хочу понять что за причина этому.
Первая мысль была это запрет прерываний, когда пришел пакет был опрос iButton, и следующий пакет проигнорировался, т.к. не был снят флажок RXFUL = 0; Анализ ситуации показал что дело в чем то другом, отключение запрета прерываний при самом длинном "импульсе присутствия" 480 мкс результата не дал. Даже возникла идея сделать задержку опроса iButton после считывания кода, чтобы наверняка запрет прерываний не влиял на работу шины CAN, но это тоже не дало эффект.
Согласно логике CAN этого не должно происходить, но получается что при посылке подряд нескольких пакетов базовое устройство пишет в шину следующий пакет без проверки отправки предыдущего, потому что в моём приемном устройстве стабильно принимаются первый и последний, а промежуточные через 1.
Включение двойной буферизации на прием RXB0DBEN = 1; вроде бы и помогает, но как то странно, сам не могу понять, теряются пакеты или путаются между собой. Очень похоже на то, что когда одновременно возникло 2 прерывания, от приемного буфера 0 и 1 они смешиваются друг с другом один пакет входит внутрь второго пакета.
Все найденные примеры в интернете "мы будем использовать только один буфер" и не дают мне ответа. Подозреваю что надо выставить приоритеты для прерываний от буфера 0 и 1 или внутри обработчика запрещать реакцию на прерывание от другого буфера.
Буду рад всем откликнувшимся может натолкнете на нужную мысль. Написал как вижу проблему, если нужна какая то дополнительная информация конечно сообщу.
|