5 votos

i2c en una lógica diferente nivel de dispositivos

Estoy teniendo problemas para hacer LPC2148 trabajo con sensor SRF10. LPC es de 3.3 v dispositivo con 5v compatible con i2c (al menos el usuario docu afirma que). En el otro lado hay SRF10 dispositivo que es de 5v. He probado con ambos niveles como pull-up lvl conectado con la resistencia de 4,7 k (tengo 3 dispositivos en la misma línea de lo que he usado más alto valor de la resistencia).

Cosa extraña es que a veces leer el valor correctamente, pero no para leer valores de 2 registros... Básicamente, no funciona.

I2c bad readout

Ahora, lo que es extraño en esta foto, es que la lógica de lvl en SDA es 0 por defecto y debe ser 1. Eso significa que pull-up no es para hacer bien el trabajo ? Que podrían estar relacionados con la lógica de lvl diferencias entre la uc y el esclavo ?

EDIT:01.03

Aquí está la implementación de mi 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;   
}

3voto

jason saldo Puntos 5036

Veo válido de inicio y la reanudación de las condiciones en su forma de onda, así que no creo que la IASD es la "polaridad incorrecta'. El inicio es válida la condición es que hay 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 la SDA se mantiene baja después de que el maestro Ack el esclavo no debería ser un problema, mientras que el maestro se libera antes de la siguiente flanco de subida de SCL.

Un problema puede ser el tamaño de los pull-ups. Si usted está tratando de operar más rápido que 100kHz, usted puede necesitar más rígida pull-ups para asegurar los bordes son afilados.

Otra cuestión es que el maestro debe NACK la última espera leer byte, incluso si es válido de datos, ya que muchos de los esclavos esperar un NACK antes de permitir que un válido condición de parada. Para que tu solo byte lee, el maestro debe NACK el byte de datos. Para la 16 bits de los registros, se debe ACK el primer byte y la NEGACIÓN de la segunda. He visto unos cuantos dispositivos esclavos colgar el autobús o el mal funcionamiento si la última lectura no es 'terminado' por un NACK.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X