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:I2C示例09不工作-应该工作但不工作

Guru**** 2538950 points
Other Parts Discussed in Thread: MSP-EXP430F5529LP, MSP430F5529, MSP430G2553

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/582710/ccs-msp430f5529-i2c-example-09-not-working---should-work-but-does-not

部件号:MSP430F5529
主题中讨论的其他部件:MSP-EXP430F5529LPMSP430G2553

工具/软件:Code Composer Studio

我正在使用以下示例代码: MSP430F55xx_uscib0_i2c_09.c

此示例代码将在i2c总线端口3.1 和端口3.2 上传输一些数据,但我看不到线路上的任何数据,也看不到时钟信号。   使用带Code Composer 7.0 的MSP-EXP430F5529LP Launchpad开发套件

该代码应该在没有任何修改的情况下工作,因此我不确定为什么在PIN上看不到任何内容。

以下是从示例中直接获得的完整代码...   我所做的只是在引脚上放置一个逻辑分析器,并应该看到什么...任何东西。   发生什么事了?

//************************************************************************************************
// MSP430F552x演示- USI_B0 I2C主TX多字节,用于MSP430从属设备
//
// 说明:此演示通过I2C总线连接两个MSP430。 主控
// 传输至从属设备。 这是主代码。 这是一种非常谨慎的方式
// 传输一组数据并演示如何实现I2C
// 使用USI_B0 TX中断发送多个字节的主发送器。
// ACLK = N/A,MCLK = SMCLK = BRCLK =默认DCO =~1.045MHz
//
//***与“MSP430F55xx_uscib0_i2c_09.c”***一起使用
//
//                               /|\/|\  
//               MSP430F5529    10k 10k     MSP430F5529
//                  从        |   ||        主
//-----------               |   |  --------------------
//          ||Xin 3.0 –UCB0SDA|<-|---+->|WFP–3.0 –UCB0SDA|-  
//           |                | ||      |                |
//          -|XOUT            | |      |            XOUT|-
//           |    WFP 3.1 / UCB.S.|<-++--- >|WFP 3.1 / UCB.S.    |
//           |                |         ||                |
//
//  Bhargavi Nisarga
//  德州仪器(TI)
//  2009年4月
//  使用CCSv4和IAR嵌入式工作台版本:4.21 构建
//************************************************************************************************

#include <MSP4S.h>

unsigned char *PTxData;                    //指向TX数据的指针
未签名的char TXByteCtr;

const unsigned char TxData[]=             //要传输的数据表

 0x11,
 0x22,
 0x33,
 0x44,
 0x55
};


内部主(无效)

 无符号int I;

 WDTCTL = WDTPW + WDTHOLD;                //停止WDT
 P3SEL || 0x03;                           //将I2C引脚分配给USIC_B0
 UCB0CTL1 || UCSWRST;                     //启用软件重置
 UCB0CTL0 = UCMST + UCMODE_3 + UCSNC;    // I2C主控,同步模式
 UCB0CTL1 = UCSSEL_2 + UCSWRST;           //使用SMCLK,保持SW重置
 UCB0BR0 = 12;                            // fSCL = SMCLK/12 =~100kHz
 UCB0BR1 = 0;
 UCB0I2CSA = 0x48;                        //从属地址为048h
 UCB0CTL1 &=~UCSWRST;                    //清除软件重置,恢复操作
 UCB0IE |= UCTXIE;                        //启用TX中断

 同时(1)
 {
   for (i=0;i<10;i++);                     //事务之间需要延迟
   PTxData =(unsigned char *) TxData;     // TX数组起始地址
                                           //在此处放置断点以查看每个断点
                                           //传输操作。
   TXByteCtr = TxData的大小;             //加载TX字节计数器

   UCB0CTL1 || UCTR + UCTXSTT;            // I2C TX,启动条件

   __bis_sr_register(LPM0_bits + GIE);    //输入LPM0,启用中断
   __no_operation();                      //保留在LPM0中,直到所有数据
                                           //已发送
   while (UCB0CTL1和UCTXSTP);            //确保已发送停止条件
 }
}

//------------------
// USCIAB0TX_ISR的结构可用于传输任何
//预加载具有字节计数的TXByteCtr的字节数。 另外,TXData
//指向要传输的下一个字节。
//------------------
#if defined(__TI_Compiler_version__)|| defined(__IAR_SYSTEMS _ICC__)
#pragma vector = USI_B0_vector
__interrupt void USI_B0_ISR(void)
#Elif已定义(__GMNU__)
void __attribute__((interrupt (USI_B0_vector)) USI_B0_ISR (void)
#否则
错误编译器不受支持!
#endif

 SWITCH(__EIV_IN_RANGE(UCB0IV,12))
 {
 案例 0:中断;                          //矢量 0:无中断
 案例 2:中断;                          //矢量 2:ALIFG
 案例 4:中断;                          //矢量 4:NACKIFG
 案例 6:中断;                          //矢量 6:STTIFG
 案例 8:中断;                          //矢量 8:STPIFG
 案例10:中断;                          //矢量10:RXIFG
 案例12:                                 //矢量12:TXIFG
   IF (TXByteCtr)                         //检查TX字节计数器
   {
     UCB0TXBUF =* PTxData+;              //加载TX缓冲区
     TXByteCtr -;                         // Decrement TX字节计数器
   }
   否则
   {
     UCB0CTL1 || UCTXSTP;                 // I2C停止条件
     UCB0IFG &=~UCTXIFG;                 //清除USI_B0 TX int标志
     __BIC_SR_REGISTER_ON_EXIT (LPM0_bits);//退出LPM0
   }
 默认值:中断;
 }
}


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

    您的问题听起来与几天前我的问题非常相似。 我尝试在MSP430G2553上运行I2C示例号6,但我确信它不起作用。 但是我确实得到了SCL上的时钟和SDA上的数据。 这是一个错误表中描述的问题。 当我尝试解决方法时,它完美无瑕。

    您是否已查看MSP430F5529的勘误表?

    是否尝试使用断点调试应用程序以验证是否设置了正确的寄存器?

    程序计数器是否超出其应有的范围?

    您是否仔细检查了从主板到逻辑分析仪的连接? 我犯这个错误的次数比我想承认的要多。

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

    我看了勘误表说明,却找不到与单个主I2C相关的任何内容。 我希望/假设示例代码在第一次就可以工作。 我的意思是,毕竟,为什么要创建不起作用的示例代码? 我认为提供示例代码的目的是帮助开发人员尽快进入功能状态。 这个问题已经存在了一段时间。

    我阅读了应用手册SLAA703和程序员用户指南,但尚未找到任何线索。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我认为您检查了程序计数器并验证了USCI寄存器是否已正确初始化?

    此外,为了确保110 % ,SDA和SCL引脚上确实有10k或更小的电阻器,对吗?

    如果您已经完成了此操作,请尝试配置输出SMCLK的引脚,以便可以测试逻辑分析器和MSP的时钟系统是否正常工作。 如果SMCLK不存在,请尝试手动初始化时钟系统。