- 打卡等级:以坛为家III
- 打卡总天数:607
- 最近打卡:2026-05-01 05:59:49
金牌会员
- 积分
- 2857
|
发表于 2026-4-22 15:54:21
|
显示全部楼层
// 软件 I2C 函数(VL53L0X)- 标准协议,含ACK检查
void I2C_Start(void)
{
SDA = 1; SCL = 1; delay_us(5);
SDA = 0; delay_us(5);
SCL = 0; delay_us(5);
}
void I2C_Stop(void)
{
SDA = 0; SCL = 1; delay_us(5);
SDA = 1; delay_us(5);
}
void I2C_SendByte(u8 dat)
{
u8 i;
for (i = 0; i < 8; i++) {
if (dat & 0x80) SDA = 1;
else SDA = 0;
dat <<= 1;
delay_us(2);
SCL = 1; delay_us(2);
SCL = 0; delay_us(2);
}
SDA = 1; delay_us(2);
SCL = 1; delay_us(2);
}
u8 I2C_CheckAck(void)
{
u8 ack = 0;
if (SDA == 0) ack = 1;
SCL = 0; delay_us(2);
return ack;
}
// ... I2C读写函数完整版见附件
//==========================================================================
// VL53L0X 寄存器定义
#define VL53L0X_ADDR 0x29
#define REG_IDENTIFICATION_MODEL_ID 0xC0
#define REG_SYSRANGE_START 0x00
#define REG_RESULT_RANGE_STATUS 0x14
u8 gbuf[16];
// 块读取函数(一次性读取12字节距离数据)
void read_block_data_at(u8 reg, u8 len, u8 *buf)
{
u8 i;
I2C_Start();
I2C_SendByte((VL53L0X_ADDR << 1) | 0);
I2C_CheckAck();
I2C_SendByte(reg);
I2C_CheckAck();
I2C_Stop();
I2C_Start();
I2C_SendByte((VL53L0X_ADDR << 1) | 1);
I2C_CheckAck();
for (i = 0; i < len; i++) {
buf = I2C_ReadByte();
if (i == len - 1) I2C_SendNak();
else I2C_SendAck();
}
I2C_Stop();
}
|
|