2009-03-13 5 views
2

플랫폼 - ARM9I2C ISR 및 인터럽트

I2C를 통해 ARM9에 연결된 타사 장치가 있습니다. 내 문제는 I2C 읽기/쓰기가 뒤틀리는 것입니다. IRQ 라인은 어설 션되었지만 읽을 데이터가있을 때 결코 어설 션되지 않습니다. 타사 장치가 주소 패킷을 NACK하면 읽기가 실패합니다. 따라서 모든 후속 쓰기가 실패합니다.

내 인터럽트 처리가 잘되어 있는지 궁금합니다. IRQ를 서비스하는 ISR에서 인터럽트를 비활성화하고 인터럽트 처리기 등록을 취소 한 다음 I2C 버스에서 읽으려는 작업에 신호를 보냅니다. 마지막으로 인터럽트를 다시 활성화합니다.

작업이 위에 게시 된 신호를 처리 할 때 I2C 버스에서 데이터를 읽으려고 시도하지만 실패합니다. 마지막으로, 나는 항상 ISR을 다시 읽으려고 시도한 후에 재 등록합니다. 읽기 신호를 처리하는 동안 발생하는 인터럽트 비활성화/활성화가 없습니다.

내 질문은 I2C 버스를 읽고 쓸 때 인터럽트를 비활성화해야합니까?

프로그래밍 언어는 적절한 RTOS를 사용합니다.

+0

IRQ가 절대로 어설 션되지 않으면 장치에서 충분한 데이터 및/또는 올바른 데이터를 사용하여 IRQ를 디어 스팅했는지 확인하십시오. – bstpierre

+0

장치 설명서는 항상 X 바이트를 읽으려고 X 데이터를 버스에 저장하도록 지정합니다. 그렇다면 I2C를 사용하여 펌웨어를 장치로 업데이트하는 중입니다.장치가 갑자기 IRQ 라인의 디 어썰링을 멈추는 것은 단지 특정 시점에 불과합니다. – dubnde

+0

장치와 프로세서 사이의 데이터 교환이있을 때까지이 장치가 작동하기 때문에 경쟁 조건이 될 수 있다고 생각하기 시작했습니다. 실행 중입니다. 이 시점 이전에는 명령을 보내고 문제없이 응답을받을 수 있습니다. – dubnde

답변

3

중요한 점은 RTOS/시스템이 중첩 예외를 지원할 준비가되었는지 여부입니다. 그럴만 한 이유가없는 한 중첩 된 예외를 피하고 ISR을 입력 할 때 모든 인터럽트를 비활성화하고 나가면 다시 활성화하면 더 간단합니다.

I2C 인터럽트를 처리하는 동안 더 높은 우선 순위의 인터럽트가 발생하도록하려면 I2C 인터럽트 만 비활성화하십시오. ISR을 시작할 때 인터럽트 처리기 등록을 취소하는 것은 다소 드문 경우입니다. 이로 인해 예기치 않은 동작이 발생할 수 있습니다. 등록 된 처리기가 없으면 인터럽트 자체가 활성화되고 인터럽트가 발생합니다. 따라서 핸들러를 등록 해제하는 대신 I2C 인터럽트를 간단하게 비활성화하십시오 (아마도 이미 그렇게하고 있지만 핸들러를 등록하고 인터럽트를 활성화하는 것은 다른 두 가지 일입니다).

문제를 해결하는 좋은 방법은 인터럽트없이 장치와 통신을 시도하는 것입니다. 직렬 방식으로 읽기/쓰기를 시도해보십시오. 모든 것이 차단되면 문제가되지 않습니다. 테스트하는 것입니다. 이것은 디버깅이 훨씬 쉬우 며 성공 후 인터럽트 버전으로 이동할 수 있습니다.

+0

감사합니다. 매우 유용한 답변. ISR을 입력 할 때 모든 인터럽트를 비활성화하고 나가면 다시 활성화됩니다. 나는 단지 I2C 인터럽트를 비활성화하는 방법을 조사 할 것입니다. 등록시 응답은 매우 유익합니다. 조사를 계속할 것인가? 테스트 전략을 시작으로 시도합니다. – dubnde

0

타겟 플랫폼에 인터럽트를 활성화/비활성화해야하는지 여부는 특정 하드웨어/RTOS 구현에 따라 다릅니다. 불행하게도 모든 ARM 마이크로 컨트롤러 공급 업체 (STMicro, Freescale, Oki 등)는 I2C 하드웨어를 다르게 구현할 수 있으며 IRQ를 지우는 방법에있어 다른 요구 사항이있을 수 있습니다.

하드웨어 데이터 시트 사본을 찾으십시오. 여기에 특정 하드웨어 부품 번호를 게시하여 공급 업체 문서를 참조하십시오.

+0

감사합니다. 나는 데이터 시트를 가지고있다. I2C 구현은 사양을 따른다. 유감스럽게도 계약상의 이유로 정보를 공유 할 수 없습니다. 당신의 통찰력은 매우 유용합니다. 예. 나는 제안 된대로 ISR에서 인터럽트를 비활성화/재 활성화한다. – dubnde

1

대부분의 인터럽트는 수신 확인되거나 삭제되어야합니다. 인터럽트의 활성화/비활성화, 등록/등록 해제 및 처리에 대해 언급합니다. 인터럽트가 수신 확인 및/또는 해제/재설정 중임을 확인하십시오. 종종 인터럽트 번호 나 비트를 인터럽트 보류 레지스터에 쓰는 작업이 포함됩니다. 특정 ARM 매뉴얼이나 RTOS 매뉴얼을 확인하십시오.