您好!
我在这个线程 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);
}
我已经为这个问题解决了一段时间、因此、如果能帮助解决这个问题、我将不胜感激。
此致、
阿尔达斯。





