Página 1 de 1

Modulo i2c

MensagemEnviado: 18 Jan 2020 13:05
por Guri
Tô com um probleminha e eu acho que é no módulo i2c,
Uso um memória de 32k i2c e faço a leitura pelo módulo do stm103.

Estou usando a velocidade de 400khz...Alguém sabe me dizer se há algum problema nesse módulo quando se usa essa frequencia.
No meu caso, tenho notado que em algum momento o fw trava, justamente quando ele esta manipulando a memória i2c externa.

Agradeço a ajuda, :P

Re: Modulo i2c

MensagemEnviado: 18 Jan 2020 13:13
por eletroinf
Certa feita eu tive problemas de travamento na I2C deste mcu e o problema eram os vários bugs do módulo.
Procure a errata do seu chip (considere o release do silicon) e veja se não é por causa de algum bug.

Re: Modulo i2c

MensagemEnviado: 18 Jan 2020 13:55
por Guri
Obrigado Eletroinfo.

Bem que suspeitei, de bugs, apesar de ter sempre em mente que o bug pode estar no programador :cry:

O erro ou travamento por assim dizer, ocorre quando estou LENDO a i2c (memória).
Experimentei baixar para 100khz e fazer testes para ver se dá o erro.

Não uso interrupção, e faço a leitura byte a byte...

Obrigado pela dica. :)

Re: Modulo i2c

MensagemEnviado: 18 Jan 2020 18:55
por vtrx
o STM103 tem um bug.
Só sei a solução usando o Keil.

Re: Modulo i2c

MensagemEnviado: 18 Jan 2020 23:08
por Guri
E qual seria essa solução? Talvez por software, já que o bug é no hardware do módulo i2c.

Re: Modulo i2c

MensagemEnviado: 19 Jan 2020 08:03
por vtrx
Tenho um 'driver' para o Keil que não deixa o hardware travar.
O único problema no STM103 que atrapalha é esse,deve ser por isso que é tão barato,mas poderoso...
Faz um tempo que não programo o STM103,tenho vários templates para analisar mas acho que a rotina para ler é esta(Eeprom que usa um endereço):
Código: Selecionar todos
#define EEPROM_HW_ADDRESS      0xA0   /* E0 = E1 = E2 = 0 */
#define I2C_EE                 I2C1//interface number
#define I2C_TIMEOUT_MAX 10000
//*********************************************************************************
u8 Le_24c02( u8 ReadAddr)
{
    u8 Data;
    u32 timeout = I2C_TIMEOUT_MAX;

     /* Generate the Start Condition */
      I2C_GenerateSTART(I2C1, ENABLE);
   
  /* Test on I2C1 EV5 and clear it */
  timeout = I2C_TIMEOUT_MAX; /* Initialize timeout value */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT))
  {
    /* If the timeout delay is exeeded, exit with error code */
      if ((timeout--) == 0) return 0xFF;
  }
  /* Send DCMI selcted device slave Address for write */
  I2C_Send7bitAddress(I2C1,EEPROM_HW_ADDRESS, I2C_Direction_Transmitter);
  /* Test on I2C1 EV6 and clear it */
  timeout = I2C_TIMEOUT_MAX; /* Initialize timeout value */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
  {
    /* If the timeout delay is exeeded, exit with error code */
      if ((timeout--) == 0) return 0xFF;
  }
   /* Send I2C1 location address LSB */   
   I2C_SendData(I2C1, ReadAddr);
     /* Test on I2C1 EV8 and clear it */
  timeout = I2C_TIMEOUT_MAX; /* Initialize timeout value */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED))
  {
    /* If the timeout delay is exeeded, exit with error code */
      if ((timeout--) == 0) return 0xFF;
  }
     /* Generate the Start Condition */
      I2C_GenerateSTART(I2C1, ENABLE);
  /* Test on I2C1 EV6 and clear it */
  timeout = I2C_TIMEOUT_MAX; /* Initialize timeout value */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT))
  {
    /* If the timeout delay is exeeded, exit with error code */
      if ((timeout--) == 0) return 0xFF;
  }
  /* Send DCMI selcted device slave Address for write */
  I2C_Send7bitAddress(I2C1,EEPROM_HW_ADDRESS, I2C_Direction_Receiver);
  /* Test on I2C1 EV6 and clear it */
  timeout = I2C_TIMEOUT_MAX; /* Initialize timeout value */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED))
  {
    /* If the timeout delay is exeeded, exit with error code */
      if ((timeout--) == 0) return 0xFF;
  }
   /* Prepare an NACK for the next data received */
  I2C_AcknowledgeConfig(I2C1, DISABLE); 

  /* Test on I2C1 EV7 and clear it */
  timeout = I2C_TIMEOUT_MAX; /* Initialize timeout value */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED))
  {
    /* If the timeout delay is exeeded, exit with error code */
      //while(1);
    if ((timeout--) == 0) return 0xFF;
  } 
  /* Prepare Stop after receiving data */
  I2C_GenerateSTOP(I2C1, ENABLE);

  /* Receive the Data */
  Data = I2C_ReceiveData(I2C1);

  /* return the read data */
  return Data;   
   
    }
//*******************************************************************************

Re: Modulo i2c

MensagemEnviado: 19 Jan 2020 11:56
por eletroinf
Eu sugiro olhar o documento da stm com o o bug list e ver qual é o que está atrapalhando a sua vida e qual a solução pra ele (workaround).

Re: Modulo i2c

MensagemEnviado: 19 Jan 2020 12:13
por Guri
Muito boa, vtrx, obrigado pela valiosa dica, bom trabalho! Concordo com você, sem dúvida é um martelo esse chip...

Eu baixei, eletroinfo, os docs, vou ver se consigo entender.

Por enquanto abaixei a taxa de 400khz para 100khz e parece, parece que o erro desapareceu, pelo menos momentaneamente. Mas o correto é mesmo entender onde esta esse erro e conviva com ele ou largue-o :?

Outro detalhe que notei é além do travamento do módulo que ocasiona a parada do fw, ele também não lê certas posições na eeprom...quando solicitada.
Pelo menos sabemos que é um bug do chip.

Re: Modulo i2c

MensagemEnviado: 19 Jan 2020 18:33
por vtrx
Apanhei muito na época com isso.
Eu lia sequencialmente dados de uma 24C08,que vinha num kit,e só lia a primeira vez,depois ficava travado,não lia nada.
Achei que era minha rotina,demorei horas verificando linha por linha até procurar na net e ver que muitas pessoas tinham o mesmo problema e que era um Bug do Hardware que aleatoriamente travava a linha Acknowledge (ACK). Segundo a errata são uns capacitores de filtro(interno ao Hardware) que podiam fazer isso.
Demorei mais tempo ainda procurando rotinas alternativa para isso até achar uma Chinesa que funcionou...

Re: Modulo i2c

MensagemEnviado: 19 Jan 2020 20:32
por Guri
Isso que é doideira! Depois de muitos anos programando, você se acostuma a fazer primeiro a seguinte pergunta? E se o erro for MEU 99.99%...

Pior é quando você faz essa pergunta para sí mesmo e depois sabe que o problema era do hardware, :D