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.

[参考译文] MSP430G2553:连接 I2C 线路上的 BM180

Guru**** 2589245 points
Other Parts Discussed in Thread: MSP430G2553

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/603778/msp430g2553-interfacing-bm180-on-i2c-lines

器件型号:MSP430G2553

您好!

我尝试将 BM180模块与在 MSP430G2553芯片上运行的 MSP430超值系列 Launchpad 相连。 BM180模块安装了上拉电阻、因此我不使用其他上拉电阻。 由于 BM180在1.8V 至3.6V 之间上电、我将 launchpad 的 Vcc 连接到 BM180的 Vcc。 将 Launchpad 的 P1.6连接到 BM180的 SCL、将 P1.7连接到 BM180的 SDA。 我使用 了 msp430g2xx3_uscib0_i2c_8.c 和 msp430g2xx3_uscib0_i2c_10.c 中的代码示例、并将它们组合在一起以编写以下代码。 我的第一步是在 Rx 处获取中断并检查调试器中的缓冲区(如果发生这种情况、其余步骤更容易实现)。 下面的代码不起作用,当我调试时,我看到我只获得一个 Tx 中断一次,然后它一直保持在 TransmitI2C()中。 这意味着未发送停止位、然后我没有获得 Rx 中断。 我在这里停留了两天。 请帮我继续吗? 请指出可能出现的任何明显错误。

#include 

INT RXByteCtr、RPT_Flag = 0; //在1
个 volatile unsigned char RxBuffer[64]时启用重复启动; //分配128字节的 RAM
unsigned char TxBuffer[64];
unsigned char * PRxData; //指向 RX 数据的指针
unsigned char TXByteCtr、RX = 0;
unsigned char * PTxData; //指向 TX 数据
的指针 unsigned char TXByteCtr;


int I2C_Init (int slaveaddr)
{
WDTCTL = WDTPW + WDTHOLD; //停止 WDT
P1SEL |= BIT6 + BIT7; //将 I2C 引脚分配给 USCI_B0
P1SEL2|= BIT6 + BIT7; //将 I2C 引脚分配给 USCI_B0
UCB0CTL1 |= UCSWRST; //启用 SW 复位
UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C 主设备,同步模式
UCB0CTL1 = UCSSEL_2 + UCSWRST; //使用 SMCLK、保持软件复位
UCB0BR0 = 12; // fSCL = SMCLK/12 =~100kHz
UCB0BR1 = 0;
UCB0I2CSA = slaveaddr; //从器件地址为048h
UCB0CTL1 &=~UCSWRST; //清除 SW 复位,恢复操作
IE2 |= UCB0TXIE; //启用 TX 中断
IE2 |= UCB0RXIE; //启用 RX 中断
返回0;
}

int TransmitI2C (unsigned char * TxData、int TxData_size)
{
PTxData =(unsigned char *) TxData; // TX 数组起始地址
TXByteCtr = TxData_size; //加载 TX 字节计数
器 while (UCB0CTL1 & UCTXSTP); //确保停止条件已发送
UCB0CTL1 |= UCTR + UCTXSTT; // I2C TX、起始条件
_ bis_SR_register (CPUOFF + GIE); //输入带中断的 LPM0
//保持在 LPM0中直到所有数据
//是 TX
返回0;
}

int ReceiveI2C (int RxData_size)
{

PRxData =(unsigned char *) RxBuffer;// RX 缓冲区的开始
RXByteCtr = RxData_size; //加载 RX 字节计数
器 while (UCB0CTL1 & UCTXSTP); //确保发送了停止条件 
UCB0CTL1 &=~UCTR;            //设置为从模式 UCB0CTL1 |= UCTXSTT; // I2C 启动条件 __bis_SR_register (CPUOFF + GIE); //输入带中断的 LPM0 //保持在 LPM0中直到所有数据 //是 RX'd __no_operation(); //设置断点>>此处<<并 返回0; } int main() { I2C_Init (0x77); TxBuffer[0]= 0xAA; TransmitI2C ((unsigned char *) TxBuffer、1); ReceiveI2C (2); TxBuffer[0]= 0xAC; TransmitI2C ((unsigned char *) TxBuffer、1); ReceiveI2C (2); TxBuffer[0]= 0xAE; TransmitI2C ((unsigned char *) TxBuffer、1); ReceiveI2C (2); TxBuffer[0]= 0xB0; TransmitI2C ((unsigned char *) TxBuffer、1); ReceiveI2C (2); TxBuffer[0]= 0xB2; TransmitI2C ((unsigned char *) TxBuffer、1); ReceiveI2C (2); TxBuffer[0]= 0xB4; TransmitI2C ((unsigned char *) TxBuffer、1); ReceiveI2C (2); TxBuffer[0]= 0xB6; TransmitI2C ((unsigned char *) TxBuffer、1); ReceiveI2C (2); TxBuffer[0]= 0xB8; TransmitI2C ((unsigned char *) TxBuffer、1); ReceiveI2C (2); TxBuffer[0]= 0xBA; TransmitI2C ((unsigned char *) TxBuffer、1); ReceiveI2C (2); TxBuffer[0]= 0xBC; TransmitI2C ((unsigned char *) TxBuffer、1); ReceiveI2C (2); TxBuffer[0]= 0xBE; TransmitI2C ((unsigned char *) TxBuffer、1); ReceiveI2C (2); 返回0; }//------------------ // USCIAB0TX_ISR 的结构使其可用于通过 预加载带有字节计数的 TXByteCtr 来发送任何//字节数。 此外、TXData //指向要发送的下一个字节。 ///---------------------------------- #pragma vector = USCIAB0TX_VECTOR _INTERRUPT void USCIAB0TX_ISR (void) { IF (TXByteCtr) //检查 TX 字节计数 器{ UCB0TXBUF =* PTxData++; //加载 TX 缓冲区 TXByteCtr --; //减量 TX 字节计数 器} 否则 { UCB0CTL1 |= UCTXSTP; // I2C 停止条件 IFG2 &=~UCB0TXIFG; //清除 USCI_B0 TX int 标志 _BIC_SR_REGISTER_ON_EXIT (CPUOFF); //退出 LPM0 } }-->----------------- // USCI_B0数据 ISR 用于将接收到的数据从 I2C 从器件//移动 到 MSP430存储器。 它的结构使得它能够通过 预先载入带有字节计数的 RXByteCtr 来被用来接收//任一2+数量的字节。 ///---------------------------------- #pragma vector = USCIAB0RX_Vector __interrupt void USCIAB0RX_ISR (void) { RXByteCtr --; //减量 RX 字节计数 器 if (RXByteCtr) { * PRxData++= UCB0RXBUF; //将 RX 数据移动到地址 PRxData IF (RXByteCtr = 1) //只剩下一个字节? UCB0CTL1 |= UCTXSTP; //生成 I2C 停止条件 } 否则 { * PRxData = UCB0RXBUF; //将最终 RX 数据移动到 PRxData _BIC_SR_REGISTER_ON_EXIT (CPUOFF); //退出 LPM0 }

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

    您好 Shankar、

    下面 是一个应用手册的链接、该手册介绍了如何调试各种串行通信问题。 I2C 从第10页开始介绍。 如果您对该文档有任何疑问、或者该文档不能帮助解决您的问题、请告诉我。

    此致、

    Matthew

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    第一个问题是我被完全误导的中断的名称所欺骗。 USCIAB0RX_Vector 不捕获 I2C 中断。 实际上、I2C Tx 和 Rx 共享同一中断 USCIAB0TX_Vector。 因此、我必须更改上面显示的 ISR 之一以处理 Tx 和 Rx 这在文件 msp430g2xx3_uscib0_i2c_12.c 中进行了演示 我删除了在这种情况下无用的 ISR USCIAB0RX_ISR。 之后、我可以在 CRO 的 SCLK 线上看到一些东西。 我仍然没有进行通信。 现在进行相同的调试。 我还能在其他地方找什么呢? 通过这种方式、我验证了 IFG 是否被设置为 Tx 中断、并且当我第一次到达中断时、我的 UCB0TXBUF 是否被正确写入。 问题是由于某种奇怪的原因、中断似乎没有第二次到达、并且它始终停留在发送中、因为这只是第二次清除 IFG 标志并发送停止位。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Shankar、

    我可以为您提供的调试最佳方法是应用手册中概述的方法:

    使用从器件数据表验证上拉电阻和从器件地址值

    检查所有外设初始化、包括:

    •物理引脚选择(SDA 和 SCL)

    •通信寄存器设置

    •启用中断(本地和全局)

    •在基于 I2C 开发 SMBus 通信时、请参阅 《使用 MSP430进行 SMBus 设计 的设计指南》。

    使用可用的工具(例如、IDE 调试器、逻辑分析仪和示波器)来证明总线两端都遵循 I2C 软件协议。

    查看 MSP430器件勘误表、了解可能涉及的 I2C 勘误表

    此外、引用 Resource Explorer 中的其他 I2C 示例代码可能会有所帮助。

    此致、

    Matthew

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

    Mathew、您好!

    我确实参考了该文档、并且肯定会参考该文档。 物理引脚选择正常、我已经调试了寄存器设置、我甚至在上一篇文章中提到了调试步骤。 我还看到中断被启用、并且正在看到一个中断(传输)。 之后、我不知道为什么即使 IFG 标志未被清除、Tx 中断也不会再次发生。

    我参考了所有示例、并使用了示例中的 ISR。 从地址正常、因为我已经验证了其他工作库(面向 Arduino 的 Adafruit)从地址的正确性。

    此致、

    Shankar

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

    您好 Shankar、

    我附加了另一个代码示例。 此示例将在未来的某个日期与我们的其他代码示例一同提供;但是、现在它仍是草稿。 您可能会发现此示例对确定您的问题很有帮助。

    您能否继续操作并布置逻辑分析仪的输出?

    此外、您可以尝试的另一种技术是 GPIO 调试。 当您进入有问题的 ISR 时、将 GPIO 引脚设置为高电平、而当您离开时、将其设置为低电平。 使用逻辑分析仪监控该引脚以及 SCL 和 SDA。 当您进入和离开函数时、您可以遵循类似的方法。 这将有助于更好地了解代码执行期间发生(或未发生)的情况。

    此致、

    Matthew

    e2e.ti.com/.../g2553_5F00_i2c_5F00_master.c

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

    您对此问题是否有任何更新?

    此致、
    Matthew
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我在这个项目中放弃了 MSP、并继续与其他控制器合作、让我的生活变得更简单