Pergunta

tivemos alguns problemas com TWI/I2C depois de acordar com o Atmel Xmega256A3.Em vez de nos aprofundarmos nos detalhes do TWI/I2C, decidimos usar o twi_master_driver fornecido pela Atmel anexado à nota de aplicação AVR1308.

O problema é que uma ou algumas transações TWI falharam logo após acordar.No barramento I2C conectado ao XMega temos alguns potenciômetros, um termômetro e um RTC.O XMega atua como o único master do barramento.

Usamos as funções sleep encontradas no AVRLIBC:

{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}

O XMega foi acordado pelo RTC, que define um pino alto.Depois que o XMega sair do modo de espera, queremos definir um valor em um dos potenciômetros, mas isso falha.Por alguma razão, o resultado da transação TWI é TWIM_RESULT_NACK_RECEIVED em vez de TWIM_RESULT_OK na primeira transação.Depois disso tudo parece funcionar novamente.

Perdemos alguma coisa aqui?Existe algum problema conhecido com o XMega, sleep e TWI?Precisamos redefinir o TWI para limpar quaisquer sinalizadores depois de acordar?

Atenciosamente, Fredrik

Foi útil?

Solução

Há um problema comum no I2C/TWI onde a máquina de estado interna fica presa em um estado intermediário se uma transação não for totalmente concluída.O escravo então não responde corretamente quando abordado na próxima transação.Isso geralmente acontece quando o mestre é reinicializado ou para de emitir o sinal SCK no meio da leitura ou gravação.Uma solução é alternar a linha SCK manualmente 8 ou 9 vezes antes de iniciar qualquer transação de dados, para que todas as máquinas de estado internas nos escravos sejam redefinidas para o início do ponto de transferência e todas procurem seu byte de endereço.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top