2011-03-31 7 views
1

Atmel Xmega256A3을 사용하여 잠자기에서 깨어 난 TWI/I2C에 몇 가지 문제가있었습니다. TWI/I2C의 세부 사항을 파헤 치지 않고 AVR1308 애플리케이션 노트에 첨부 된 Atmel에서 제공 한 twi_master_driver를 사용하기로 결정했습니다.Xmega에서 수면 후 TWI 처리에 실패했습니다

문제는 잠자기에서 깨어 난 직후에 하나 또는 몇 개의 실패한 TWI 트랜잭션입니다. XMega에 연결된 I2C 버스에는 몇 가지 전위차계, 온도계 및 RTC가 있습니다. XMega는 버스의 유일한 마스터 역할을합니다. 핀 높이를 설정 RTC가 잠에서 깨어으로

{code for turning of VCC to all I2C connected devices} 
set_sleep_mode(SLEEP_MODE_PWR_DOWN); 
sleep_enable(); 
sleep_cpu(); 
{code for turning on VCC to all I2C connected devices} 

XMEGA :

우리 AVRLIBC 검색된 절전 기능을 사용한다. XMega가 잠자기에서 깨어 난 후에는 전위차계 중 하나에 값을 설정하려고하지만 실패합니다. 어떤 이유로 TWI 트랜잭션 결과는 첫 번째 트랜잭션의 TWIM_RESULT_OK 대신 TWIM_RESULT_NACK_RECEIVED입니다. 그 후 모든 것이 다시 작동하는 것 같습니다.

여기에 뭔가가 빠졌습니까? XMega, 수면 및 TWI에 대해 알려진 문제가 있습니까? 수면에서 깨어 난 후 어떤 플래그를 지우는 TWI를 재설정해야합니까?

안부 프레드릭

답변

2

트랜잭션이 완전히 완료되지 않을 경우 내부 상태 머신은 중간 상태에 걸리면 I2C/TWI에 공통의 문제가 있습니다. 다음 트랜잭션에서 주소가 지정되면 슬레이브가 올바르게 응답하지 않습니다. 이것은 일반적으로 마스터가 리셋되거나 읽기 또는 쓰기를 통해 SCK 신호 출력을 중단 할 때 발생합니다. 해결책은 데이터 트랜잭션을 시작하기 전에 SCK 라인을 수동으로 8 번 또는 9 번 토글하여 슬레이브의 내부 상태 머신이 모두 전송 포인트의 시작으로 리셋되고 모두 주소 바이트를 찾는 것입니다.

+0

팁 주셔서 감사합니다. 우리는 문제를 해결 한 것으로 보이는 Peter Fleurys I2C lib로 전환했습니다. – Fredrik