vl6180x_i2c.c
I2C通信
获取VL6180x地址
可以知道7位地址为0x29
写: 0x52
读: 0x53
写入数据
/*
* 通过I2C总线向某一寄存器写入一个字节数据
* 成功 0
* 失败 1
*/
uint8 VL6180X_WriteBytes(uint8 I2C_addr,uint16 index,uint8 dat)
{
uint8 Index_H = (uint8)(index >> 8);
uint8 Index_L = (uint8)(index & 0xff);
start();
iic_write(I2C_addr | 0X00); //WRITE i2c
if (check_ack()==0) {
goto err;
}
iic_write(Index_H); //TDOS'register
if (check_ack()==0) {
goto err;
}
iic_write(Index_L); //TDOS'register
if (check_ack()==0) {
goto err;
}
iic_write(dat); //发送数据字节
if (check_ack()==0) {
goto err;
}
stop();
return 0;
err:
stop();
return 1;
}
读出数据
读单个数据
/*
* 通过I2C总线读出某一寄存器的数据
*/
uint8 VL6180x_ReadBytes(uint8 I2C_addr, uint16 index) {
uint8 dat;
uint8 Index_H = (uint8)(index >> 8);
uint8 Index_L = (uint8)(index & 0xff);
start();
iic_write(I2C_addr | 0X00); //WRITE i2c
if (check_ack()==0) {
goto err;
}
iic_write(Index_H); //TDOS'register
if (check_ack()==0) {
goto err;
}
iic_write(Index_L); //TDOS'register
if (check_ack()==0) {
goto err;
}
start(); //重发起动信号
iic_write(I2C_addr | 0X01); //READ
if (check_ack()==0) {
goto err;
}
dat = iic_read(); //接收读出的数据
stop();
return dat;
err:
stop();
return 0;
}
读两组数据
/*
* 通过I2C总线读出某一寄存器的数据
*/
uint16 VL6180x_Read_Two_Bytes(uint8 I2C_addr, uint16 index) {
uint8 t;
uint16 data_res;
uint8 Index_H = (uint8)(index >> 8);
uint8 Index_L = (uint8)(index & 0xff);
start();
iic_write(I2C_addr | 0X00); //WRITE i2c
if (check_ack()==0) {
goto err;
}
iic_write(Index_H); //TDOS'register
if (check_ack()==0) {
goto err;
}
iic_write(Index_L); //TDOS'register
if (check_ack()==0) {
goto err;
}
stop();
start(); //重发起动信号
iic_write(I2C_addr | 0X01); //READ
if (check_ack()==0) {
goto err;
}
t = iic_read(); //接收读出的数据
send_ack();
data_res = t;
t = iic_read(); //接收读出的数据
send_ack();
data_res = ((data_res<<8) | t);
// t = iic_read(); //接收读出的数据
// send_ack();
// data_res = ((data_res<<16) | t);
//
// t = iic_read(); //接收读出的数据
// send_ack();
// data_res = ((data_res<<24) | t);
stop();
return data_res;
err: