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/MSP430F5342:I2C 编程接收中断标志(UCRXIFG)不起作用。

Guru**** 2394305 points
Other Parts Discussed in Thread: MSP430F5342, TCA9548A

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/926020/ccs-msp430f5342-i2c-programming-receive-interrupt-flag-ucrxifg-is-not-working

器件型号:MSP430F5342
主题中讨论的其他器件: TCA9548AMSP430WARE

工具/软件:Code Composer Studio

您好,

我们使用的是一个 zcu111 Xilinx 关联板。该板具有系统控制器 MCU MSP430F5342。Ther 是 来自 TI 的 I2C 多路复用器(tca9548a)、 我正在尝试通过 MSP430F5342对其进行编程。我正在尝试启用此 i2c 多路复用器中的通道1 。为此,我仅通过修改从地址来获取由 ti (MSP430F534x_uscib0_i2c_10.c)提供的一个主接收器示例 i2c 代码。  tca9548a 的地址为0x74。根据数据表,它只有一个控制寄存器,可以通过为从机地址提供设置的读取位来读取该寄存器。 我正在尝试读取控制寄存器、但无法读取  

我看到一些文章说要将从器件地址右移1位,因为 USCI 模块会自动将它向左移1位来获取它。 我没有得到这一点,但仍然尝试使用2个地址 0x74和0x3A (通过右移0x74)。 我所面临的问题是 UCRXIFG 根本没有设置、ISR 也没有执行 、所以我无法读取 UCB0RXBUF。 我在这里附上了我的代码。是否有人可以解释问题是什么,哪里出了问题,需要移动从地址?

我在将 MSP430配置为主发送器时也遇到了同样的问题。 当我尝试向 UCB0TXBUF 发送 TX 数据 时,不确认 (UCNACKIFG)标志总是高电平。

#include

unsigned char * PRxData;//指向 RX 数据的指针
unsigned char RXByteCtr;
volatile unsigned char RxBuffer[128];//分配128字节的 RAM

int main (空)

WDTCTL = WDTPW + WDTHOLD;                  //停止 WDT
P3SEL |= 0x03;                                  //将 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 = 0x74;//从地址

// UCB0I2CSA = 0x3A;    

UCB0CTL1 &=~UCSWRST;//清除 SW 复位,恢复运行
UCB0IE |= UCRXIE;//启用 RX 中断

while (1)

PRxData =(unsigned char *) RxBuffer;               // RX 缓冲区的开始
RXByteCtr = 1;                                  //加载 RX 字节计数器
while (UCB0CTL1 & UCTXSTP);                   //确保发送了停止条件
UCB0CTL1 |= UCTXSTT;                         // I2C 启动条件

_bis_SR_register (LPM0_bits + GIE);              //输入 LPM0,启用中断
                                           //保持在 LPM0中直到所有数据 A
                                           //是 RX
__no_operation();                             //在此处设置断点<<和
}                                            //读取 RxBuffer 缓冲区

///----------------------------------
// USCI_B0数据 ISR 用于移动从 I2C 从设备接收到的数据
//到 MSP430内存。 它的结构使其可用于接收
//通过预加载 RXByteCtr 并进行字节计数,可获得任意2+个字节。
///----------------------------------
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector = USCI_B0_vector
_interrupt void USCI_B0_ISR (void)
#Elif defined (_GNU_)
void __attribute__((中断(USCI_B0_vector)) USCI_B0_ISR (void)
其他
错误编译器不受支持!
#endif

switch (__evo_in_range (UCB0IV、12))

情况0:中断;          //向量0:无中断
案例2:中断;          //向量2:ALIFG
案例4:中断;          //向量4:NACKIFG
案例6:中断;          //向量6:STTIFG
案例8:中断;         //向量8:STPIFG
案例10:              //向量10:RXIFG
RXByteCtr --;         //递减 RX 字节计数器
IF (RXByteCtr)

* PRxData++= UCB0RXBUF;             //将 RX 数据移动到地址 PRxData
IF (RXByteCtr = 1)                    //只剩下一个字节?
UCB0CTL1 |= UCTXSTP;               //生成 I2C 停止条件

其他

* PRxData = UCB0RXBUF;                //将最终 RX 数据移动到 PRxData
_BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);     //退出活动 CPU

中断;
情况12:中断;//向量12:TXIFG
默认值:break;

此致、

Soumya  

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

    您好、Soumya、

    您能否为此器件运行 I2C 代码示例? 您可以转到 Resource Explorer、选择 MSP430Ware、然后选择您的器件。  我建议修改其中一个现有示例、以查看您是否遇到相同的问题。

    BR、
    Leo

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

    根据 TCA9548A 数据表(SCPS207G)图9、其(7位)地址为0x7n 形式、因此0x74是 I2CSA 中正确的设置。 (或0x75表示另一个。)

    ZCU111用户指南(UG1271 v1.2)图3-2显示了 MSP430分别通过"P3"和"P4"连接到 I2C0和 I2C1。 我预期 P3指 UCB0 (P3.0-1)。 这是您正在使用的器件、但这些器件不在 I2C0上、而是在 I2C1上。

    因此、我认为您需要通过"P4"引脚使用 UCB1。 UG1271图3-4指示这些是 P4.1/2。

    根据 F5342数据表(SLAS706F)表4-1和6-7、P4.1为 PM_UCB1SDA、P4.2为 PM_UCB.S。

    总结:

    1) 1)您需要在此处使用 UCB1、而不是 UCB0

    2) 2)将"P3SEL |= 0x03;"更改为 "P4SEL |= BIT1|BIT2;// P4.1更改为 UCB1SDA、P4.2更改为 UCB.S."。  

    [编辑:轻微修改措辞]

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

    您好 Bruce ,

    感谢您的更正。 非常感谢您的参与。当您浏览  ZCU111用户指南(UG1271 v1.2)时, 实际上我想访问连接到 i2c mux (tca9548)中通道编号1的时钟发生器 IC SI5341。 要在写入 i2c 多路复用器的控制寄存器值(0x02)后启用通道1    、请再次提供 ZCU111用户指南(UG1271 v1.2)表3-6中提到的时钟发生器 IC 地址(0x36)。 代码流应该如何? 我真的很困惑如何访问该时钟发生器(Si5341)。您能帮我解决这个问题吗?

    此致、

    苏姆亚

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

    我以前没有使用过 TCA9548A、但我可以告诉它创建一个(略为虚幻的)总线、其中包含自己及其子集。 您将一个字节位图写入其控制寄存器、所选子总线上的器件会出现在(显然)单总线上。 如果我是对的、顺序将是:

    0)在 I2C1 (UCB1)上[每个都是一个单独的 I2C 事务]:

    1) 1)写入地址[0x74]数据[0x02]  以将子总线1放置在总线上(我认为每个电源周期只需要执行一次)

    2) 2)写入地址[0x36]数据[0x01、0x00]  以设置寄存器1 (PAGE)=0   

    3) 3)写入地址[0x36]数据[0x02]  以请求寄存器2 (base_part_number)

    4)从[0x36]读取2个字节、应为[0x53、0x41][参考 Si5341参考手册(R1.2)表14.4]

    对于您的第一次尝试,我建议跳过步骤(2)-(3),只需读取4个字节,然后在字节2-3中查找[0x53,0x41]。 我认为页面在启动时=0。

    [请记住、我不知道我所说的内容。]