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.

[参考译文] MSP430Fr6879:I2C 接口

Guru**** 2582405 points
Other Parts Discussed in Thread: MSP430FR6879

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/609051/msp430fr6879-i2c-interfacing

器件型号:MSP430FR6879

我尝试使用 RTC (idt1338),并  通过 I2C 协议将它与 msp430fr6879连接。 我所面临的问题是、有时、在大多数情况下、代码不会进入 I2C 中断例程。 即未建立通信。 但一旦通信确定为进入中断例程的切换情况,一切都正常,但这种情况很少发生。 可能的问题是什么。
在硬件方面,我使用4.7K 电阻器上拉了 sda 和 SCL 引脚。
 
 

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

    Noble、您好!

    感谢您的发帖。 "MSP430 MCU 上常见 eUSCI 和 USCI 串行通信问题的解决方案"文档在第10页介绍了 I2C。 这将涵盖最常见的 I2C 问题以及如何检查这些问题、并可能有助于解决您的问题。 如果您对该文档有任何疑问、请告诉我。

    此外、当器件尝试通信时、您能否通过监测通信线路的逻辑分析仪或示波器发布输出?

    此致、

    Matthew

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

             控制器无法正确生成 START 或 STOP 脉冲、我假设控制器无法正确驱动引脚、因为我的程序在调用 START 条件或 STOP 条件后卡住。ustp 或 ucstt 保持置位、 根据我的知识、这意味着控制器无法完成生成 START 或 STOP 脉冲。 另一个奇怪的现象是 、当我将 CRO 与 sda 线连接时、会产生起始脉冲或停止脉冲。
     亲切的导游。
         

    herin 是我的代码  

    #include 
    
    
    volatile unsigned char TXData[]={0x00、0x12、0x13、0x14、0x01、0x02、0x10、0x17};
    volatile unsigned char TXByteCtr;
    volatile unsigned char flag=0;
    volatile
    unsigned
    char
    
    
    
    
    
    
    
    
    
    
    
    
    
    out RxData[7];void init (void);volatile unsigned char int (void)= 0;volatile unsigned int = 6|WTIv= 3;blatile DTCDITr =~3 | WITDIT= 3;void Dt = 3;bt = 3 | WTIv= 3;bt = 3;bt =
    P6OUT &=~BIT2;
    
    
    
    //____________________________ I2C 初始化________________________________
    //-------- 配置 GPIO---------------
    P4SEL1 |= BIT6 | BIT7;// I2C 引脚
    P4SEL0 &=~(BIT6 | BIT4);// I2C 引脚
    LCDCPCTL0 = 0x0000;
    
    //将 USCI_B0配置为 I2C 模式
    UCB1CTLW0 |= UCSWRST;//将 eUSCI_B 置为 UCB1CT0
    | UCB1CTLW0 | UCS1CMOST= 0x68;//将 UCB1CL0置为 UCS1CMOST_B;// UCS1CMOST= UCT0 | UCS0 | UCB1CMOST= UCS0 | UCS0 | UCS1CMOCTL
    
    //配置从地址
    UCB1BRW = 0x04;//波特率= SMCLK / 2
    UCB1CTLW0 &&~UCSWRST;//清除复位寄存
    器 UCB1IE |= UCTXIE + UCNACKIE + UCRXIE;//发送和 NACK 中断使能
    
    __bis_SR_register (GIE);__________________________
    
    I2C INTIT 结束____________________________
    
    
    _DELAY_CYCLES (3000000);// 250ms 延迟
    //--- 流= 0 =>写入时间------------------------
    flow=0;
    TXByteCtr = 8;//在
    
    (UCB1CTLW0和 UCTXSTP)时加载 TX 字节计数器;//确保发送了停止条件
    UCB1CTLW0 |= UCTR;
    __DELAY_CYCLLES (120000);
    
    UCB1CTLW0 |= UCTXSTT;// I2C TX,启动条件
    
    while (0000-=-=-=-/-=0;(flag)---=-=0;-);
    
    
    
    flow= 1 =>写入地址指针------------
    flow=1;
    TXByteCtr = 1;//在
    
    (UCB1CTLW0和 UCTXSTP)期间加载 TX 字节计数器;//确保发送了停止条件
    
    
    UCB1CTLW0 |= UCTR | UCTXSTT;// I2C TX,在
    
    (flag = 0)期间启动条件(flag
    = 0);//---
    
    流2读取时间-------------------------------------------------------
    
    flow=2;
    TXByteCtr = 7;//加载 TX 字节计数
    
    
    器 UCB1CTLW0 &=~UCTR;
    UCB1CTLW0 |= UCTXSTT;// I2C TX,启动条件
    while (flag = 0);
    flag = 0;
    __delay_cycles (120);
    while (UCB1CTLW0
    & UCTXSTP-
    
    )
    ————————————~———————UCB1C1C1CT10D———————————————————————————————————————————————————————————————————————————
    
    
    
    流1写入指针-------------------------------------------------------
    __delay_cycles (120);
    flow=1;
    TXByteCtr = 1;//在
    (UCB1CTLW0和 UCTXSTP)时加载 TX 字节计数器;//确保发送了停止条件
    UCB1CTLW0 |= UCTR | UCTXSTT;// I2C TX,在
    (flag = 0)时启动条件;flag=0------
    
    
    流2读取时间-------------------------------------------------------
    __DELAY_CYCLS (120);
    flow=2;
    TXByteCtr = 7;//加载 TX 字节计数器
    // while (UCB1CTLW0 & UCTXSTP);//确保停止条件已发送
    
    UCB1CTLW0 &=~
    
    
    
    
    
    ~UCTCTCTCTCTLW0;UCB1CTLW0 |= UCTXSTT;// I2C TX、START 条件= UCB1CTLW0;while = UCB1CTLW0 (UCTLW= UCTXSTP= UCT120);while = UCB1CTLW= UCB1CTLW0 + UCTLW= UCTLW0 (UCTL = UCTL = UCTLW0);
    UCB1CTLW0 |= UCTXSTP;//确保已发送停止条件
    __DELAY_CYCLS (120);// 12个用户
    }
    
    
    
    
    
    
    #if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
    #Elima vector = USCI_B1_vector
    __INTERRUPT _B1_ISR (#USCI_B1_void
    )
    
    
    (USCI_B1_ISR void)(#USCI_B1)_INTERRUCT_B1_ISR (UCI_B1 void)(USC_B1 void)(#USCI_INTERRUCT_B1)_INTERRUCT_B1 (UST_NOT_ISR (UST_NOT_COVERSI_NOT_CO_NO
    #endif
    {
    switch (__even_in_range (UCB1IV、USCI_I2C_UCBIT9IFG))
    }{
    case USCI_none:break;//向量0:无中断
    
    情况 USCI_I2C_UCNACKIFG://向量4:NACKIFG
    UCB1CTLW0 |= UCTXCLT/ UCBTXIFG = UCTX0
    
    
    
    
    ~
    
    
    ;//如果 TXCNT2 = UCBxTXCr
    = UCBTXIFG & UCBTXCRTUCTR = UCTR 2;如果是 UCBxTXCr = UCTR = UCB0/ UCBTXCr 1、则为 UCBxTXIFG = UCTR 2;//如果是 UCTR = UCTR 2;如果是 UCTR = UCBxTXC //加载 TX 缓冲
    区 TXByteCtr
    
    
    
    
    ^;if (TXByteCtr = 0){UCB1CTLW0 |= UCTXSTP;// I2C 停止条件标志= 1;P6OUT = BIT2;//减量 TX 字节计数
    器
    }
    
    break;//向量22:RXIFG0
    case USCI_I2C_UCTC0
    
    
    ={TXBUT8}(如果 TXBUT0)= UCTBUT0)/向量 TX 字节计数器}(如果 TXBUCtr = UCTX0)}(TXBUT0://(TXBUT0) //加载 TX 缓冲
    区 TXByteCtr
    
    
    
    
    ^;//如果(TXByteCtr = 0)则减量 TX 字节计数器{flag=1;UCB1CTLW0 |= UCTXSTP;// I2C 停止条件 UCB1IFG &=~UCTXIFG;//清除 USCI_B0 TX int 标志 P6OUT = UCTXCtr
    
    
    = 0x1UCB1UCTF
    
    
    
    
    
    ;//如果 TXByteCtr = 1}= UCTXf;// TXBUT = 1 (如果= 1);// TXBt = 1) //减量 TX 字节计数
    器}
    else{flag=1;
    }
    }
    UCB1IFG &=~UCTXIFG;
    break;
    default:break;
    }
    

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

    Noble、您好!

    我在上面发布的文档包含调试设置的步骤。 第2页提供了通用 eUSCI 信息和调试步骤、第10页提供了特定于 I2C 的信息和调试步骤。 如果您对项目执行这些步骤、您很可能会发现问题。

    如果您可以访问其中一个、 逻辑分析仪或示波器将非常有助于调试您的设置。 如果您愿意、您可以在此处发布输出、我将帮助您对其进行解密。

    此外、您还可以在 Resource Explorer 上找到可供参考的代码示例。 这里是 MSP430FR6879的 I2C 示例、还有其他几个示例可供您查看。

    此致、

    Matt

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

    你好 Matthew、

    正如您所建议的那样、我也浏览了文档和代码示例。

    我或多或少接近这个问题、这就是我发现的问题、

    通常,代码运行正常。如果发生任何故障(如断电 ),通信未完成,并且未生成停止条件, 则 clk 线路被 MSP430控制器保持在低电平,  状态寄存器的 BUSY 标志和 SCL 低电平标志被置位、

    现在,即使在重新初始化(使用复位)模块或重新启动(加电)整个板后 ,状态 标志仍然保持不变,即 BUSY 和 CLK 低电平保持置位。 在对 CRO 进行进一步分析时、发现即使重新启动器件和 clk 线路后、数据线路仍保持低电平、 这两个引脚实际上都应 在加电状态下上拉。   探针越快接触 clk 线、它就会被上拉、数据线也会被上拉。 器件将再次开始工作。

    请帮我解决这个问题。

    此致、

    Noble Ajay。  

     

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

    当 MSP430FR6879复位时、从器件是否也复位? 如果从器件未被复位、它可能将线路保持在低电平、这将导致时钟和忙标志被置位。

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

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

    此致、
    Matthew