TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: micro_pepe en 27 de Febrero de 2017, 11:14:04

Título: Leer EEPROM externa en XC8
Publicado por: micro_pepe 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!!!
Título: Re:Leer EEPROM externa en XC8
Publicado por: KILLERJC 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
Título: Re:Leer EEPROM externa en XC8
Publicado por: micro_pepe 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.