I2C ISR и прерывания - PullRequest
       38

I2C ISR и прерывания

2 голосов
/ 13 марта 2009

Платформа - ARM9

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

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 13 марта 2009

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

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

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

1 голос
/ 14 марта 2009

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

0 голосов
/ 13 марта 2009

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

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

...