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.

[参考译文] MSP430F2132:I2C 从设备

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1323926/msp430f2132-i2c-slave

器件型号:MSP430F2132

你好

在从模式下使用 eUSCI 时、是否需要外部晶体用于 i2c 100kHz 或400kHz


提前感谢
斯特凡

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

    简而言之:不、主器件提供计时。 [参考用户指南(SLAU144K)第17.3.5节]

    您可能希望以合理的速度运行 CPU (1MHz?) 为了确保响应速度、但您不需要晶体的时钟精度、DCO 就可以了。

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

    尊敬的

    很清楚。
    我尝试查找 " MSP430F21x2代码示例(修订版 C): www.ti.com/.../slac163c " 、但链接错误
    现在链接是什么?


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

    我在 TI.com 上搜索"slac163"、最终结果是:

    https://www.ti.com/tool/download/SLAC163

    Resource Explorer 中也提供了以下链接:

    https://dev.ti.com/tirex/explore/node?node=A__AA9hfDmh39HASB2FIu6KKQ__msp430ware__IOGqZri__LATEST

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

    我刚刚过去并复制了 IRA 8.00中的一个示例、但我没有收到
     数据

    发生了什么

    #包含
    优点:
               RSEG   CSTACK                 ;定义堆栈段
    优点:
               RSEG   DATA16_N               ; RAM
    RxData     DS     128                    ;分配128字节的 RAM
    优点:
               RSEG   代码                   ;汇编到 Flash 存储器
    优点:
    重置       mov.w  #SFE(CSTACK ), SP        ;初始化 stackpointer
          //指示     
    StopWDT    mov.w  #WDTPW+WDTHOLD、&WDTCTL ;Stop WDT
    CheckCal   CMP.b  #0FFh,&CALBC1_16MHz     ;校准常数已擦除?
               JeQ    陷阱
               CMP.b  #0FFh、&CALDCO_16MHz
               JNE    负载  
    陷阱       JMP    $                      ;陷阱 CPU!!
    载入       MOV.b  &CALBC1_16MHZ、&BCSCTL1  ;将 DCO 设定为16MHz
               MOV.b  &CALDCO_16MHz、&DCOCTL


    SetupP3    I2C.b  #06h,&P3SEL            ;将 bis 引脚分配给 USCI_B0
    SetupUCB0  bis UCSWRST.b  #UCSWRST,&UCB0CTL1     ;启用软件复位
               MOV.b  #UCMODE_3+UCSYNC、&UCB0CTL0
                                               ; I2C 从机,同步模式
               MOV.w  #010h,&UCB0I2COA       ;自有地址为010h
               bic.b  #UCSWRST,&UCB0CTL1     ;清除软件复位,恢复操作
               UCSTPIE+UCSTTIE  和 bis 0I2CIE
                                               ;启用 STT 和 STP 中断
              // 提示
               UCB0RXIE.b  #UCB0RXIE&IE2         ;启用 bis 中断

    main       mov.w  #RxData,R5             ;RX 缓冲区的起始
               CLR.w  R6                     ;清除 RX 字节计数
           //   LPM0.b  SR           ;输入 bis,使能中断
                                               ;保持在 LPM0中直到主器件
                                               ;完成 TX
               NOP                            ;设置断点>>HERE<<和
                                               ;读出 RxData 缓冲区
               JMP    主                   ;重复
    优点:
    ; USCI_B0数据 ISR 被用来移动从 I2C 主机接收到的数据
    ;加载到 MSP430存储器。
    优点:
    USCIAB0TX_ISR;     USCI_B0数据 ISR
    优点:
               MOV.b  &UCB0RXBUF,0(R5)       ;将 RX 数据移动到地址 R5
               INC.w  R5                     ;地址指针增量
               Inc.w  R6                     ;递增 RX 字节计数
               区域
    优点:
    ; USCI_B0状态 ISR 被用来将 CPU 从 LPM0中唤醒以
    ;在主程序中处理接收到的数据。 LPM0只有在出现以下情况时退出
    ;当接收到实际数据时的(重新)启动或停止条件。
    优点:
    USCIAB0RX_ISR;     USCI_B0状态 ISR
    优点:
               bic.b  #UCSTPIFG+UCSTTIFG、&UCB0STAT
                                               ;清除中断标志
               TST.w  R6                     ;检查 RX 字节计数器
               JZ     USCIAB0RX_ISR_1        ;如果没有收到任何信息则跳转
           //   bic.w  #LPM0,0(SP)            ;清除 LPM0

    USCIAB0RX_ISR_1
               区域
    优点:
               通用 INTEC                 ;中断向量
    优点:
               org    USCIAB0TX_VECTOR       ;USCI_B0 I2C 数据整型矢量
               DW     USCIAB0TX_ISR
               org    USCIAB0RX_VECTOR       ;USCI_B0 I2C 状态内部矢量
               DW     USCIAB0RX_ISR
               org    reset_vector           ; POR , ext. 复位、看门狗
                    DW 复位
               结束

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

    您如何判断它不在接收数据? 当您在调试器中暂停时、它在哪里执行?

    ----------------

    我没有 IAR、但看起来你修改了这两行:

    >     //   LPM0.b  SR           ;输入 bis,使能中断

        //   BIC.w  #LPM0,0(SP)            ;清除 LPM0

    删除它们会阻止接收数据。 我建议您将这些线放回原位。

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

    我发现问题,驱动程序在 IAR 是模拟器,即 FET 调试器 :

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

    尊敬的

    我尝试检测重复的启动作为 i2c 从器件。
    你有解释的例子,如何进行?

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

    您好、 

    在 传输期间、如果在没有停止中断的情况下触发 START 中断、则为重复的 START。

    此致、

    赫利克

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

    尊敬的 Helic

    感谢您的快速响应。
    您是否具有该实现的相同演示示示示例?

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

    您好、 

    我没有找到它的演示代码。

    只需 在 I2C 中断中设置某种 I2C_Status_FLAG 变量就可以了。

    例如:

    void I2C_Start_interrupt_Handler(){
        if(I2C_STATUS_RX_STARTED){
            I2C_STATUS_RX_REPEATED_STARTED = true;
        }
        else{
            I2C_STATUS_RX_STARTED = true;
        }
    }
    
    void I2C_Stop_interrupt_Handler(){
            I2C_STATUS_RX_REPEATED_STARTED = false;
            I2C_STATUS_RX_STARTED = false;
            
            I2C_STATUS_RX_STOP = true;
    }
    

    此致、

    赫利克

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

    你好

    只是为了告知每个人都在工作

    此致
    St é phane.