Autor Tema: eeprom i2c con hitech picc (problema)  (Leído 1893 veces)

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

Desconectado black_flowers

  • PIC18
  • ****
  • Mensajes: 450
eeprom i2c con hitech picc (problema)
« en: 14 de Enero de 2010, 23:44:19 »
hola tengo un problem al escribir en una eeprom. el modelo lo estoy simulando en proteus, la eeprom es la 24lc512, el micro es un 16f87a, utilizo el modulo i2c que trae el micro integrado. el lenguaje es hitec picc y el codigo es este:  (el problema está en el segundo dowhile, en el proceso de escritura ya que nunca llega a recibir el ack a la orden enviada y se queda ahí bloqueado) en el manual de la eeprom pone que en cuanto se finaliza el proceso de escritura tarda un rato en "recuperarse" por así decirlo y hay que quedar comprobando si recibimos el ack, en caso contrario hay que volver a mandar el start bit.

a ver si me podeis echar una mano (saludoss) ;-) ;-) ;-)


#include <pic1687x.h>
int lectura;
main()
{

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

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

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

//----------------------------------escritura-------------------------------
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 (STAT_RW==1);       //transmisión/recepción finalizada
}while (ACKSTAT==1);      //ack ok
SSPBUF=0x00;           //se envia address high
while (STAT_BF==1);
while (STAT_RW==1);
while (ACKSTAT==1);      
SSPBUF=0x00;            //se envía addrss low
while (STAT_BF==1);
while (STAT_RW==1);
while (ACKSTAT==1);
SSPBUF=0xff;            //se envía dato a escribir en memoria
while (STAT_BF==1);
while (STAT_RW==1);     
while (ACKSTAT==1);
PEN=1;                            //si no se manda el stop bit el proceso de escritura no se realiza.

do
{
SEN=1;      //start condition  (AQUÍ SE QUEDA BLOQUEADO)
SSPBUF=0xa0;                 // se hace lo mismo que si se fuera a escribir pero no se manda nada para escribir, es tan sólo para situar el cursor en el sitio deseado
while (STAT_BF==1);   
while (STAT_RW==1);
}while (ACKSTAT==1);      
SSPBUF=0x00;           
while (STAT_BF==1);   
while (STAT_RW==1);
while (ACKSTAT==1);
SSPBUF=0x01;           
while (STAT_BF==1);
while (STAT_RW==1);
while (ACKSTAT==1);    
PEN=1;

do
{
SEN=1;               //start condition
SSPBUF=0xa1;             // se envía codigo de inicio + block select + chip address + codigo de lectura 
while (STAT_BF==1);     
while (STAT_RW==1);
}while (ACKSTAT==1);      
RCEN=1;               //modo recepción (se borra automaticamente al terminar la recepcion)
while (STAT_BF==0);      //esperamos a que el buffer esté lleno
while (STAT_RW==1);
lectura=SSPBUF;           //leemos valor
ACKDT=0;                 //ponemos ack correcto
ACKEN=1;               //enviamos ack (se borra automáticamente)
PEN=1;                //stop condition (se borra automáticamente)

while (1);
}


 

anything