2013-07-12 2 views
0

Atmel SAM3S MCU를 사용하고 있으며 ASF 항목은 I2C (TWI라고 함) 통신을 수행 할 수 있습니다. 주 루프에서 너무 많은 시간을 들여야하는 것을 제외하고는 괜찮습니다.Cortex M3에서 I2C 읽기를 위해 DMA를 사용하는 방법

그래서 I2C 장치에서 데이터를 읽으려면 DMA 전송을 시작할 수 있어야합니다. 그러나 모든 문서는 TWI와 같은 반이중 장치에서 TX와 RX를 동시에 켤 수 없다고 말합니다. 워드 프로세서는 TWI 레지스터에 PDC (Peripheral DMA Controller) 레지스터 섹션이 있음을 보여 주지만 전이중 인 USART를 제외하고는 PDC 예제를 찾을 수 없습니다.

내가 시도 할 수있는 유일한 일은 TX 섹션과 다음 RX 섹션을 설정하고 TX가 완료된 후 RX를 자동으로 활성화 할 수 있기를 바랍니다.

SAM3S에서 I2C 읽기를 위해 DMA를 사용하는 사람이 있습니까? 그렇다면 몇 가지 문서 나 예제를 가르쳐 주시겠습니까?

+0

Google for AT91 DMA TWI를 사용하면 sam3x M3 (atmel)에 대해 PDC를 수행하는 Linux 드라이버를 찾을 수 있습니다. 그것은 아직도 꽤 독서이지만 운전자는 잘 구조화되어 보였고 사람들은 그것이 안정적이라고 말했다. atmel의 sam3 시리즈에 대한 설명서 및 사용 가능한 코드는 현재로서는별로 좋지 않습니다. ASF는 종종 데모 방식 이상으로 잘못된 방향을 이끌고 있습니다. Btw에서 드라이버는 9 바이트 이상의 데이터에 대해 #define을 사용하여 PDC를 사용합니다. 그래서 그들은 9 + 바이트 sequencial 읽기에 도움이 될 것으로 기대합니다. – John

답변

0

특정 부분에 익숙하지 않지만 많은 일반적인 사용 패턴에서 가장 좋은 방법은 DMA를 사용하여 멀티 바이트 시퀀스의 데이터를 처리하는 것입니다. 대부분의 I2C 주변 장치는 "쓰기"주소 바이트로 시작하여 데이터를 읽을 수 있도록 해 주며, 주소가 확인되면 필요한 데이터에 대한 주소 나 기타 정보를 전송합니다. 그 다음에는 재시작 및 "읽기"주소 바이트가옵니다. 이것이 확인되면, "ack"플래그가 설정된 바이트 읽기 중 하나만 제외하고 모두 수행 할 수 있습니다. 이것이 끝나면 "ack"플래그가 지워진 마지막 바이트를 읽도록 요청하십시오.

요청 된 주소의 바이트를 클럭하기 위해 DMA 컨트롤러를 사용하는 것이 좋을지 모르겠지만, 읽기 명령의 첫 번째 바이트를 클럭 아웃하려고 시도하는 것은 가치가 없을 것입니다.

+0

초당 100x, 400kHz의 I2C 속도로 실행되는 장치에서 14 바이트를 읽으려고합니다. 이는 다른 잡무가있는 64MHz MCU에서 사용하기에 상당한 시간입니다. 나는 I2C를 이해하지만 ... PDC에 연결되어있는 것으로 문서화되었으므로, 나는 그것을 사용하는 것에 대해 생각했다. 아마도 TWI 인터럽트를 사용하여 전송을 실행하게 될 것입니다. (많은 내용도 기록되어 있지 않지만) – TKS

+0

시작 및 정지와 1 바이트 "시작 읽기"명령과 함께 14 바이트가 400 마이크로 초 미만입니다. 400kbits/second. 100x/second를 수행하면 폴링 만 수행하는 경우에도 4 %의 오버 헤드가 발생합니다. 이런 종류의 데이터 속도에 대한 나의 성향은 아마도 2kHz의 속도로 실행되는 인터럽트를 가지며, 각 인터럽트는 전체 읽기 작업의 1/20을 수행해야합니다. DMA는 수백 또는 수천 바이트를 전송할 때 매우 유용 할 수 있습니다. 훨씬 덜 그래서 14를 옮길 때. – supercat

+0

나는 당신이 슈퍼카라고 착각했다고 생각한다. 400 마이크로 초는 마이크로 프로세서에서 매우 긴 시간대입니다. 짧은 시간 내에 끝내야하는 고성능 작업이 있으면 각 TWI 센서/슬레이브에 대해 400uS를 기다릴 수 없습니다. – John

관련 문제