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.