Autor Tema: Leer EEPROM externa en XC8  (Leído 2159 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3216
Leer EEPROM externa en XC8
« en: 27 de Febrero de 2017, 11:14:04 »
Estoy intentando leer una eeprom externa 24LC16, no lo consigo, el bus i2c funciona correctamente pues con ese mismo micro controlo un LCD via i2c y un procesador de audio.

La libreria es la siguiente:

Código: C
  1. unsigned char leer_eeprom_ext(unsigned int dir_men_eep) {
  2.     unsigned char dato;
  3.  
  4.     StartI2C();
  5.     IdleI2C();
  6.  
  7.     WriteI2C(0xa0);
  8.     IdleI2C();
  9.    
  10.     WriteI2C(dir_men_eep >> 8);
  11.     IdleI2C();
  12.    
  13.     WriteI2C(dir_men_eep);
  14.     IdleI2C();
  15.    
  16.     RestartI2C();
  17.     IdleI2C();
  18.    
  19.     WriteI2C(0xa1);
  20.     IdleI2C();
  21.    
  22.     dato = ReadI2C();
  23.     IdleI2C();
  24.    
  25.     StopI2C();
  26.     IdleI2C();
  27.    
  28.     return dato;
  29. }

Para probarlo uso esto:

Código: C
  1. unsigned char dato0 = 0,dato1 = 0,dato2 = 0;
  2.  
  3.     dato0 = leer_eeprom_ext(0);
  4.     dato1 = leer_eeprom_ext(1);
  5.     dato2 = leer_eeprom_ext(2);

Previamente a la memoria le he grabado las tres primeras posiciones con un programador, con el leo y grabo bien, por lo tanto la memoria estará bien; pero al debugear y visualizar esas variables tienen todas el valor de la posicion 1 o la 2.

No sé que puede estar mal.

Gracias, un saludo!!!
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Leer EEPROM externa en XC8
« Respuesta #1 en: 27 de Febrero de 2017, 12:25:32 »
Segun lo leido del datasheet. El protocolo para grabar no es:

Start - Control - DireccionH - DireccionL - DatoAGuardar - Stop

En tu codigo le falta el stop, supuestamente el STOP es el que hace que se grabe.

Citar
The 24LC16B acknowledges again and the master generates a Stop condition. This initiates the internal write cycle and, during this time, the 24LC16B will not generate Acknowledge signals

En tu codigo le faltaria el dato.

Luego tambien tenes que para leer de forma Random tenes que hacer:

Start - Control(W) - DireccionH - DireccionL - Start - Control(R) - AcaDatoArecibir - NAK - Stop

Esto al menos en el primer dato, luego si son secuenciales podes seguir enviando AK porque ya sabes donde esta la direccion de memoria y seguirias leyendo de forma secuencial. Ejemplo leer 2 de forma Random

Start - Control(W) - DireccionH - DireccionL - Start - Control(R) - AcaDatoArecibir1 - AK  - AcaDatoArecibir2 - NAK - Stop

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3216
Re:Leer EEPROM externa en XC8
« Respuesta #2 en: 28 de Febrero de 2017, 19:42:26 »
Bueno, resulta que la librería i2c que viene en el xc8, tiene unas funciones para controlar una eeprom:

Código: C
  1. EEByteWrite(0xA0, dir, dato);
  2.  
  3. dato = EERandomRead(0xA0, dir);

Probé a poner el nack, pero no funcionaba:
Código: C
  1. StartI2C();
  2. WriteI2C(0xa0);
  3. WriteI2C(dir_men_eep >> 8);
  4. WriteI2C(dir_men_eep);
  5. RestartI2C();
  6. WriteI2C(0xa1);
  7. dato = ReadI2C();
  8. NotAckI2C();
  9. StopI2C();

Gracias!!! un saludo.
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡