Autor Tema: problema con escritura en memoria 24lc (i2c)  (Leído 3034 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado black_flowers

  • PIC18
  • ****
  • Mensajes: 450
problema con escritura en memoria 24lc (i2c)
« en: 17 de Mayo de 2010, 11:16:20 »
hola estoy intentando escribir dos bytes (y leer) en una memoria 24lcxx (de 1Mbit). La memoria es i2c y el codigo que utilizo es el siguiente (voy a poner solo el trozo relevante que es donde me falla:

//------------------------------configuración de entradas salidas digitales en puerto a para el lcd


PCFG3=0;
PCFG2=1;
PCFG1=1;
// PCFG0=x; no influye
//------------------------------------puertos a y b como output----------------------------
TRISA=0x00;
TRISB=0x00;
//---------------------inicializamos i2c--------------------------------

TRISC3=1;  //ponemos los tris de scl y sda a 1 para el i2c (al estar en colector abierto necesitan resistencia pullup)
TRISC4=1;

SSPADD=0x13; //baudrate 100khz

SSPM3=1;   //i2c master mode
SSPM2=0;
SSPM1=0;
SSPM0=0;

SSPEN=1;    //habilitamos sda y scl como puertos serie i2c


//-----------------------inicializar lcd--------------------------------

lcd_init();
lcd_clear();
lcd_puts("hola");


//----------------------------------escritura-------------------------------


SEN=1;      //start condition (se borra automáticamente)
SSPBUF=0xa0;                 // se envía codigo de inicio + block select + chip address (la dirección se configura en los pines del integrado)+ codigo de escritura
while (STAT_BF==1);       //buffer enviado
while (ACKSTAT==1);      //ack ok
while (STAT_RW==1);       //transmisión/recepción finalizada
SSPBUF=0x00;           //se envia address high
while (STAT_BF==1);
while (ACKSTAT==1);
while (STAT_RW==1);   
SSPBUF=0x00;            //se envía addrss low
while (STAT_BF==1);
while (ACKSTAT==1);
while (STAT_RW==1);
SSPBUF=0x41;            //se envía dato a escribir en memoria
while (STAT_BF==1);    
while (ACKSTAT==1);
while (STAT_RW==1);
PEN=1;


do
{
SEN=1;     //start condition (se borra automáticamente)
SSPBUF=0xa0;   // se envía codigo de inicio + block select + chip address (la dirección se configura en los pines del integrado)+ codigo de escritura
while (STAT_BF==1);   //buffer enviado
}
while (ACKSTAT==1);  //ack ok  ************************************* aquí se bloquea, nunca recibe el ack
while (STAT_RW==1);       //transmisión/recepción finalizada
SSPBUF=0x00;           //se envia address high
while (STAT_BF==1);
while (ACKSTAT==1);
while (STAT_RW==1);   
SSPBUF=0x01;            //se envía addrss low
while (STAT_BF==1);
while (ACKSTAT==1);
while (STAT_RW==1);
SSPBUF=0x41;            //se envía dato a escribir en memoria
while (STAT_BF==1);    
while (ACKSTAT==1);
while (STAT_RW==1);
PEN=1;



la primera escritura la realiza bien (lo he comprobado leyendo la memoria)
la segunda no pasa del primer do while, ya que nunca recibe el ack.

no se si sabreis decirme si está correcto o hay algún error en el código para el proceso de lectura.

un saludo.
« Última modificación: 17 de Mayo de 2010, 11:18:52 por black_flowers »

Desconectado ASTROCAR

  • PIC24F
  • *****
  • Mensajes: 664
Re: problema con escritura en memoria 24lc (i2c)
« Respuesta #1 en: 17 de Mayo de 2010, 11:21:55 »
Hola buenos dias oye si estas usando el compilador ccs porque no usas las librerias y se te facilita todo el tema de i2c.

Saludos.
Atten.
Alexander santana.
Venezuela-Barcelona.
EL APRENDER ES NADA; MEJOR ES COMPARTIR EL APRENDIZAJE

Desconectado black_flowers

  • PIC18
  • ****
  • Mensajes: 450
Re: problema con escritura en memoria 24lc (i2c)
« Respuesta #2 en: 17 de Mayo de 2010, 13:29:47 »
Hola buenos dias oye si estas usando el compilador ccs porque no usas las librerias y se te facilita todo el tema de i2c.

Saludos.
Atten.
Alexander santana.
Venezuela-Barcelona.

estoy utilizando hitech-picc, y hay tambien una libreria para ello , lo que pasa es que estab intentando hacerlo yo con mi codigo, aunque veo que con estos problemas no va a ser posible. Por cierto en proteus me funcionaba bien.

un saludo.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: problema con escritura en memoria 24lc (i2c)
« Respuesta #3 en: 17 de Mayo de 2010, 17:23:06 »
Tal vez no te "responde" la memoria porque está ocupada en el ciclo de escritura. Aunque parece que con el ciclo do-while que incluís estarías evitando eso, al menos por lo poco que sé esa parecería la idea, ya que enviás repetidas veces el Address hasta que te responda la memoria.

¿Qué función cumple la línea PEN= 1?
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado black_flowers

  • PIC18
  • ****
  • Mensajes: 450
Re: problema con escritura en memoria 24lc (i2c)
« Respuesta #4 en: 17 de Mayo de 2010, 18:25:18 »
Tal vez no te "responde" la memoria porque está ocupada en el ciclo de escritura. Aunque parece que con el ciclo do-while que incluís estarías evitando eso, al menos por lo poco que sé esa parecería la idea, ya que enviás repetidas veces el Address hasta que te responda la memoria.

¿Qué función cumple la línea PEN= 1?

PEN=1; es el bit de stop. Se supone que al poner PEN=1 se transmite el bit de stop y PEN se borra automaticamente.

y tal y como has dicho , el do while es para evitar el tiempo de escritura, pero algo pasa porque se queda colgado. ¿de cuanto suele ser el tiempo de escritura en una eeprom? me imagino que menos de 5 segundos verdad? (fue el tiempo que estuvo encendido)

un saludo.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: problema con escritura en memoria 24lc (i2c)
« Respuesta #5 en: 18 de Mayo de 2010, 09:21:09 »
Supongo que el tiempo de escritura será como mucho de unos 5ms (me baso en el dato de una memoria SPI y no I2C)

Por lo que estoy leyendo en el DataSheet del 16F877 dice que no se puede llenar el Buffer inmediatamente después de haber activado el bit de Start, que hay que esperar hasta que se complete la operación de Start. También dice que si se intenta escribir SSPBUF antes de que se complete el "Start condition"  no se va a escribir dicho Buffer y el bit WCOL se hará 1..

Tal vez te funciona bien en la primera oportunidad de pura casualidad. Intentá agregando un delay de unos 10ms entre "SEN = 1" y SSPBUF= xxxxx.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado black_flowers

  • PIC18
  • ****
  • Mensajes: 450
Re: problema con escritura en memoria 24lc (i2c)
« Respuesta #6 en: 18 de Mayo de 2010, 16:46:29 »
Supongo que el tiempo de escritura será como mucho de unos 5ms (me baso en el dato de una memoria SPI y no I2C)

Por lo que estoy leyendo en el DataSheet del 16F877 dice que no se puede llenar el Buffer inmediatamente después de haber activado el bit de Start, que hay que esperar hasta que se complete la operación de Start. También dice que si se intenta escribir SSPBUF antes de que se complete el "Start condition"  no se va a escribir dicho Buffer y el bit WCOL se hará 1..

Tal vez te funciona bien en la primera oportunidad de pura casualidad. Intentá agregando un delay de unos 10ms entre "SEN = 1" y SSPBUF= xxxxx.
probare eso, pero de todas formas decir que lo he comprobado y el dato estaba escrito en la memoria.