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.

[参考译文] CCS/MSP430F5529:MSP430:轮询发送中断标志条件时出现问题

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/771103/ccs-msp430f5529-msp430-problem-with-poll-for-transmit-interrupt-flag-condition

器件型号:MSP430F5529
主题中讨论的其他器件:MSP432P401RBOOSTXL-BATPAKMKII

工具/软件:Code Composer Studio

您好、TI 团队、  

我使用 MSP430F5529LP 通过 I2C 与 BOOSTXL‑BATPAKMKII 进行通信。

这是 一个来自 USCI_B_i2c.c (MSP430 driverlib)的函数 USCI_B_I2C_masterSendSingleByteWithTimeout 的代码源

bool USCI_B_I2C_masterSendSingleByteWithTimeout (uint16_t baseAddress、
uint8_t txData、
uint32_t 超时)
{
//为第二个超时情形创建变量
uint32_t timeout2 =超时;

//存储当前 TXIE 状态
uint8_t txieStatus = HWREG8 (baseAddress + OFS_UCBxIE)& UCTXIE;

//禁用发送中断使能
HWREG8 (baseAddress + OFS_UCBxIE)&=~(UCTXIE);

//发送启动条件。
HWREG8 (baseAddress + OFS_UCBxCTL1)|= UCTR + UCTXSTT;

//轮询发送中断标志。
while ((!(HWREG8 (baseAddress + OFS_UCBxIFG)& UCTXIFG))&&-超时)
{
;
}

//检查传输是否超时
if (超时=0)
{
返回(status_fail);
}

//发送单字节数据。
HWREG8 (baseAddress + OFS_UCBxTXBUF)= txData;

//轮询发送中断标志。
while ((!(HWREG8 (baseAddress + OFS_UCBxIFG)& UCTXIFG))&&--timeout2)//=== >此处为代码块
{
;
}

//检查传输是否超时
if (timeout2 = 0)
{
返回(status_fail);
}

//发送停止条件。
HWREG8 (baseAddress + OFS_UCBxCTL1)|= UCTXSTP;

//在再次启用中断之前清除发送中断标志
HWREG8 (baseAddress + OFS_UCBxIFG)&=~(UCTXIFG);

//恢复发送中断使能
HWREG8 (baseAddress + OFS_UCBxIE)|= txieStatus;

返回(STATUS_SUCCESS);

}

void USCI_B_I2C_masterSendMultiByteStart (uint16_t baseAddress、
uint8_t txData)
{
//存储当前发送中断使能
uint8_t txieStatus = HWREG8 (baseAddress + OFS_UCBxIE)& UCTXIE;

//禁用发送中断使能
HWREG8 (baseAddress + OFS_UCBxIE)&=~(UCTXIE);

//发送启动条件。
HWREG8 (baseAddress + OFS_UCBxCTL1)|= UCTR + UCTXSTT;

//轮询发送中断标志。
while (!(HWREG8 (baseAddress + OFS_UCBxIFG)& UCTXIFG))
{
;
}

//发送单字节数据。
HWREG8 (baseAddress + OFS_UCBxTXBUF)= txData;

//恢复发送中断使能
HWREG8 (baseAddress + OFS_UCBxIE)|= txieStatus;
} 

在 E2E 论坛上进行了一些研究后、我知道这可能是  SDA 和 SCL 问题上的上拉电阻器。 这是正确的问题吗??

如果是,如何在 SDA 和 SCL 引脚上设置上拉电阻器?

我将这一行代码放入代码中、但它没有解决我的问题。

P4REN |= 0x06; 

谢谢你。

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

    您好 Amine、

    是的、内部上拉电阻器可能太弱、无法有效驱动 SDA 和 SCL 线路。 通常、这些是上拉至 VCC 的外部电阻器(通常为4.7kOhm)(例如1.8V、3.3V 等)。 请通读《 MSP430TmMCU 上常见 eUSCI 和 USCI 串行通信问题的实用解决方案 》应用手册中的 I2C 部分。

    此致、

    James

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

    您好 James、

    感谢您 的回答。

    正如您在 BOOSTXL‑BATPAKMKII 上看到的 BQ27441原理图一样,您可以看到内部 上拉电阻 器驱动 SDA 和 SCL 线路的电阻值为5.1k Ω。 我认为这已经足够了  

    此外  、BOOSTXL‑BATPAKMKII 上的 BQ27441与 MSP432P401R 搭配使用时可正常工作、无需任何外部 上拉电阻器。  

    我认为问题在于 MSP430F5529配置以及如何在 SDA 和 SCL 引脚上设置上拉电阻器使能。

    如果你能帮助我,我将非常感激。

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

    在 BOOSTXL-BATPAKMKII 上组装外部5.1k Ω 上拉电阻器后、在 MSP430F5529中配置内部上拉电阻器不会真正发生任何变化、因为它们只是并联、因为线路已经上拉。 因此、我怀疑问题是硬件问题、而是软件问题。 我在《Fuel Tank MKII Battery BoosterPackTm插件模块(BOOSTXL-BATPAKMKII)用户指南》中注意到,示例代码是为 MSP432编写的。 请记住、MSP432是基于 ARM 的器件、而 MSP430F5529不是。 因此,我建议您阅读 《迁移到 SimpleLinkTmMSP432Tm系列 》应用手册,了解要使 MSP430F5529正常工作,需要做哪些更改。

    此致、

    James