문제

플랫폼 -ARM9

I2C를 통해 ARM9에 연결된 제 3 자 장치가 있습니다. 내 문제는 I2C 읽기/쓰기가 왜곡되고 있다는 것입니다. IRQ 라인이 주장 된 것으로 보이지만 읽을 데이터가있을 때는 분석하지 않습니다. 타사 장치가 주소 패킷을 촉진함에 따라 읽기가 실패합니다. 따라서 후속 쓰기가 실패합니다.

내 인터럽트 처리가 확인되는지 궁금합니다. IRQ에 서비스를 제공하는 ISR에서 인터럽트를 비활성화하고 인터럽트 핸들러를 등록한 다음 I2C 버스에서 읽을 수 있도록 작업에 신호를 보냅니다. 마지막으로 인터럽트를 다시 활성화합니다.

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

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

선택의 프로그래밍 언어는 특성 RTO를 사용하는 C입니다.

도움이 되었습니까?

해결책

중요한 것은 RTO/시스템이 중첩 예외를 지원할 준비가되었는지 여부입니다. 그럴만 한 이유가 없다면, 중첩 된 예외를 피하고 ISR에 들어가고 떠날 때 다시 활성화 할 때 모든 인터럽트를 비활성화하면 상황이 더 단순합니다.

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

문제를 해결하기위한 좋은 전략은 인터럽트없이 장치와 통신하는 것입니다. 일련의 방식으로 읽고 쓰기를 시도하십시오. 모든 것이 블록하는지 여부는 중요하지 않습니다. 단지 테스트입니다. 이것은 디버깅하기가 훨씬 쉽고 성공한 후에는 인터럽트 버전으로 이동할 수 있습니다.

다른 팁

대부분의 인터럽트는 인정하거나 청소해야합니다. 인터럽트 활성화/비활성화, 등록/등록 및 처리 및 처리를 언급합니다. 인터럽트가 승인 및/또는 지우기/재설정인지 확인하십시오. 종종 여기에는 인터럽트 번호를 작성하거나 인터럽트 보류 레지스터로 돌아가는 것이 포함됩니다. 특정 ARM 매뉴얼 또는 RTO 매뉴얼을 확인하십시오.

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

하드웨어 데이터 시트 사본을 찾는 것이 좋습니다 (및/또는 특정 하드웨어 파트 너버를 여기에 게시하여 공급 업체 문서를 붓는 데 도움이 될 수 있습니다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top