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.

[参考译文] MSP430FR2433:msp430fr2433 i2c 演示导通 while (UCB0CTL1 &UCTXSTP);

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1228075/msp430fr2433-msp430fr2433-i2c-promble-on-while-ucb0ctl1-uctxstp

器件型号:MSP430FR2433
主题中讨论的其他器件:BQ34Z100

#include

#define BQ34Z100_ADDR 0xAA // BQ34Z100地址
#define SOH_ADDR_MSB 0x02 // SOH MSB 地址
#define SOH_ADDR_LSB 0x03 // SOH LSB 地址

Volatile unsigned char RXData;

int main (空)

WDTCTL = WDTPW | WDTHOLD;//关闭看门狗计时器

//配置 GPIO
P1OUT &&~BIT0;//清除 P1.0输出保持器
P1DIR |= BIT0;// LED 的方向为输出
P1SEL0 |= BIT6 | BIT7;// I2C 端口

//关闭启动时默认的高阻抗模式,以激活之前配置的端口设置
PM5CTL0 &=~μ A LOCKLPM5;

//配置 USCI_B0模块为 I2C 模式
UCB0CTLW0 |= UCSWRST;//软件复位使能
UCB0CTLW0 |= UCMODE_3 | UCMST | UCSYNC;// I2C 模式、主机模式和同步操作
UCB0BRW = 0x0008;//波特率设置为 SMCLK / 8
UCB0CTL1 &=~UCSWRST;//复位结束
UCB0IE |= UCRXIE | UCNACKIE;//使能接收中断和 NACK 中断

while (1)

__个周期 delay_cycles (2000);//等待2000 μ s

//发送 I2C 启动条件
// while (UCB0CTL1 & UCTXSTP);//确保停止信号已发送
UCB0CTL1 |= UCTR | UCTXSTT;//写入模式的 I2C 启动条件
// while (UCB0CTL1 & UCTXSTT);//等待启动条件完成

发送地址和寄存器地址 BQ34Z100 μ A
UCB0TXBUF = BQ34Z100_ADDR << 1;//发送 BQ34Z100的写地址
// while (!(UCB0IFG & UCTXIFG));//等待传输缓冲区为空
UCB0TXBUF = SOH_ADDR_MSB;//发送 SOH MSB 地址
// while (!(UCB0IFG & UCNACKIFG));//等待从设备应答

//发送重复启动条件并读取 BQ34Z100中的 SOH 数据 Ω
// while (UCB0CTL1 & UCTXSTP);//确保停止信号已发送
UCB0CTL1 &=~μ A UCTR;//切换到读取模式 μ A
UCB0CTL1 |= UCTXSTT;//重复启动条件
// while (UCB0CTL1 & UCTXSTT);//等待重复启动条件完成
UCB0CTL1 |= UCTXSTP;//第一次接收数据后停止 I2C 通信

//退出 ISR 前的延迟
___ no_operation();

//进入 LPM0模式,并启用全局中断
__ bis_SR_register (LPM0_bits|gie);
}
}

#if defined (__TI_Compiler_version__)|| defined (__IAR_SYSTEMS_ICC__)
#pragma vector = USCI_B0_vector
__interrupt void USCIB0_ISR (void)
#Elif 已定义(_ GNU _)
void __attribute__((interrupt (USCI_B0_vector))) USCIB0_ISR (void)
#else
#错误编译器不受支持!
#endif

开关(__even_in_range (UCB0IV、USCI_I2C_UCBIT9IFG))

用例 USCI_NONE:
中断;

案例 USCI_I2C_UCNACKIFG:
UCB0CTL1 |= UCTXSTT;// NACK 接收后重新启动条件
中断;

情况 USCI_I2C_UCRXIFG0:
RXData= UCB0RXBUF;//读取接收到的数据
__ bic_SR_register_on_exit (LPM0_bits);//退出 LPM0模式
中断;

默认值:
中断;
}
}

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

    > P1SEL0 |= BIT6 | BIT7;// I2C 端口

    根据数据表(SLASE59F)表6-17、UCB0SDA/SCL 位于 P1.2/P1.3上。 这可能是你现在遇到的。 请尝试改用

    > P1SEL0 |= BIT2 | BIT3;// I2C 端口

    ----------------

    >= define BQ34Z100_ADDR 0xAA // BQ34Z100地址

    根据 BQ34Z100数据表(SLUSAU1C)第7.2.14.5节、I2C 地址为0x55。 请尝试改用:

    >= define BQ34Z100_ADDR 0x55 // BQ34Z100地址

    ----------------

    >UCB0TXBUF = BQ34Z100_ADDR << 1;//发送 BQ34Z100的写地址

    目标 I2C 地址应分配给 UCB0I2CSA、且不应移位。 删除此行、并在设置 UCTXSTT 之前添加该行:

    > UCB0I2CSA = BQ34Z100_ADDR;//发送 BQ34Z100的写地址

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

    2)使新的可启动功能(UCB0CTL1 & UCTXSTT);//等待启动条件完成