This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430FR2532:不发送 EUSCI B I2C 数据

Guru**** 647180 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1055803/msp430fr2532-eusci-b-i2c-data-not-send

器件型号:MSP430FR2532

您好!

我在理解 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:抱歉、"代码"标签给我带来了错误...

无调试:

使用调试:



  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    首先、使用代码的"插入代码"小工具将其放入一个更容易滚动的窗口中。

    您在每个步骤都包含超时、这是一个好主意、但在每个步骤都无法重置计数器。 在给定超时的情况下、您需要检查返回的错误编号、以查看代码的位置。 假设您不使用最好的调试器。

    除非您已将 TXSTP 设置为生成 STOP、否则在 TXSTP 位上等待清除的代码是无用的。 在发送寄存器地址之后和重复起始之前、您不希望执行此操作。 我看到其他问题、例如在不将 I2C 硬件置于复位优先的情况下写入 TBCNT、因此可能还有更多的问题。 例如、在执行重复启动至读取模式之前、自动停止模式无法很好地发送寄存器地址。

    您可能需要再次阅读文档并查看 TI 代码示例。