Programación Específica > Programación en C
Memoria I2c
(1/1)
vane_ccs:
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 --- #include <p18F4620.h>#include <xlcd.h>#include <delays.h>#include <i2c.h> unsigned char data_w = 'a';unsigned char data_r; void config_I2C(void){ OpenI2C(MASTER, SLEW_ON);// Initialize I2C module SSPADD = 12; //400kHz Baud clock(9) @8MHz } unsigned char LeerBI2C(char Address) // Escribe un byte a un esclavo en I2C{ char DATA_I2C; IdleI2C(); // ensure module is idle StartI2C(); // initiate START condition while ( SSPCON2bits.SEN ); // wait until start condition is over WriteI2C( Address ); // Selecciona el dispositivo esclavo IdleI2C(); // Asegura que el modulo este desocupado if ( !SSPCON2bits.ACKSTAT ) // Prueba por la condicion de ACK, si es recibida { DATA_I2C = ReadI2C(); IdleI2C(); // ensure module is idle StopI2C(); // send STOP condition while ( SSPCON2bits.PEN ); // wait until stop condition is over } return DATA_I2C;} void delayms(int tiempo) // delays en ms a 20MHz{ int cuenta_ = 0; while ( cuenta_ < tiempo ) { Delay1KTCYx(2); cuenta_++; }} void main(void){ TRISAbits.TRISA6 = 0; TRISAbits.TRISA7 = 0; config_I2C(); OpenXLCD(FOUR_BIT & LINES_5X7); EEByteWrite(0xA0,0x70, data_w); delayms(1000); data_r = LeerBI2C(0x70); SetDDRamAddr(0x00); putcXLCD(data_r); }
La funcion EEByteWrite es de la libreria I2c del compilador C18. Y este es el codigo:
--- Código: Text --- unsigned char EEByteWrite( unsigned char control, unsigned char address, unsigned char data ){ IdleI2C(); // ensure module is idle StartI2C(); // initiate START condition while ( SSPCON2bits.SEN ); // wait until start condition is over if ( PIR2bits.BCLIF ) // test for bus collision { return ( -1 ); // return with Bus Collision error } else // start condition successful { if ( WriteI2C( control ) ) // write byte - R/W bit should be 0 { return ( -3 ); // set error for write collision } IdleI2C(); // ensure module is idle if ( !SSPCON2bits.ACKSTAT ) // test for ACK condition received { if ( WriteI2C( address ) ) // write word address for EEPROM { return ( -3 ); // set error for write collision } IdleI2C(); // ensure module is idle if ( !SSPCON2bits.ACKSTAT ) // test for ACK condition received { if ( WriteI2C( data ) ) // data byte for EEPROM { return ( -3 ); // set error for write collision } } else { return ( -2 ); // return with Not Ack error condition } } else { return ( -2 ); // return with Not Ack error condition } } IdleI2C(); // ensure module is idle StopI2C(); // send STOP condition while ( SSPCON2bits.PEN ); // wait until stop condition is over if ( PIR2bits.BCLIF ) // test for bus collision { return ( -1 ); // return with Bus Collision error } return ( 0 ); // return with no error}
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 ©:
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:
Navegación
Ir a la versión completa