Pergunta

Estou tentando programar o STM32 para conversar com minha EEPROM I2C, mas parece que toda vez que digo:

I2C_GenerateSTART(I2C1, ENABLE);
while( !(I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)) );  the code hangs here

Passei com o depurador e descobri que o sinalizador SR1 Bit 0 (que é o sinalizador de início de iniciação gerado) não está definido, e é por isso que o código está pendurado. Eu posso ver no osciloscópio que o bit de início foi gerado e isso funciona às vezes. Geralmente quebra quando tentei fazer várias gravações seguidas. Eu verifiquei se o HW está tudo bem, eu verifiquei a frequência em que estou executando no barramento i2c, é bem 100kHz dentro da EEPROM de 24LC1025.

alguma ideia,

obrigado

Foi útil?

Solução

Como você diz que isso geralmente quebra quando você está fazendo várias gravações seguidas, você pode querer garantir que você não esteja violando esta nota na folha de dados do STM32 para o STOP Bit no registro de controle i2c_cr1:

Nota: Quando o STOP, START ou PEC Bit está definido, o software não deve executar nenhum acesso de gravação a I2C_CR1 Antes que este bit seja limpo por hardware. Caso contrário, existe o risco de definir um segundo STOP, START ou PEC solicitar.

Depois de definir o STOP Bit, você precisa garantir que o hardware o tenha liberado antes de escrever o próximo START pedaço.

Outras dicas

Verifique as erratas do seu dispositivo (obtenha -o no site da ST). O STM32 tem muitos bugs na implementação do i2C. A Errata fornece soluções alternativas de software para eles.

Além disso, ao usar os arquivos de origem do driver normalmente fornecidos com plataformas STM32, não se esqueça de ler os cabeçalhos! Eles podem ser muito úteis, especialmente para iniciantes (como eu) que não sabem por onde começar.

Nesse caso, você estaria olhando para STM32F4XX_I2C.C

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