Autor Tema: guardar/leer 24LC1025  (Leído 3993 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado elpintas

  • PIC10
  • *
  • Mensajes: 32
guardar/leer 24LC1025
« en: 18 de Junio de 2009, 12:23:32 »
Hola a todos, estoy usando el lenguaje C18 y estoy tratando de guardar y leer datos en una memoria I2C para ser mas exactos la 24LC1025, para ello me estoy basando en la nota de aplicacion de microchip AN991.

no he modificado las funciones de leer y escribir de esta nota de aplicacion, ya que al final esta memoria de 1 Megabit que uso, es como tener 2 de 512.
lo unico es tener en cuenta luego que el control byte es ligeramente diferente a las de menor capacidad de almacenamiento.

el caso es que me escribe, pero a la hora de la lectura siempre me saca un 0xFF, haya lo que haya guardado.

y me pasa algo bastante curioso, el caso es que si el control byte en lectura lo pongo como 0xA0 en lugar de 0XA1 que es el de lectura, si que me lee

estas son muy funciones de lectura y escritura:

unsigned char ByteWriteI2C( unsigned char ControlByte, unsigned char HighAdd, unsigned char LowAdd, unsigned char data )
{
  IdleI2C2();                      // ensure module is idle
  StartI2C2();                     // initiate START condition
  while ( SSP2CON2bits.SEN );      // wait until start condition is over
  WriteI2C2( ControlByte );        // write 1 byte - R/W bit should be 0
  IdleI2C2();                      // ensure module is idle
  WriteI2C2( HighAdd );            // write address byte to EEPROM
  IdleI2C2();                      // ensure module is idle
  WriteI2C2( LowAdd );             // write address byte to EEPROM
  IdleI2C2();                      // ensure module is idle
  WriteI2C2 ( data );              // Write data byte to EEPROM
  IdleI2C2();                      // ensure module is idle
  StopI2C2();                      // send STOP condition
  while ( SSPCON2bits.PEN );      // wait until stop condition is over
  while (EEAckPolling2(ControlByte));  //Wait for write cycle to complete
  return ( 0 );                   // return with no error
}





unsigned char ByteReadI2C( unsigned char ControlByte, unsigned char HighAdd, unsigned char LowAdd, unsigned char *data, unsigned char length )
{
  IdleI2C2();                      // ensure module is idle
  StartI2C2();                     // initiate START condition
  while ( SSP2CON2bits.SEN );      // wait until start condition is over
  WriteI2C2( ControlByte );        // write 1 byte
  IdleI2C2();                      // ensure module is idle
  WriteI2C2( HighAdd );            // WRITE word address to EEPROM
  IdleI2C2();                      // ensure module is idle
  while ( SSP2CON2bits.RSEN );     // wait until re-start condition is over
  WriteI2C2( LowAdd );             // WRITE word address to EEPROM
  IdleI2C2();                      // ensure module is idle
  RestartI2C2();                   // generate I2C bus restart condition
  while ( SSP2CON2bits.RSEN );     // wait until re-start condition is over
  WriteI2C2( ControlByte | 0x01 ); // WRITE 1 byte - R/W bit should be 1 for read
  IdleI2C2();                      // ensure module is idle
  getsI2C2( data, length );       // read in multiple bytes
  NotAckI2C();                    // send not ACK condition
  while ( SSP2CON2bits.ACKEN );    // wait until ACK sequence is over
  StopI2C2();                      // send STOP condition
  while ( SSP2CON2bits.PEN );      // wait until stop condition is over
  return ( 0 );                   // return with no error
}


alguien me podria decir que estoy haciendo mal?

saludos

Desconectado pibe

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 635
Re: guardar/leer 24LC1025
« Respuesta #1 en: 18 de Junio de 2009, 12:33:02 »
ya que al final esta memoria de 1 Megabit que uso, es como tener 2 de 512.
lo unico es tener en cuenta luego que el control byte es ligeramente diferente a las de menor capacidad de almacenamiento.

el caso es que me escribe, pero a la hora de la lectura siempre me saca un 0xFF, haya lo que haya guardado.

Estás absolutamente seguro que es como 2 de 512? Me suena extraño que una memoria direccione otros 512 sin decírselo. Necesitas direccionar mas memoria , y si con una memoria de 512 puedes direccionarla con 2 bytes la de 1mb utiliza 3 bytes de direccionamiento. Claro que estoy hablando desde mi experiencia con la gama SPI, pero calculo que tanto una como otra deben tener la misma manera de direccionarlas.
Y cómo te aseguras que has escrito correctamente si cuando lees te da 0xff? Como puedes saber si no es error de escritura y no estás grabando nada y estas leyendo 0xff?
Sabes como lo hecho yo? Lo he simulado con el proteus, y ahi si que te das cuenta si REALMENTE escribes en la eeprom. Luego cuando todo funcionaba a la perfección solo tuve que llevarlo a la realidad y funcionó de perlas.
Mi jefe mirando el prototipo que estoy creando: "Y eso va a funcionar?"

Desconectado pibe

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 635
Re: guardar/leer 24LC1025
« Respuesta #2 en: 18 de Junio de 2009, 12:48:28 »
Vale, le he echado una mirada rápida al datasheet y direcciona distinto que una SPI de 1mb. Sólo utiliza 2 bytes.
De todas formas, te recomiendo que para asegurarte que grabas correctamente utilices el proteus y podrás ver los datos internos de la eeprom.
Mi jefe mirando el prototipo que estoy creando: "Y eso va a funcionar?"

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: guardar/leer 24LC1025
« Respuesta #3 en: 18 de Junio de 2009, 12:51:56 »
Esta bien lo que estas haciendo, fíjate en la rutina de lectura, el byte de control que tienes que enviar es 0xa0 (si vas a leer la parte baja, sino 0xa8) para que realice el direccionamiento, y después con:
Código: C
  1. WriteI2C2( ControlByte | 0x01 ); // WRITE 1 byte - R/W bit should be 1 for read
realiza el cambio a 0xa1 (o 0xa9) para realizar la lectura.
No contesto mensajes privados, las consultas en el foro

Desconectado elpintas

  • PIC10
  • *
  • Mensajes: 32
Re: guardar/leer 24LC1025
« Respuesta #4 en: 18 de Junio de 2009, 13:20:01 »
 gracias pive y suky por contestar

tienes razon suky, en esa linea se modifica, no me habia dado cuenta.


ahora tengo el siguiente problema, resulta que he añadido estas funciones a mi programa con la tcpip stack de microchip y si que me lee bien (y digo que me lee bien, porque he guardado un dato en una posicion de memoria con este programa y despues lo he leido desde el otro y me lee lo mismo), pero cuando le doy a escribir un dato se me queda parado en esta funcion y no me escribe, alguna sugerencia?

tengo toda la configuracion igual, excepto que aqui estoy trabajando a 41.6MHz y en el primer programa a 25MHz y he variado SSP2ADD a 0x67 para adaptarlo a esta velocidad, no se si necesito modificar algun parametro mas del modulo MSSP

se me queda parado exactamente aqui, en la linea que he puesto en rojo:

unsigned char EEAckPolling2( unsigned char control )
{
  IdleI2C2();                      // ensure module is idle
  StartI2C2();                     // initiate START condition
  while ( SSP2CON2bits.SEN );      // wait until start condition is over
  if ( PIR3bits.BCL2IF )           // test for bus collision
  {
    return ( -1 );                 // return with Bus Collision error
  }

  else
  {
    if ( WriteI2C2( control ) == -1)    // write byte - R/W bit should be 0
    {
      return ( -3 );               // set error for write collision
    }

    while ( SSP2CON2bits.ACKSTAT ) // test for ACK condition received
    {
      RestartI2C2();               // initiate Restart condition
      while ( SSP2CON2bits.RSEN ); // wait until re-start condition is over
      if ( PIR3bits.BCL2IF )       // test for bus collision
      {
        return ( -1 );             // return with Bus Collision error
      }

      if ( WriteI2C2( control ) == -1)  // write byte - R/W bit should be 0
      {
        return ( -3 );             // set error for write collision
      }
    }
  }


Desconectado elpintas

  • PIC10
  • *
  • Mensajes: 32
Re: guardar/leer 24LC1025
« Respuesta #5 en: 18 de Junio de 2009, 13:45:01 »
vale, me he equivocado antes se me para justamente en esta funcion de la funcion guardar. en la linea que esta en rojo

unsigned char WriteI2C2( unsigned char data_out )
{
  SSP2BUF = data_out;           // write single byte to SSP2BUF
  if ( SSP2CON1bits.WCOL )      // test if write collision occurred
    return ( -1 );              // if WCOL bit is set return negative #
  else
  {
    while( SSP2STATbits.BF );   // wait until write cycle is complete         
    IdleI2C2();                  // ensure module is idle
    if ( SSP2CON2bits.ACKSTAT ) // test for ACK condition received
        return ( -2 );
   else return ( 0 );               // if WCOL bit is not set return non-negative #
  }
}

la configuracion del modulo MSSP, es la siguiente, estoy usando el PIC18f97j60, y el modulo MSSP numero 2 y la velocidad como os comentaba anteriormente es de 41.6MHz:

   //here is the I2C setup for external memory
     DDRDbits.RD6 = 1; //Configure SCL2
                    //as Input
   DDRDbits.RD5 = 1; //Configure SDA2
                  //as Input
 
     //OpenI2C(MASTER, SLEW_ON);                 
     SSP2STAT = 0x80;   //Disable SMBus &
                    //Slew Rate Control
     SSP2CON1 = 0x28;   //Enable MSSP Master
     SSP2ADD = 0x67;    //Should be 0x9
                    //for 100kHz
     SSP2CON2 = 0x00;   //Clear MSSP Conrol Bits

Desconectado elpintas

  • PIC10
  • *
  • Mensajes: 32
Re: guardar/leer 24LC1025
« Respuesta #6 en: 19 de Junio de 2009, 11:17:49 »
hola de nuevo, me he dado cuenta que el programa de la stack si q puedeo guardar y leer, el problema viene cuando entro en una interrupcion del modulo Eusart que tengo y desde aqui solo me deja leer, todavia sigo sin poder grabar. alguna sugerencia?

gracias

Desconectado pibe

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 635
Re: guardar/leer 24LC1025
« Respuesta #7 en: 20 de Junio de 2009, 02:49:16 »
Probablemente sea que la eusart te está interrumpiendo mientras estás esperando que se vacíe el sspbuf? Prueba a inhabilitar interrupciones antes del vaciado/llenado de sspbuf y volver a habilitarlo después.
Mi jefe mirando el prototipo que estoy creando: "Y eso va a funcionar?"

Desconectado elpintas

  • PIC10
  • *
  • Mensajes: 32
Re: guardar/leer 24LC1025
« Respuesta #8 en: 21 de Junio de 2009, 14:17:32 »
he desactivado el bit de interrupcion, y sigue sin funcionar bien.

He decidido intentarlo con la 25LC1024 esta es SPI, a ver si con esta funciona correctamente, has trabajado alguna vez con ella?

Desconectado pibe

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 635
Re: guardar/leer 24LC1025
« Respuesta #9 en: 22 de Junio de 2009, 04:07:56 »
sip, pero en assembler.
En realidad , yo particularmente lo encuentro mas sencillo que i2c. Es cuestión de gustos.

Aqui te dejo el enclace de un programa lectura/escritura que funciona:

http://www.todopic.com.ar/foros/index.php?topic=24608.0
Mi jefe mirando el prototipo que estoy creando: "Y eso va a funcionar?"

Desconectado elpintas

  • PIC10
  • *
  • Mensajes: 32
Re: guardar/leer 24LC1025
« Respuesta #10 en: 22 de Junio de 2009, 08:21:39 »
gracias pive,

vale, acabo de conseguir guardar y leer un dato, con la 25LC1024, en un programa sencillo. esta tarde intentare guardar y leer desde la tcipc stack, a ver que pasa.

luego comento, como ha ido la cosa.

saludos

Desconectado elpintas

  • PIC10
  • *
  • Mensajes: 32
Re: guardar/leer 24LC1025
« Respuesta #11 en: 23 de Junio de 2009, 10:53:16 »
finalmente he conseguido que funcione la I2C y ademas tambien se como funciona ya la SPI, asi que gano un poco mas en experiencia en uso de memorias  8). las funciones del primer post funcionan correctamente, por si a alguien le hicieran falta, aunque es una ligera modificiacion de la nota de aplicacion 991 de microchip.

saludos


 

anything