Вопрос

Платформа - ARM9

У меня есть стороннее устройство, подключенное через I2C к ARM9. Моя проблема заключается в том, что чтение / запись I2C происходит в поворот. Кажется, что линия IRQ установлена, но никогда не отменяется, когда есть данные для чтения. Сбой чтения, когда стороннее устройство NACKs адресует пакет. Так что любая последующая запись не удалась.

Мне интересно, нормально ли обработано мое прерывание. В ISR, который обслуживает IRQ, я отключаю прерывания, отменяю регистрацию обработчика прерываний и затем сигнализирую задаче перейти к чтению с шины I2C. Наконец, я снова включаю прерывания.

Когда задача обрабатывает сигнал, указанный выше, я пытаюсь прочитать данные с шины I2C, но это не удается. Наконец, я всегда перерегистрирую ISR после каждой попытки чтения. Во время обработки сигнала чтения отключение / включение прерываний не происходит.

Мой вопрос: нужно ли отключать прерывания при чтении / записи на шину I2C?

Язык программирования выбран с использованием собственной RTOS.

Это было полезно?

Решение

Важно то, готова ли ваша RTOS / система поддерживать вложенные исключения. Если для этого нет веской причины, все будет проще, если вы избегаете вложенных исключений и отключаете все прерывания при входе в ISR и повторное включение при выходе.

Если вы хотите, чтобы при обработке прерывания I2C происходили другие прерывания с более высоким приоритетом, отключите только прерывание I2C. Довольно необычно отменить регистрацию обработчика прерываний при входе в ISR. Это может привести к неожиданному поведению, когда нет зарегистрированного обработчика, само прерывание включено и происходит прерывание. Поэтому вместо отмены регистрации обработчика просто отключите прерывание I2C (возможно, вы уже делаете это, но, как я понимаю, регистрация обработчика и включение прерывания - это две разные вещи).

Хорошей стратегией для решения вашей проблемы будет попытка связаться с устройством без прерываний. Попробуйте читать / писать с него последовательно, не имеет значения, все ли блокирует - это просто тестирование. Это намного легче отладить, и после успеха вы можете перейти на версию прерываний.

Другие советы

Большинство прерываний необходимо подтвердить или очистить. Вы упоминаете о включении / отключении, регистрации / отмене регистрации и обработке прерывания. Просто убедитесь, что прерывание подтверждается и / или очищается / сбрасывается. Часто это включает запись номера прерывания или бита обратно в регистр ожидания прерывания. Проверьте конкретное руководство по ARM или руководство по RTOS.

Нужно ли вам включать / отключать прерывания для вашей целевой платформы, зависит от вашей конкретной аппаратной / RTOS-реализации. К сожалению, каждый поставщик микроконтроллеров ARM (STMicro, Freescale, Oki и т. Д.) Имеет возможность по-разному реализовывать свое оборудование I2C и может предъявлять различные требования к очистке IRQ.

Я бы порекомендовал вам найти копию таблицы данных об оборудовании (и / или опубликовать здесь конкретный номер детали оборудования, чтобы мы могли помочь вам пролить документацию на поставщика).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top