您好!
我在理解 i2c 通信时遇到问题。
我已经为 i2c 设置了 eusci b、我正在尝试使用它读取/写入 VL53L0X 传感器。 问题是、每当我想写入某个内容时、我的逻辑分析仪会显示、我正在写入0xFF。 当我进行分步调试时、我可以看到我正在写入正确的数据、因此我猜缺少一个环路或延迟、但我找不到哪里...
首先、我的初始化代码:
void i2cInit(){
UCB0CTLW0 |= UCSWRST;//置入 SW 复位
UCB0CTLW0 |= UCSSEL_3;//选择 SMCLK
UCB0BRW = 40;//设置预分频器= 80 => 100kHz
UCB0CTLW0 |= UCMODE_3;//进入 I2C 模式
UCB0CTLW0 |= UCMST;//进入主控模式
UCB0I2CSA = 0x29;//从器件地址= 0x29
UCB0TBCNT = 1;//默认字节计数= 1
UCB0CTLW1 |= UCASTP_2;//自动停止模式
P1SEL1 &=~BIT3;// P1.3 = SCL
P1SEL0 |= BIT3;
P1SEL1 &=~BIT2;// P1.2 = SDA
P1SEL0 |= BIT2;
UCB0CTLW0 &=~UCSWRST;//退出软件复位
_delay_cycles (10000);
}
然后是我的读取寄存器代码
int i2cReadReg (uint8_t reg、uint8_t * dest、uint16_t timeout){
int toCounter = 0;
UCB0TBCNT = 1;
UCB0CTLW0 |= UCTR;//进入 Tx 模式
UCB0CTLW0 |= UCTXSTT;// gen start
while (UCB0CTLW0 & UCTXSTT)//等待发送 START 信号
{
if (toCounter++>超时)
返回-1;
}
UCB0TXBUF = reg;//写入寄存器
while (UCB0IFG &!UCTXIFG)//等待 Tx 缓冲区为空
{
if (toCounter++>超时)
返回-2;
}
while (UCB0CTL1 & UCTXSTP)//等待 STOP
{
if (toCounter++>超时)
返回-3;
}
UCB0CTLW0 &=~UCTR;//置于 Rx 模式
UCB0CTLW0 |= UCTXSTT;// gen start
while (UCB0CTLW0 & UCTXSTT)//等待发送 START 信号
{
if (toCounter++>超时)
返回-4;
}
while (UCB0IFG &!UCRXIFG)//等待 Rx 数据到达
{
if (toCounter++>超时)
返回-5;
}
*目的地= UCB0RXBUF;
while (UCB0CTL1 & UCTXSTP)//等待 STOP
{
if (toCounter++>超时)
return -6;
}
返回1;
}
在下面、您可以看到激活和不启用调试的逻辑分析仪的图像。 在开始之前、我尝试在开始和数据集之间添加一些_delay_cycles。。。 没有帮助。
我出了什么问题?
PS:抱歉、"代码"标签给我带来了错误...
无调试:
使用调试: