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.

[参考译文] MSP430F2012:MSP430F2012上的 I2C 从器件应用

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/783503/msp430f2012-i2c-slave-application-at-msp430f2012

器件型号:MSP430F2012
主题中讨论的其他器件: MSP430F169MSP430FR2422

您好...
我还有一个问题。 在 MSP430F2012中、我已对 I2C 从设备应用程序进行了编程。 I2C 总线上连接更多器件。 当主器件提示从器件进行数据传输时、在传输后、2012从器件始终处于 I2C 中断状态。 任何操作都无法停止此中断、程序处于无限循环中。 我可以做什么来停止无限循环。 我使用了 TI 的一个示例:msp430x20x3_USI_09.s43。
此致 Jurgen

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

    您意味着您没有更改示例代码中的任何内容、对吧? 您是否尝试过更易于调试的相同函数.c 代码。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Gary、

    非常感谢您的回答。

    我已经稍微更改了代码、但我认为这不是导致此行为的原因。

    我的更改、另一个从器件地址、而不是 LMP0模式。

    一个奇怪的行为是我不能删除"USIIFG"位。 我在调试模式中清除该位、同时再次设置该位。

    为什么可以在 C 中更好地进行调试?

    编译器会像示例一样制作汇编器。

    此致 Jurgen

               CLR.b    &DCOCTL                                       ;选择最低 DCOx 和 MODx 设置

               MOV.b &CALBC1_8MHZ,&BCSCTL1     ;将 DCO 设置为8MHz

               MOV.b &CALDCO_8MHZ、DCOCTL

               MOV.b #0xD4、&P1SEL                               ;P1.6 & P1.7 I2C、P1.4 SMCLK、P1.2 TACapture

               MOV.b #0x3B、&P1DIR                                ;未使用的引脚输出方向

               CLR.b    &P1OUT                                          ;P1 löschen

               MOV.b #0xc0、&P2DIR                                ;P2输出

               BIS.b   #DIVS_3、&BCSCTL2                    ;SMCLK/8

               BIS.b   #1、P1OUT                                        ;P1.0 LED 输入

               MOV    #2、R10

               调用     #delay

               BIC.b   #1、P1OUT                                        ;P1.0 LED 状态

               MOV    #2、R10

               调用     #delay

               

     

    ;SetupUSI

               BIS.b   #USISWRST、USICTL0     

               BIS.b   #USIPE6+USIPE7、USICTL0      ;端口、I2C 从器件

    ;          mov.b #USIIE+USII2C+USISTTIE,和 USICTL1;启用 I2C 模式

               MOV.b #USII2C+USISTTIE,&USICTL1  ;启用 I2C 模式

               MOV.b #USICKPL、和 USICKCTL               ;设置时钟极性

               BIS.b   #USIIFGCC,和 USICNT                  ;禁用自动清除控制

               BIC.b   #USISWRST、USICTL0                ;启用 USI

               BIC.b   #USIIFG,&USICTL1                         ;清除挂起标志

               BIC.b   #USIOE、USICTL0                       ;SDA 输入

               BIS.b   #USISCLREL、USICNT              ;SCL 被释放

     

    ;子例程 I2C、I2C 数据传输

    USI_ISR

    ;------------------------------------------------------------------

    //         mov    #WDTPW + WDTCNTCL + WDTIS0、&WDTCTL                       

               bit.b  #USISTTIFG、USICTL1   ;开始输入?

               Jnc    Check_State

               MOV.w  #2、I2CState            ;第一个 I2C 状态、Rx 地址

    CHECK_STATE

               ADD.w  I2CState、PC         ;I2C State Machine

               JMP    STATE0                     ;I2CState=0

               JMP    STATE2                     ;I2CState=2

               JMP    State4                     ;I2CState=4

               JMP    STATE6                     ;I2CState=6

               JMP    STATE8                     ;I2CState=8

               JMP    STATE10                   ;I2CState=10

    ;------------------------------------------------------------     

    STATE0

               NOP                                                              ;Idle、不应该在这里

               BIC.b   #USIIFG,&USICTL1                       ;清除挂起标志

               TI

    ;--------------------------------------------------------

    STATE2                                                                   ;接收从机地址

               MOV.b &USICNT、R8           ;位计数器= 8、Rx 地址

               和.b  #0xE0、R8

               ADD.b  #0x8、R8

               MOV.b R8、USICNT

               BIC.b   #USISTTIFG,和 USICTL1;清除启动标志

               MOV    #4, I2CState  ;转至下一状态,chk 地址

               BIC.b   #USIIFG、和 USICTL1

               TI

    ;------------------------------------------------------------        

    State4                                            ;处理地址并发送(N)ack

               MOV    #TIME_DAT、R12          ;Buffer Zeit und 基准面

               BIS.b   #USIOE、USICTL0;SDA =输出

               MOV.b &USISRL、R9

               RRA.b    R9.

               CMP.b #Slave_ADR、R9         ;地址匹配?

               Jnz                                        ;Add_nack

               CLR.b    和 USISRL                 ;发送 ACK

               MOV。    6、I2CState              ;转至下一状态:TX 数据

               BIS.b   #0x01、USICNT      ;发送 Ack 位

               BIC.b   #USIIFG、和 USICTL1

               TI       

               

    ADD_NACK

    *         

               BIS.b   #USIGE+~USIOE、&USICTL0;透明锁存被启用

               BIC.b   #USIGE,&USICTL0;透明锁存被禁用

               CLR.w   &I2CState                ;重置状态机

               BIC.b   #USIIFG、和 USICTL1

               TI

    ;----------------------------------------------------

    STATE6                                            ;发送数据字节

               BIS.b   #USIOE、&USICTL0  ;SDA =输出

               MOV.b #3,和 USISRL           ;发送数据字节          

    ;          mov.b @R12+、USISRL   ;发送数据字节

               BIS.b   #0x8、USICNT       ;位计数器= 8

               MOV。    #8, I2CState             ;进入下一状态,生成 STOP

               BIC.b   #USIIFG、和 USICTL1

               TI

    ;----------------------------------------------------

    STATE8                                            ;接收数据(N)Ack

               BIC.b   #USIOE、USICTL0;SDA =输入

               BIS.b   #0x01、USICNT      ;接收(N) ACK

               MOV。    #10、I2CState            ;转至下一状态:检查(N) ACK

               BIC.b   #USIIFG、和 USICTL1

               TI

    ;----------------------------------------------------     

    STATE10.

               BIC.b   #USIOE、USICTL0;SDA =输入

               bit.b    #0x01、USISRL      ;如果 NACK 被接收

               JC        出口

               BIC.b   #USIIFG、和 USICTL1

               TI

    ;------------------------------------------------------------

    退出

               CLR。       I2CState;     Reset state machine

               BIC.b   #USIIFG、和 USICTL1

               TI      

    结束

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

    您在主器件中使用的时钟频率是多少? 您能让它变慢吗? 您能否使用逻辑分析仪捕获 SDA 和 CLK 的波形?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、格里、

    感谢您的回答。

    对于从器件、我已将时钟从8MHz 更改为1MHz。 我可以使用示波器捕获 SDA 和 SCL。

          MOV.b &CALBC1_1MHZ,&BCSCTL1 ;将 DCO 设定为1MHZ

          MOV.b &CALDCO_1MHz、&DCOCTL

    I2C SCL 为20kHz。

    我已连接了通过 I2C 传输的制造商。

    有时、这是一个死锁。 我找不到这种行为。 SDA 很低、主设备无法进行某人转移。 如果我开始以下序列:

    BIS.b #USIGE,&USICTL0;输出锁存器始终启用且透明

    BIS.b #USIOE、USICTL0;输出被启用

    BIS.b #USIOE,&USICTL0;输出被禁用

    之后、SDA 变为高电平。 然后、传输再次正常、数据可以再次传输。

    当之前有一个到另一个从器件的传输时、就会发生这种行为。

    此致 Jurgen

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

    为什么在我们包含 BIC.b #USIOE、&USICTL0的演示代码中删除 STATE12和 STATE12_Exit 释放 SDA?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Gary、
    我发现、当从器件将 SDA 设置为低电平(ACK、NACK 我不知道这种行为)时、如果我通过从器件将 SDA 设置为高电平、则 I2C 传输再次正常。
    一个非常大的缺点是、如果 I2C 处于死锁状态、我无法从从从从器件或从主器件重新配置 I2C 机器。
    此致 Jürgen
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好

    您以前是否尝试过我们的从模式演示代码?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好、Juergen
    这里解决这个问题的一个解决方案是、您可以在 I2C 开始传输数据时启动计时器、并且可以设置传输将花费的最长时间、并在传输时间超过最长时间时设置 SDA。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Gary、
    我已经在 MSP430F2012上使用原始演示程序"msp430x20x3_USI_09.s43"和 MSP430F169上的主器件以极慢的速度测试了 I2C 传输。 这个组合没有出现任何问题、我也插入了一个超时任务。
    在我的情况下,一个大问题是,从机无法按照"主读请求"传输一个字节以上的数据。
    另一个问题是、如果从器件不立即响应(因为必须执行其他任务)读取请求、从器件会阻止总线。 即使是超时任务也无法消除阻塞。
    在用户指南中、没有 I2C 模块工作原理的流程图或状态图。 因此、我无法告知 I2C 模块的操作。 我不知道根据"主控方读取请求"在从器件处调用了多少个中断。 如果我处理中断、从器件将进入"无限中断循环"。
    我发现、MSP430F2012模块无法满足 MSP430F1XX 或 MSP430F54XX 上主器件的高要求。
    此致 Jürgen
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好、Juergen

    由于我现在没有 MSP430F2012、因此很难调试您的代码示例。 但这里有一些建议
    首先、我建议您将逻辑状态机保留在原始演示"msp430x20x3_USI_09.s43"的 USI 中断中
    第二、移除其他从器件、仅将 MSP430F2012作为唯一的从器件进行测试。

    此致
    Gary
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好、Gary
    如果我使用 MSP430F2012作为唯一的 I2C 器件(从器件)、则传输工作正常。 这不是现实。 我想将从器件与其他 I2C 从器件(时钟、显示)配合使用。 除此 I2C 功能外、从设备还应执行其他任务。
    此致
    Gary
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好、Juergen

    这个问题似乎与其他从器件有关。 您在项目中使用了多少个其他从器件? 您能否逐个焊接从属器件并找出是哪个器件导致了这一问题?

    此致
    Gary
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Gary、
    是的、我已停用所有其他设备、并且我也遇到了与我之前描述的相同的问题。
    如果只有运行示例 msp430x20x3_USI_09.s43且主器件始终在从器件上侦听、则从器件工作正常。
    我无法在主设备或从设备上运行其他任务。 我还有很多时间问题。
    谨致问候 Juergen
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好、Juergen

    不建议在演示代码中更改 I2C 的数据处理状态机。 为什么需要更改它? 演示代码函数与您的需求之间有什么差距? 我可以为您提供有关如何更改演示代码以满足您的应用需求的评论。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Gary、

    非常感谢你的帮助。

    我将向您发送我的程序。 该程序对 DCFF77信号进行解码。 我接收到的时间和日期可通过 I2C 总线进行传输。 从器件打开一个时间窗口。 在此窗口期间、主器件可以检索时间和日期。

    该程序包含一个 C 语言程序和一个汇编程序。 在汇编器程序中、I2C 传输被实现。 C 程序处理时间和日期的准备。 日期和时间存储在结构变量中。 当主器件检索时间和日期时、应传输10个字节。

    该程序不会使用中断进行 I2C 传输。

    程序通过测试 USISTTIFG 标志来轮询主器件的请求。 在主器件请求数据后、会调用汇编器程序中的子例程、以通过 I2C 总线传输10个字节。

    e2e.ti.com/.../DCF77_5F00_Stromz_5F00_F2012_5F00_ass5.rarBest此致 Jurgene2e.ti.com/.../1780.DCF77_5F00_Stromz_5F00_F2012.c

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

    感谢您的分享。 我看到您的汇编代码已经随您在开始时发布的代码而改变了很多。 由于我目前没有 MSP430F2012硬件、您能帮我捕获一些波形吗?
    1、只需每1秒或更长时间在 I2C (0x55)中添加0x55、即可分离每个字节波;
    2.将主 CLK 频率更改为1k
    3.捕获波形以在问题发生时对0x55进行打磨。
    我会将您的波形与您的代码进行比较、以查看它有什么问题。

    此致
    Gary
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Gary、
    感谢您的回答。
    是的、汇编代码与我在开始时发布的代码不同。
    我有许多测试版程序版本、我发现我发布的最后一个版本是最佳版本。
    速度非常慢的 I2C SCLK 1KHz。 好的、我将使用该 Clk 频率进行测试。
    谨致问候 Juergen
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Gary、
    我见过、您也是 MSP430FR2422的专家。 我使用该器件来解决 I2C 从器件问题。 我认为、eUSCI 是对 I2C 从设备进行编程的更好选择。
    但我对该器件有很多问题。 我无法设置 P1.0... P1.3作为输出。 似乎是 A0。。。 A3处于活动状态。 P1.4上的输出。 P1.7正常。 我有一个简单的程序代码:
    命名 main ;模块名称

    公共主函数 ;使主标签可见
    ;在本模块之外
    org) 0FFFEh
    DC16初始化 ;将复位向量设置为“初始化”标签

    RSEG CSTACK ;预先声明段
    RSEG 代码 ;将程序放在“代码”段中

    初始化:MOV SFE (CSTACK)、SP ;设置堆栈

    主:NOP ;主程序
    MOV.W #WDTPW+WDTHOLD、&WDTCTL;停止看门狗计时器
    MOV.b#0xff、&P1DIR
    MOV.b#0xff、&P2DIR;P2输出
    MOV.b#0xff、&P2OUT
    环路
    BIS.b#1、&P1OUT
    调用 延迟
    BIC.b. 1、P1OT
    调用 延迟
    JMP 环路

    延迟


    可重置
    结束

    我已经测试了2个器件、行为都是相同的。 我已经使用选项 P1SEL0=0、P1SEL1=0"进行了测试。
    P1.0上的信号一直为低电平(悬空)、200... 260mV。

    该程序在 IAR IDE 8.0上运行
    产品
    用于 MSP430 IDE 的 IAR Embedded Workbench、工业…… IAR Embedded Workbench 共享组件
    7.12.1 8.0.14.5326版
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、Juergen

    您解决此问题的商品。 eUSCI 比 USI 更强大。

    现在您已经了解了 GPIO 功能的配置、对吧?

    您可以参阅此处的表(位于数据表第52页)

    如果要将 P1.0..P1.3配置为 I/O 输出模式、应确保 P1SEL0和 P1SEL1在位0 1和2处为00。 并确保 P1DIR 在位0、1和2处为1。 请勿配置 ADCPCTLx 位、因为当您配置引脚将配置为模拟输入时、PIDIR 或 P1SEL 中的值不会与之匹配。

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

    您好、Gary、

    我已从调试器中插入屏幕截图。 您可以看到 P1OUT 所有引脚都为高电平,但在器件引脚 P1.0... P1.3不是高电压值。 它仅为260mV。 您还可以看到变量 P1DIR、P1SEL0、P1SEL2和 SYSCFG2。

    此致 Jurgen

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

    您好、Gary、
    我想我已经找到了端口不工作的原因。 如果我对器件进行编程并关闭/打开电源、 则端口会损坏。 我不知道有这种情况。编程后、我清除了具有 Elprotronic FET 的器件、端口再次正常。 如果我再次关闭/打开电源、则端口始终损坏。 我可以重复这些步骤多次。

    此致 Jürgen

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

    加载代码 dev.ti.com/.../
    看看它是否能够在 P1.0上正常工作?

    此致
    Gary
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Gary、
    非常感谢你的帮助。 我希望我现在可以解决 I2C 从设备问题。
    此致 Jurgen