• Lunes 13 de Mayo de 2024, 01:53

Autor Tema:  Memoria I2c  (Leído 3141 veces)

vane_ccs

  • Miembro activo
  • **
  • Mensajes: 25
    • Ver Perfil
Memoria I2c
« en: Viernes 8 de Septiembre de 2006, 19:09 »
0
Hola que tal? Estoy empezando a trabajar con una memoria externa 24AA256 I2c y un pic 18F4620..

Estoy utilizando el proteus para simular el circuito y el debbuger I2c de este para observar los datos que pasan de pic a memoria y de memoria a pic.

Estoy escribiendo un byte (en este caso una a) en la memoria y luego se supone que leo el byte y lo imprimo en un lcd.

Este es mi codigo

Código: Text
  1.  
  2. #include <p18F4620.h>
  3. #include <xlcd.h>
  4. #include <delays.h>
  5. #include <i2c.h>
  6.  
  7. unsigned char data_w = 'a';
  8. unsigned char data_r;
  9.  
  10. void config_I2C(void){
  11.  
  12.   OpenI2C(MASTER, SLEW_ON);// Initialize I2C module
  13.   SSPADD = 12; //400kHz Baud clock(9) @8MHz
  14.  
  15. }
  16.  
  17.  
  18. unsigned char LeerBI2C(char Address) // Escribe un byte a un esclavo en I2C
  19. {
  20.    char DATA_I2C;
  21.   IdleI2C();                      // ensure module is idle
  22.   StartI2C();                     // initiate START condition
  23.   while ( SSPCON2bits.SEN );      // wait until start condition is over
  24.   WriteI2C( Address );      // Selecciona el dispositivo esclavo
  25.   IdleI2C();                      // Asegura que el modulo este desocupado
  26.   if ( !SSPCON2bits.ACKSTAT )     // Prueba por la condicion de ACK, si es recibida
  27.   {
  28.     DATA_I2C = ReadI2C();
  29.     IdleI2C();                   // ensure module is idle
  30.     StopI2C();                   // send STOP condition
  31.     while ( SSPCON2bits.PEN );   // wait until stop condition is over
  32.   }
  33.   return DATA_I2C;
  34. }
  35.  
  36. void delayms(int tiempo)      // delays en ms a 20MHz
  37. {
  38.   int cuenta_ = 0;
  39.   while ( cuenta_ < tiempo )
  40.   {
  41.     Delay1KTCYx(2);
  42.     cuenta_++;
  43.   }
  44. }
  45.  
  46. void main(void)
  47. {
  48.  
  49.   TRISAbits.TRISA6 = 0;
  50.   TRISAbits.TRISA7 = 0;
  51.  
  52.   config_I2C();
  53.  
  54.     OpenXLCD(FOUR_BIT & LINES_5X7);
  55.  
  56.   EEByteWrite(0xA0,0x70, data_w);
  57.  
  58.  
  59.   delayms(1000);
  60.  
  61.   data_r = LeerBI2C(0x70);
  62.   SetDDRamAddr(0x00);      
  63.   putcXLCD(data_r);
  64.  
  65. }
  66.  
  67.  
  68.  

La funcion EEByteWrite es de la libreria I2c del compilador C18. Y este es el codigo:

Código: Text
  1.  
  2. unsigned char EEByteWrite( unsigned char control, unsigned char address, unsigned char data )
  3. {
  4.   IdleI2C();                      // ensure module is idle
  5.   StartI2C();                     // initiate START condition
  6.   while ( SSPCON2bits.SEN );      // wait until start condition is over
  7.   if ( PIR2bits.BCLIF )           // test for bus collision
  8.   {
  9.     return ( -1 );                // return with Bus Collision error
  10.   }
  11.   else                            // start condition successful
  12.   {
  13.     if ( WriteI2C( control ) )    // write byte - R/W bit should be 0
  14.     {
  15.       return ( -3 );              // set error for write collision
  16.     }
  17.  
  18.     IdleI2C();                    // ensure module is idle
  19.     if ( !SSPCON2bits.ACKSTAT )   // test for ACK condition received
  20.     {
  21.       if ( WriteI2C( address ) )  // write word address for EEPROM
  22.       {
  23.         return ( -3 );            // set error for write collision
  24.       }
  25.  
  26.       IdleI2C();                  // ensure module is idle
  27.       if ( !SSPCON2bits.ACKSTAT ) // test for ACK condition received
  28.       {
  29.         if ( WriteI2C( data ) )   // data byte for EEPROM
  30.         {
  31.           return ( -3 );          // set error for write collision
  32.         }
  33.       }
  34.       else
  35.       {
  36.         return ( -2 );            // return with Not Ack error condition  
  37.       }
  38.     }
  39.     else
  40.     {
  41.       return ( -2 );              // return with Not Ack error condition  
  42.     }
  43.   }
  44.  
  45.   IdleI2C();                      // ensure module is idle  
  46.   StopI2C();                      // send STOP condition
  47.   while ( SSPCON2bits.PEN );      // wait until stop condition is over
  48.   if ( PIR2bits.BCLIF )           // test for bus collision
  49.   {
  50.     return ( -1 );                // return with Bus Collision error
  51.   }
  52.   return ( 0 );                   // return with no error
  53. }
  54.  
  55.  

Cuando corro la simulacion lo que recibo es:

en la escritura esto:  S 41 A E1 A C3 A P  
que creo que esta bien..  

y en la lectura esto:  S E1 N Sr 41 A E1 A C3 A P
que no se si este bien por el N

Y el resultado en el lcd es nada, no escribe cuando le digo que me escriba el mensaje leido...

Realmente no se lo que pasa....  :huh:

Por favor, si alguien tiene alguna idea, le agradeceria que me diera luz  ;)

Gracias...  ;)

© Jonathan ©

  • Moderador
  • ******
  • Mensajes: 1671
  • Nacionalidad: ar
    • Ver Perfil
    • http://www.einstec.com.ar
Re: Memoria I2c
« Respuesta #1 en: Lunes 11 de Septiembre de 2006, 16:59 »
0
En otro post cuentas que ya has logrado leer y escribir la memoria sin problemas :) .. serias tan amable de compartir esa rutina que utilizas.. ponla en el foro de Soluciones Hard y Soft http://foros.solocodigo.com/index.php?showforum=156 .. desde ya muchas gracias  :smartass:  :comp:
EINSTEC Tecnología «La única fuente del conocimiento es la experiencia.»

«Lo importante es no dejar de hacerse preguntas.»