Hola,
Estoy simulando en proteus el acceso a unas memorias 24LC512, cuando estoy haciendo lectura, despues de haber capturado un byte hago el i2c_stop(), condicion de parada, en ese momento me sale una advertencia en el proteus que dice: "Stop condition whilst memory is tramitting data is unrealiable", puse antes de dar la condicion de parada 20 ms de retardo, pero aun asi me sigue saliendo este error. Alguien sabe si es un problema del simulador, del compilador o que estoy haciendo mal? o al menos cuales son los tiempos que debo colocar entre cada uno de los pasos del protocolo para leer datos y escribir datos en estas memorias. El codigo es el siguiente:
short int leer_memoria(long int address,BYTE device,BYTE sizedata) {
byte state,byte_control,i;
i2c_start();
delay_us(3);
byte_control = (device << 1) & 0x0E;
state = i2c_write(byte_control | 0xA0); //Selecciona la Memoria
delay_us(3);
byte_control = (device | 0xA1);
if (state==0) {
state = i2c_write(address>>8); //Parte alta de direccion
delay_us(3);
if (state==0) {
state = i2c_write(address & 0x00FF); //Parte Baja de direccion
delay_us(3);
if (state==0) {
i2c_start();
delay_us(3);
state = i2c_write(byte_control);
delay_us(3);
if (state==0) {
for (i=0;i<sizedata;i++) { //Envio de los datos
buffer[i] = i2c_read();
delay_us(3);
}
delay_ms(20);
i2c_stop();
return 1;
}
}
}
}
if (state==1) {
delay_ms(5);
i2c_stop();
return 0;
}
}
short int escribir_momoria(long int address,BYTE device,BYTE data[],BYTE sizedata) {
byte state,i;
i2c_start();
delay_us(3);
device = (device << 1) & 0x0E;
state = i2c_write(device | 0xA0); //Selecciona la Memoria
delay_us(3);
if (state==0) {
state = i2c_write(address>>8); //Envia la Parte alta de direccion
delay_us(3);
if (state==0) {
state = i2c_write(address & 0x00FF); //Parte Baja de direccion
delay_us(3);
if (state==0) {
for (i=0;i<sizedata;i++) { //Envio de los datos
state = i2c_write(data[i]);
if (state==1) {
delay_ms(5);
i2c_stop();
return 0;
}
}
delay_ms(5);
i2c_stop();
return 1;
}
}
}
if (state==1) {
delay_ms(5);
i2c_stop();
delay_us(3);
return 0;
}
}
La otra advertencia que me sales es: "ADC conversion clock period (1.80848e-07) period is possibly invalid for device clock frequency.", no entiendo por que me sale este error si no estoy usando el conversor analogo digital, lo tengo deshabilitado. La configuracion que le he dado para deshabilitarlo es la siguiente:
SET_TRIS_A(0b00010001);
setup_adc(adc_off);
setup_adc_ports(no_analogs);