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.

[参考译文] MSP430F5659:UCB1 I2C 不工作

Guru**** 2524050 points
Other Parts Discussed in Thread: MSP430F5659, MSP430F5438A

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/933244/msp430f5659-ucb1-i2c-not-working

器件型号:MSP430F5659
主题中讨论的其他器件: MSP430F5438A

我有在 UCB0上使用 MSP430F5438A 微控制器的先前设计中运行的 I2C 代码。 我们切换到 MSP430F5659、我需要移至端口8引脚5和6上的 UCB1模块。 我作为主器件运行、在这些端口引脚上什么也没有。 电路板上有外部上拉电阻器、两条线路都始终处于高电平。 I2C 例程正在轮询、因此不使用中断。

我尝试使用相同的代码切换到 UCB0模块、但它工作正常...返回 UCB1、但仍然没有任何结果。 是否有任何关于它为什么不起作用的想法? 我是否缺少关于端口8的奇数?

下面是我的 I2C 例程...

空初始化 I2C (空)

P8SEL |= BIT6;//启用 SCL 引脚
P8SEL |= BIT5;//启用 SDA 引脚

UCB1CTL1 |= UCSWRST;//将串行控制器保持在复位状态

UCB1CTL0 &=~UCSLA10;// 7位从地址
UCB1CTL0 &=~UCMM;//单主环境
UCB1CTL0 |= UCMST;//主控模式
UCB1CTL0 |= UCMODE_3;// I2C 模式
UCB1CTL0 |= UCSYNC;//同步模式

UCB1CTL1 |= UCSSEL_1;//为时钟源选择 ACLK

UCB1BR0 =(I2C_CLOCK 预分频器和0xFF);//时钟预分频器的 LSB
UCB1BR1 =(I2C_CLOCK 预分频器>> 8);//时钟预分频器的 MSB

UCB1CTL1 &=~Ω UCSWRST;//解除串行控制器复位

char I2CsendBytes (char 地址、char* txBuffer、char numBytes)

char bytesSent;//计算发送的字节数
char errorCode;//保留要返回的错误代码

错误代码= 0;//将错误代码预设为无错误

UCB1CTL1 |= UCTR;//设置为发送器模式
UCB1IFG &=~UCTXIFG;//清除 USCI_B1 TX 内部标志
UCB1I2CSA =地址;//加载地址字节
超时= 0;//初始化超时计数器
while (((UCB1CTL1 & UCTXSTP)&&(!errorCode))//等待停止位发生

if (超时> I2C_SEND_TIMEOUT)

错误代码= I2C_RX_TIMEOUT_1;


UCB1CTL1 |= UCTXSTT;//发送开始条件
字节 Sent = 0;//初始化计数器
while (bytesSent < numBytes)

超时= 0;//初始化超时计数器
while ((((UCB1IFG & UCTXIFG)=0)&&(!errorCode)//等待发送缓冲区准备就绪

IF (UCB1IFG 和 UCNACKIFG)

错误代码= I2C_Nack_received;

if (超时> I2C_SEND_TIMEOUT)

错误代码= I2C_TX_TIMEOUT_1;


UCB1IFG &=~UCTXIFG;//清除 USCI_B0 TX 内部标志
UCB1TXBUF = txBuffer[bytesSent];//加载数据字节
字节 Sent++;//递增发送的字节计数器

while ((((UCB1IFG & UCTXIFG)=0)&&(!errorCode)//等待发送缓冲区准备就绪

if (超时> I2C_SEND_TIMEOUT)

错误代码= I2C_TX_TIMEOUT_2;


UCB1IFG &=~UCTXIFG;//清除 USCI_B0 TX 内部标志
if (错误代码)

UCB1CTL1 |= UCSWRST;//将串行控制器保持在复位状态
UCB1CTL1 &=~Ω UCSWRST;//解除串行控制器复位

其他

UCB1CTL1 |= UCTXSTP;//发送停止条件

退货错误代码;

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

    大家好、感谢您的发帖!

    我将您的代码与 MSP430F665x、MSP430F565x 代码示例(修订版 I)上的简单 eUSCI_B0 I2C 主代码示例 msp430f665x_uscib0_i2c_07进行了比较。 到目前为止、我尚未在您的代码上找到异常代码。 请检查以下评论:

    1、仔细检查外部上拉电阻是否为10千欧姆

    2、将 msp430f665x_uscib0_i2c_07代码示例更改为 uscib1、并再次进行测试、因为该代码更简单且使用了中断。 不需要 P2端口映射。

    3、将代码更改为 P9.6/UCB.S 和 P9.5/UCB2SDA、而不是 P8.6/UCB.S 和 P8.5/UCB1SDA、并测试 UCB2是否按预期工作。

    谢谢!

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

    感谢您的回答...我实际上发现了原型板的缺陷、导致了问题...所以现在一切都正常了。