Hola a todos!,
Tengo un gran detalle que me tiene mas de 5 días trabajando, ya se me acabo el tiempo y no logre hacerlo trabajar correctamente, por lo cual acudo a ustedes para saber si alguien tenga experiencia con esta practica en los micros Freescale y me pueda guiar.
Estoy intentando implementar el I2C con el JM60. Buscando en la WEB tengo que la AN3291 explica de manera detallada como conectar con una EEPROM por I2C. Ya logro escribir datos en la EEPROM, pero entre dato y dato me toca implementar un retardo de 3 milisegundos como mínimo para que funcione..
Las funciones que tengo son las siguientes:
void IIC_write_byte(UINT16 address, UINT8 data){
IICC_TXAK = 0; // RX/TX = 1; MS/SL = 1; TXAK = 0;
IICC |= 0x30; // And generate START condition;
//-------start of transmit first byte to IIC bus-----
IICD = (0xA0); // Address the slave and set up for master transmit;
while(IICS_RXAK); // check for RXAK;
while (!IICS_IICIF); // wait until IBIF;
IICS_IICIF=1; // clear the interrupt event flag;
//-----Slave ACK occurred------------
IICD = ((UINT8)(address>>8)); // Send high byte of the word address;
while(IICS_RXAK); // check for RXAK;
while (!IICS_IICIF); // wait until IBIF;
IICS_IICIF=1; // clear the interrupt event flag;
//-----Slave ACK occurred------------
IICD = ((UINT8)address); // Send low byte of the word address;
while(IICS_RXAK); // check for RXAK;
while (!IICS_IICIF); // wait until IBIF;
IICS_IICIF=1; // clear the interrupt event flag;
//-----Slave ACK occurred------------
IICD = data; // Envia Dato a Escribir
while(IICS_RXAK); // check for RXAK;
while (!IICS_IICIF); // wait until IBIF;
IICS_IICIF=1; // clear the interrupt event flag;
//-----Slave ACK occurred------------;
IICC_MST = 0; // generate STOP condition;
}
UINT8 IIC_read_byte(UINT16 address){
UINT8 data;
IICC_TXAK = 0; // RX/TX = 1; MS/SL = 1; TXAK = 0
IICC |= 0x30; // And generate START condition
IICD = (0xA0); // Address the slave and set up for master transmits
while (!IICS_IICIF); // wait until IBIF
IICS_IICIF=1; // clear the interrupt event flag
while(IICS_RXAK); // check for RXAK
//-----Slave ACK occurred------------
IICD = ((UINT8)(address>>8)); // Send high byte of the word address
while (!IICS_IICIF); // wait until IBIF
IICS_IICIF=1; // clear the interrupt event flag
while(IICS_RXAK); // check for RXAK
//-----Slave ACK occurred------------
IICD = ((UINT8)address); // Send low byte of the word address;
while(IICS_RXAK); // check for RXAK;
while (!IICS_IICIF); // wait until IBIF;
IICS_IICIF=1; // clear the interrupt event flag;
//-----Slave ACK occurred------------
IICC_RSTA = 1; // set up repeated start
IICD = (0xA1); // (slave_address) | (RW = 1)
while (!IICS_IICIF); // wait until IBIF
IICS_IICIF=1; // clear the interrupt event flag
while (IICS_RXAK); // check for RXAK
//-----Slave ACK occurred------------
IICC_TX = 0; // set up to receive
IICC_TXAK = 1; // acknowledge disable
data = IICD; // dummy read
while (!IICS_IICIF); // wait until IBIF
IICS_IICIF=1; // clear the interrupt event flag
IICC_MST = 0; // generate stop signal
data = IICD; // read right data
return(data);
}
Luego en la función main lo siguiente:
IIC_write_byte(0x0000,'E');
delay_ms(3);
IIC_write_byte(0x0001,'R');
delay_ms(3);
IIC_write_byte(0x0002,'N');
delay_ms(3);
IIC_write_byte(0x0003,'E');
delay_ms(3);
IIC_write_byte(0x0004,'S');
delay_ms(3);
IIC_write_byte(0x0005,'T');
delay_ms(3);
IIC_write_byte(0x0006,'O');
delay_ms(3);
IIC_write_byte(0x0007,'.');
delay_ms(3);
Efectivamente se escriben las palabras en la EEPROM, pero los 3 milisegundos no puedo elimnarlos. A que se debe ello?
Ahora, cuando intento leer datos..siempre me llegan ff
Ya pase por este lado donde discuten el temaYa revise la AN3291Busque en CCS como gestiona la EEPROM y encontre esto:
void write_ext_eeprom(long int address, BYTE data)
{
short int status;
i2c_start();
i2c_write(0xa0);
i2c_write(address>>8);
i2c_write(address);
i2c_write(data);
i2c_stop();
i2c_start();
status=i2c_write(0xa0);
while(status==1)
{
i2c_start();
status=i2c_write(0xa0);
}
i2c_stop();
}
Lo que encontré extraño y diferente es lo que marque en negrilla, pues si no da ACK la Eeprom, generan Reestart e intentan nuevamente, pero ese procedimiento no lo logre hacer con el JM60, pues el bit de respuesta ACK, siempre se espera a que llegue, no se alguno de ustedes ya implemento esta opción en Codewarrior.
Tienen alguna pista?