¿Por qué mi dispositivo I2C (VCNL4200) envía todos los ceros cuando leo, independientemente del registro?

2

Cada vez que leo de mi VCNL4200 sobre I2C, la palabra de 16 bits que recibo es siempre 0x0000. Esto es completamente independiente del registro que estoy leyendo, y todavía ocurre cuando se lee el registro de ID de dispositivo que tiene un valor fijo distinto de cero. Esto ha sucedido en ambos chips de sensores que he probado.

Lo mejor que puedo decir es que el dispositivo lee los comandos I2C correctamente, ya que lo he comprobado y verificado que el dispositivo está haciendo lo que mi función de configuración le indica que haga. También se comporta correctamente con los bits de ACK / NACK (baja para ACK durante la escritura, permitiendo que SDA flote para el micro a ACK durante la lectura).

Los rastreos de alcance para SDA y SCL cuando intento leer el registro de ID de dispositivo se encuentran a continuación.

Código que utilizo para leer / configurar el sensor:

//count is number of bits, stop is whether or not there is a stop condition at the end
int i2cWrite(int8 address, int8 *data, int8 count, int1 stop);
int i2cRead(int8 address, int8 *data, int8 count);

int16 VCNL4200_Read(void) {
    int8 data[2] = {0};
    int8 psDataRegister[1] = {0x0E}; //0x08 is the address of the data, 0x0E for device ID
    i2cWrite(VCNL4200_I2C_ADDRESS, psDataRegister, 1, 1);
    i2cRead(VCNL4200_I2C_ADDRESS, data, 2);
    return make16(data[1], data[0]);
}

void VCNL4200_Setup(void) {
    int8 configWords[5][2]  = {
        {0xF0, 0x00},   //PS_CONF1 , PS_CONF2
        {0x00, 0x20},   //PS_CONF3 , PS_MS
        {0x00, 0x00},   //PS_CANC_L, PS_CANC_H
        {0x00, 0x00},   //PS_THDL_L, PS_THDL_H
        {0x01, 0x00}    //PS_THDH_L, PS_THDH_H
    };
    int8 configWordCurrent[3];

    for(int8 i = 0; i < 5; i++){
        configWordCurrent[0] = i+3;                             //1st byte, register address. Sequential from 0x03 to 0x07
        configWordCurrent[1] = configWords[i][0];               //2nd byte, lower byte of config word
        configWordCurrent[2] = configWords[i][1];               //3rd byte, upper byte of config word
        i2cWrite(VCNL4200_I2C_ADDRESS, configWordCurrent, 3, 1);//Send over I2C
    }
}

Se ha verificado que las funciones i2cWrite y i2cRead funcionan en otros dispositivos. Estoy usando un PIC16F1776 con el compilador CCS C.

    
pregunta Escape

2 respuestas

7

Parece que el VCNL4200 espera un repeat-start entre los dos comandos I2C, y usted Tengo dos comandos separados con una parada entre ellos.

No es muy obvio en la hoja de datos, pero este arduino driver no envía el mensaje de detención en WireEndTransmisson .

Sospecho que es el equivalente a que i2cWrite(VCNL4200_I2C_ADDRESS, psDataRegister, 1, 1); se convierta en i2cWrite(VCNL4200_I2C_ADDRESS, psDataRegister, 1, 0); en tu código.

    
respondido por el Ryan
1

En la interfaz digital puede ver, cuando está leyendo datos, que no puede enviar un mensaje de detención entre comandos. Cometí el mismo error, igual que usted, porque otros dispositivos i2c envían el mensaje de detención

    
respondido por el Luís Filipe

Lea otras preguntas en las etiquetas