STM32 I2C1 BIT START não definido no registro SR1
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
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
ouPEC
Bit está definido, o software não deve executar nenhum acesso de gravação aI2C_CR1
Antes que este bit seja limpo por hardware. Caso contrário, existe o risco de definir um segundoSTOP
,START
ouPEC
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