Modulo i2c

Software e Hardware para uC STM

Moderadores: andre_luis, 51

Modulo i2c

Mensagempor Guri » 18 Jan 2020 13:05

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
DEUS SEJA LOUVADO
GURI (VonNilmam)
Guri
Byte
 
Mensagens: 457
Registrado em: 25 Abr 2010 09:05
Localização: Minas Gerais

Re: Modulo i2c

Mensagempor eletroinf » 18 Jan 2020 13:13

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.
"De cada um segundo sua capacidade a cada um segundo sua necessidade."
Avatar do usuário
eletroinf
Word
 
Mensagens: 948
Registrado em: 12 Out 2006 14:59
Localização: Santa Maria - RS

Re: Modulo i2c

Mensagempor Guri » 18 Jan 2020 13:55

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. :)
DEUS SEJA LOUVADO
GURI (VonNilmam)
Guri
Byte
 
Mensagens: 457
Registrado em: 25 Abr 2010 09:05
Localização: Minas Gerais

Re: Modulo i2c

Mensagempor vtrx » 18 Jan 2020 18:55

o STM103 tem um bug.
Só sei a solução usando o Keil.
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Re: Modulo i2c

Mensagempor Guri » 18 Jan 2020 23:08

E qual seria essa solução? Talvez por software, já que o bug é no hardware do módulo i2c.
DEUS SEJA LOUVADO
GURI (VonNilmam)
Guri
Byte
 
Mensagens: 457
Registrado em: 25 Abr 2010 09:05
Localização: Minas Gerais

Re: Modulo i2c

Mensagempor vtrx » 19 Jan 2020 08:03

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;   
   
    }
//*******************************************************************************
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Re: Modulo i2c

Mensagempor eletroinf » 19 Jan 2020 11:56

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).
"De cada um segundo sua capacidade a cada um segundo sua necessidade."
Avatar do usuário
eletroinf
Word
 
Mensagens: 948
Registrado em: 12 Out 2006 14:59
Localização: Santa Maria - RS

Re: Modulo i2c

Mensagempor Guri » 19 Jan 2020 12:13

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.
DEUS SEJA LOUVADO
GURI (VonNilmam)
Guri
Byte
 
Mensagens: 457
Registrado em: 25 Abr 2010 09:05
Localização: Minas Gerais

Re: Modulo i2c

Mensagempor vtrx » 19 Jan 2020 18:33

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...
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Re: Modulo i2c

Mensagempor Guri » 19 Jan 2020 20:32

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
DEUS SEJA LOUVADO
GURI (VonNilmam)
Guri
Byte
 
Mensagens: 457
Registrado em: 25 Abr 2010 09:05
Localização: Minas Gerais


Voltar para STMicroelectronics

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x