i2c en diferentes dispositivos de nivel lógico

5

Tengo problemas para que el LPC2148 funcione con el sensor SRF10. LPC es un dispositivo de 3.3v con i2c compatible con 5v (al menos el usuario docu afirma que). En el otro lado hay un dispositivo SRF10 que es 5v. He intentado con ambos niveles como lvl pull-up conectado con una resistencia de 4.7 k (tengo 3 dispositivos en la misma línea, así que usé una resistencia de mayor valor).

Lo extraño es que a veces lee el valor correctamente pero no puede leer los valores de 2 registros ... Básicamente, no funciona.

Ahora, lo que es extraño en esta imagen, es que la lógica lvl en SDA es 0 por defecto y debería ser 1. ¿Eso significa que el pull-up no está haciendo bien el trabajo? ¿Podría estar relacionado con las diferencias lógicas de lvl entre uc y esclavo?

EDIT: 01.03

Aquí está mi implementación del estado 0x50, a_chn es i2c0 o i2c1

void slaveDataReceived (uint8_t a_chn)
{
uint8_t k;
volatile unsigned char *i2cConClear;
volatile unsigned char *i2cConSet;
volatile unsigned char *i2cData;

if (a_chn == 1) {
    i2cData = (volatile unsigned char *)(0xE005C008);
    i2cConClear = (volatile unsigned char *)(0xE005C018);
    i2cConSet = (volatile unsigned char *)(0xE005C000);
    }
else {
    i2cData = (volatile unsigned char *)(0xE001C008);
    i2cConClear = (volatile unsigned char *)(0xE001C018);
    i2cConSet = (volatile unsigned char *)(0xE001C000);
    }   

k = *i2cData;
appendToDataBuffer (a_chn, k);
if (i2cDataRcv[a_chn] == i2cDataHead[a_chn]){
    I2CMasterState[a_chn] = I2C_IDLE;
    *i2cConSet = I2CON_SET_STO;
    *i2cConClear = I2CON_CLR_AAC;
    }
else {
    *i2cConSet = I2CON_SET_AA;
    }
*i2cConClear = I2CON_CLR_SIC;   
}
    
pregunta Gossamer

1 respuesta

3

Veo condiciones válidas de inicio y reinicio en su forma de onda, por lo que no creo que SDA sea la 'polaridad incorrecta'. La condición de inicio válida está ahí antes de escribir 0xC0 (indicado por el primer punto verde en la captura) y el reinicio válido es el segundo punto verde (antes de 0xC1). El hecho de que SDA permanezca bajo después de que el maestro ACKs, el esclavo no debería ser un problema, siempre que el maestro lo libere antes del siguiente flanco ascendente de SCL.

Un problema podría ser el tamaño de los pull-ups. Si está intentando operar a más de 100 kHz, es posible que necesite estiramientos más rígidos para asegurarse de que los bordes estén afilados.

Otro problema es que el maestro debe NACK el último byte de lectura esperado, incluso si son datos válidos, ya que muchos esclavos esperan un NACK antes de que permitan que se cumpla una condición de parada válida. Para sus lecturas de un solo byte, el maestro debe NACK el byte de datos. Para los registros de 16 bits, debe ACK el primer byte y NACK el segundo. He visto que un buen número de dispositivos esclavos cuelgan del bus o funcionan mal si la última lectura no es "terminada" por un NACK.

    
respondido por el Adam Lawrence

Lea otras preguntas en las etiquetas