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.

[参考译文] MSP430F5438A:I2C 在主接收器模式下挂起、接收来自 BNO055的数据并保持生成时钟。

Guru**** 2587365 points
Other Parts Discussed in Thread: MSP430F5438A

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/888669/msp430f5438a-i2c-hangs-in-master-receiver-mode-receiving-data-from-bno055-and-keeps-generating-clock

器件型号:MSP430F5438A

您好!

我在这个线程 https://e2e.ti.com/support/microcontrollers/msp430/f/166/t/577689?MSP430G2553-I2C-hangs-but-keeps-generating-CLK-signal-in-communication-with-BNO055中遇到了一个与 ATIS 相似的问题 、但是在正常电源电压3.3V 上。

我尝试从 BNO055 PAGE 0中读取20个顺序寄存器值、从地址0x00处的芯片 ID 开始。 BNO_i2c_read 函数按预期从前两个寄存器(A0、FB)读取2个值、然后挂起(请参阅下面的图片)。

我检查了电源电压和所有连接-一切看起来都很好。那么、有什么其他想法、为什么主器件会意外地回复一个 NACK 并在(!(UCB3IFG 和 UCRXIFG)时卡在代码中?

设置: 使用跳线连接 到 Adafruit BNO055绝对方向传感器的定制板上的 MSP430F5438A。

将 TI DriverLib 用于 MSP430器件的代码:

#include 
#include 
#include "UCS.h"
#include "USCI_b_i2c.h"
#include "GPIO.h"
#include "bno055.h"

#define blue_LED_portGPIO_port_P1
#define blue_LED_PINGPIO_PIN2
#define RST_PINGPIO_PIN4
#define RST_PORTGPIO_PORT_P2

void BNO_i2c_read (uint8_t REG_addr、uint8_t*数据、uint8_t 大小);

uint8_t sensor_data[20];
/*
main.c
*/t uCS_clockpet/

inuCS_clock_rtc (uCS_clockpet_rtc)/inuCS_clockpadc (inuCS_clock_clock_clock_clockpit_clock_clockpit_clock/inu2c)



UCS 时钟分频器1);
UCS 初始时钟信号(UCS_FLLREF、UCS_REFOCLK_SELECT、UCS_CLOCK 分频器1);
UCS_initFLL (8000、 244);//参考32.768kHz







i2c_b_param.selectClockSource
//将 BNO 置于复位 GPIO_setOutputLowOnPin (RST_PORT、RST_PIN);GPIO_setAsOutputPin (RST_PORT、RST_PIN);//配置 I2C */ USCI_B_I2C_initMasteri2c_param ={0};USCI_CLK_USCI_param_param_clb_m_param_m_u2c

= USCI_clk_param_u_clk_param_u_clk_clk_param_u_clk_clk_param_clk_param_clk_param_clk_u_u_clk_param_clk_param_clk_param_param_clk_param_param_clk_u_ i2c_b_param);
USCI_B_I2C_setSlaveAddress (USCI_B3_base、BNO055_I2C_ADDR1);//指定从器件地址
GPIO_setAsOutalModuleFunctionPin (GPIO_PORT_P10、GPIO_PIN1|GPIO_PIN2);//指定 USCI_R55_RST_Outdelay




周期;//为100MHz (USCI_RST_R20MHz)(055_RST_RST_RST_N);//启动 GPIO_RESPONPONPOND20MHz (100MHz)(100MHz)(100_RST_RST_RST_RESTON_RST_RST_RST_RST_NOR 周期);//启动 GPIO_//传感器设置形成复位的8MHz 时钟的有效延迟(>650ms)

//获取一些数据
while (1)
{
BNO_i2c_read (BNO055_CHIP_ID_ADDR、SENSOR_DATA、20);
}

}



//
*用于从 BNO055传感器读取数据的函数
*>第一个寄存器的 uint8_t reg_addr 地址
*>用于保存数据的数据数组的 uint8_t*
> uint8_t 大小要读取的连续寄存器数(地址自动增量)
*/

void BNO_i2c_read (uint8_t reg、adt) uint8_t* data、uint8_t size){
uint8_t k=0;
USCI_B_I2C_ENABLE (USCI_B3_base);
UCB3IFG &=~(UCTXIFG|UCRXIFG);
//发送
UCB3CTL1 |= UCTR + UCTXSTT;//开始。 传输模式。
在(!(UCB3IFG 和 UCTXIFG)时发送从器件地址;//等待 TX 缓冲区准备就绪
UCB3TXBUF = REG_addr;//写入要传输的数据(寄存器地址)
while (UCB3CTL1 & UCTXSTT);//如果
(UCB3IFG & UCNACKIFG){
UCB3CTL1 |= UCTXSTP、则直到开始条件结束/轮询/停止。 如果从器件地址未被应答。 UCBxTXBUF
将在(UCB3CTL1和 UCTXSTP);
USCI_B_I2C_DISABLE (USCI_B3_base);
return;
}时被丢弃 
//接收 数据[k]= UCB3RXBUF; //UCB3IFG &=~UCRXIFG; UCB3CTL1 &=~UCTR;//接收器模式 UCB3CTL1 |= UCTXSTT;//重新启动。 发送从机地址。 while (UCB3CTL1 & UCTXSTT);//如果 (UCB3IFG & UCNACKIFG){ UCB3CTL1 |= UCTXSTP;//停止则轮询至开始条件结束。 如果从器件地址未被应答。 UCBxTXBUF 将被丢弃 while (UCB3CTL1 & UCTXSTP); USCI_B_I2C_DISABLE (USCI_B3_base); return; } for (k=0;k<(size-1);k++){ while (!(UCB3IFG & UCRXIFG))); data = UCBXSTP/ UCB3STP/ UCB3STP/ UCBXSTP/ UCB3STP/停止 。 while (!(UCB3IFG 和 UCRXIFG));//等待数据 [k]= UCB3RXBUF; while (UCB3CTL1 & UCTXSTP);//轮询直到之前的数据传输完成 USCI_B_I2C_DISABLE (USCI_B3_base); }

使用 Pulse View 软件记录的整个情况:

我已经为这个问题解决了一段时间、因此、如果能帮助解决这个问题、我将不胜感激。

此致、

阿尔达斯。

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

    近似原因是 MSP430 I2C 单元是第二个字节的 NACK、因此 BNO055停止发送。 I2C 单元似乎不知道它已经完成了这个操作、所以它一直在尝试接收。

    这听起来像 Erratum USCI30一样可疑、它描述了(工程术语:)如果允许主接收器超限、则会出现" goofy"结果。 [参考勘误表》(SLAZ290AB)第34页]。 错误 NACK 不被描述为症状之一、但可能还有其他问题。

    我认为溢出很可能:当 I2C 以500kHz 的频率运行、MCLK 以~1MHz 的频率运行时、您有(2*9)=18个 CPU 时钟在 RXBUF 字节溢出之前将其抓取。 这可能是3-4条指令。

    USCI30说明提供了一些权变措施、但它们看起来相当复杂。 我建议首先尝试降低 I2C 时钟的速度-即使是100kHz 也可能足够慢。 这将为 CPU 提供获取 RXBUF 的时间、以避免溢出。

    或者、尝试加快 CPU (MCLK)速度。

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

    您好、Bruce、

    感谢您的观看。 我对 Erratum USCI30有类似的想法、但当我将 I2C 数据速率降低到100kbps 时、问题仍然存在-我得到了相同的结果。

    然而、通过研究时钟频率的增加、我发现了 MSP430F5438A 运行的一些其他方面-它有多个内核电压电平(VCORE)、必须根据 CPU 时钟频率选择这些电压电平。  大多数应用不需要更改默认的 VCORE 设置、也不需要更改我的应用(运行频率@ 8MHz)、然而、在将 内核电压增加到3级(1.85V)后、我的 I2C 通信开始工作。 我不能完全确定原因、这不是一个完美的解决方案、因为我找不到问题的实际原因、但我现在就会使用它。  

    此致、
    阿尔达斯