Reconocimiento de sondeo en EEPROM

1

Estoy usando el compilador C18 y aprendí que reconocer la función de sondeo ayudará enormemente a reducir el tiempo de escritura para eliminar el retraso fijo en los métodos tradicionales. Bueno, estoy usando EEPROM 24LC256 y hay una función para reconocer el sondeo en él.

He escrito un código para Reconocer el sondeo.

  long eewrite_p( int address,int msg)
    {
        int my_response;
        int i;
        i2c_init();
                                    //if(!i2c_initialised) return '
  long eewrite_p( int address,int msg)
    {
        int my_response;
        int i;
        i2c_init();
                                    //if(!i2c_initialised) return '%pre%';
        StartI2C();                 //Send the Start Bit
        Nop();
        IdleI2C();                  //Wait to complete
        Nop();
        WriteI2C( 0xA0 );
        Nop();
        IdleI2C();
        //Wait to complete

        WriteI2C( address>>8);
        Nop();
        IdleI2C();

        WriteI2C(address&0xFF);
        Nop();
        IdleI2C();

        my_response = WriteI2C(msg);
        Nop();

        AckI2C();
        IdleI2C();

        StopI2C();              //Send the Stop condition
        Nop();
        IdleI2C();              //Wait to complete
    }
'; StartI2C(); //Send the Start Bit Nop(); IdleI2C(); //Wait to complete Nop(); WriteI2C( 0xA0 ); Nop(); IdleI2C(); //Wait to complete WriteI2C( address>>8); Nop(); IdleI2C(); WriteI2C(address&0xFF); Nop(); IdleI2C(); my_response = WriteI2C(msg); Nop(); AckI2C(); IdleI2C(); StopI2C(); //Send the Stop condition Nop(); IdleI2C(); //Wait to complete }

Bueno, este es un código antiguo sin reconocimiento de sondeo. He leído sobre el reconocimiento de sondeo para cada byte de control / Data / Address Byte es necesario. Corrígeme si estoy equivocado. ¿Debemos realizar un sondeo de reconocimiento para cada byte escrito en el chip?

Otra duda que tengo es si verificamos el acuse de recibo y si no se recibe, entonces la Hoja de datos / Notas de la aplicación dice que espere hasta que se reciba el Reconocimiento. De lo contrario, el código se sondea hasta que se recibe el Reconocimiento.

Bueno, anteriormente intenté escribir la dirección del dispositivo EE, una función tras otra, sin ningún retraso entre ellos y confío en que no se haya escrito bien. ¿Cómo puedo modificar el código actual para utilizar el sondeo de reconocimiento?

    
pregunta Rookie91

1 respuesta

1

Si una EEPROM típica confirma el primer byte después de una condición de inicio, no hay una secuencia definida de eventos a través de la cual no reconocería ningún otro byte que se envíe de acuerdo con las especificaciones. La prueba de reconocimiento después de los bytes posteriores puede ayudar a que el código detecte que algo salió mal si se produce una falla técnica y deja las cosas "fuera de sincronización", pero puede que realmente no ayude en nada a menos que el código pueda hacer algo útil en respuesta.

En mi propio código, mi enfoque normal es hacer bitbang I2C con rutinas:

bit I2C_StartRead(unsigned char address);
bit I2C_StartWrite(unsigned char address);
void I2C_PutByte(unsigned char dat);
unsigned char I2C_GetByte(void);
void I2C_Stop();

I2C_StartRead e I2C_StartWrite llevarán el reloj al máximo, liberarán el SDA y, si los datos no son altos, el reloj bajará y luego el alto hasta que lo esté. Luego, marcarán el byte de la dirección y pondrán el cable del reloj alto para el siguiente ACK, y verificarán el estado de SDA, devolviendo 1 si SDA está confirmado y 0 si no lo está.

Bit-bang I2C puede parecer complicado, pero en general me parece más fácil que usar el hardware master-I2C. Entre otras cosas, el hardware maestro I2C incluye las funciones "obtener byte y ACK" o "obtener byte y NAK", que requieren que el código se conozca antes de leer un byte si desea otro byte después. Con una implementación I2C de bit bang, se puede salir de la rutina I2C_GetByte después de leer el último bit de datos, pero sin ACKed ni NAKed, y luego hacer que la llamada next a GetByte reconozca el byte anterior ( si no hay una próxima llamada I2C_GetByte antes de la próxima I2C_StartRead o I2C_Stop, las últimas dos llamadas generarán un NAK).

    
respondido por el supercat

Lea otras preguntas en las etiquetas