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.

[参考译文] MSP430FR2476:msp430fr2476

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1074171/msp430fr2476-msp430fr2476

部件号:MSP430FR2476
《线程》中讨论的其他部件: MSP430FR5972MSP430G2955测试

你(们)好,贾斯

我想再次谈谈我在微控制器 MSP430FR2476上遇到的 I2Cbus 问题,就像我以前写过的那样,这是一个问题

并且无法在 UCB1上启用此端口。

我想准确地说,我在其他项目上使用 I2CBus 没有任何问题。

在这段时间里,我没有时间完成这项工作,但现在需要完成这项工作,在其他设备上使用相同的控制器。

问题其实不是 I2cbus,而是 inizialation,我用同样的程序长时间处理不同的项目,没有任何问题,
当我选择该项时,只能调整寄存器。

在 Msp430FR2476上,当我设置初始化寄存器时,位将设置为“忙碌”,并且无法使用 I2cbus。

这只适用于 I2cbus 的 UCB1和 UCB0,因为 SPI 工作正常。 我仅在 SPI 上测试了 UCB1。

当设置  BIC.b #UCSWRST,UCB1CTL1立即将 BUSYU 位设置为 UCB1STATW 时,我尝试了以下所有配置 AD

并且不可能使用 I2Cbus。

首先 ,Bset_W,BCLR_W,Bset_B,BCLR_B 都是宏  

Bset_W .macro par0,par1.
       BISx.w #par0,par1.
       .endm

BCLR_W .macro par0,par1.
      bix.w #par0,par1;*
      .endm  

Bset_B .macro par0,par1.
       BISx.b #par0,par1.
       .endm

BCLR_B .macro par0,par1.
      bix.b #par0,par1;*
      .endm  

数据表上的配置  

UCBxCTL1 |= UCSWRST;// eUSCI_B 处于重置状态
UCBxCTLW0 |= UCMODE_3;// I2C 从模式
UCBxI2COA0 = 0x0012;//自己的地址为12十六进制
P2SEL |= 0x03;//配置 I2C 引脚(特定于设备)
UCBxCTL1 &=^UCSWRST;// eUSCI_B 处于运行状态
UCBxIE |= UCTXIE + UCRXIE;//启用 Tx&RX-Interrupt
GIE;//常规中断启用

在这种情况下,我不使用中断,而是主模式  


此配置在 MSP430FR5972上正常工作 ,在 MSP430FR2476上不起作用  

      之二     #UCSWRST,UCB0CTLW0  
      Bset_W (UCMODE_3+UCMST +UCSYNC),UCB0CTLW0  
      MOV.W   #I2SPEED_100kHz,UCB0BRW  
      BCLR_W UCSWRST,UCB0CTLW0  

此配置在 MSP430G2955上工作正常 ,在 MSP430FR2476上不工作  

     Bset_B UCSWRST,UCB0CTL1  
     Bset_B (UCMODE_3+UCMST +UCSYNC),UCB0CTL0  
     Bset_B UCMODE_3,P3SEL  
     MOV.B   #I2SPEED_100kHz_LSB,UCB0BR0  
     MOV.B   #I2SPEED_100kHz_MSB,UCB0BR1
     Bset_B (UCSSEL0+UCSSEL1),UCB0CTL1
     BCLR_B UCSWRST,UCB0CTL1

所以我已经做了许多可能的配置,接下来我们将测试一个示例  

重置位 UCSWRST,UCB0CTL1时的所有配置都会立即 触发忙位,无法再重置此位。  

      BIS b   #(SCL+SDA),P4SEL0
      BIS  #UCSWRST,UCB1CTLW0  
      BIS.w  #(UCMODE_3+UCMST + UCSYNC + UCSSEL0+UCSSEL1),UCB1CTLW0
      MOV.W #160,UCB1BRW  
      BIC #UCSWRST  ,UCB1CTLW0  

     BIS   #UCSWRST,UCB1CTLW0  
     BIS.w   #(UCMODE_3+UCMST + UCSYNC + UCSSEL0+UCSSEL1),UCB1CTLW0
     MOV.W  #160,UCB1BRW  
     BIS b   #(SCL+SDA),P4SEL0
     BIS   #UCAST_2,UCB0CTLW1
     BIC #UCSWRST   ,UCB1CTLW0  

在以下情况下,尝试使用位方法设置寄存器,而不使用字方法设置寄存器时,OIS 未发生任何更改  

在寄存器上  

Bset_B UCSWRST,UCB1CTL1  
Bset_B (UCMODE_3+UCMST +UCSYNC),UCB1CTL0  

MOV.B #160,UCB1BR0  
MOV.B #0,UCB1BR1  
Bset_B (UCSSEL0+UCSSEL1),UCB1CTL1
Bset_B (SCL+SDA),P4SEL0
BCLR_B UCSWRST,UCB1CTL1

-----

BIS.b #UCSWRST,UCB1CTL1
BIS.w #(UCMODE_3+UCMST + UCSYNC + UCSSEL0+UCSSEL1),UCB1CTLW0  
MOV.W #160,UCB1BRW  
BIS b #(SCL+SDA),P4SEL0
BIC.b #UCSWRST,UCB1CTL1  

---
BIS.b #UCSWRST,UCB1CTLW0  
BIS.w #(UCMODE_3+UCMST + UCSYNC + UCSSEL0+UCSSEL1),UCB1CTLW0  
MOV.w #160,UCB1BRW;*预校准器 LSB
BIS b #(SCL+SDA),P4SEL0
BIC.b #UCSWRST,UCB1CTLW0  


-----

BIS.b #UCSWRST,UCB1CTLW0  
MOV.w #(UCMODE_3+UCMST +UCSYNC +UCSSEL0+UCSSEL1+UCSSWRST),UCB1CTLW0  
MOV.W #160,UCB1BRW  
BIS b #(SCL+SDA),P4SEL0
BIC.b #UCSWRST,UCB1CTLW0  

-----
BIS #UCSWRST,UCB1CTLW0  
MOV.b #(UCMODE_3+UCMST +UCSYNC),UCB1CTL1
MOV.W #160,UCB1BRW  
BIS b #(SCL+SDA),P4SEL0
BIC #UCSWRST,UCB1CTLW0  

-----
BIS #UCSWRST,UCB1CTLW0  
BIS.w #(UCMODE_3+UCMST +UCSYNC +UCSSEL0+UCSSEL1+UCTXSTP +UCTXSTT),UCB1CTLW0
MOV.W #160,UCB1BRW  
BIS b #(SCL+SDA),P4SEL0
BIC #UCSWRST,UCB1CTLW0  

-----
BIS #UCSWRST,UCB1CTLW0  
BIS.w #(UCMODE_3+UCMST +UCSYNC +UCSSEL0+UCSSEL1+UCTXSTP +UCTXSTT),UCB1CTLW0
MOV.W #160,UCB1BRW  
BIS b #(SCL+SDA),P4SEL0
BIS #UCTXSTP,UCB1CTLW0
BIC #UCSWRST,UCB1CTLW0  

-----

BIS b #(SCL+SDA),P4SEL0
BIS #UCSWRST,UCB1CTLW0  
BIS.w #(UCMODE_3+UCMST +UCSYNC +UCSSEL0+UCSSEL1+UCTXSTP +UCTXSTT),UCB1CTLW0
MOV.W #160,UCB1BRW  
BIS #UCTXSTP,UCB1CTLW0
BIC #UCSWRST,UCB1CTLW0

-----

BIS #UCSWRST,UCB1CTLW0
BIS.w #(UCMODE_3+UCMST +UCSYNC +UCSSEL0+UCSSEL1+UCTXSTP +UCTXSTT),UCB1CTLW0
MOV.W #160,UCB1BRW  
BIS #UCTXSTP,UCB1CTLW0
BIC #UCSWRST,UCB1CTLW0  
BIS b #(SCL+SDA),P4SEL0

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="196114" url="~ë/support/microcontroller/MSP-low-Power-microcontroller-group/MSP430/f/MSP-low-Power-microcontroller-forum/1074171/msp430fr2476-msp430fr2476"]UCBxCTL1 |= UCSWRST;// eUSI_B 处于重置状态[引用]

    这将永远不起作用,因为重置位位于 CTL0中。 此外,请使用“=”而不是“|=”来确保所有位都已重置,然后再将其输入。 重置期间不会全部清除。

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

    你好,大卫  

    很抱歉,但我无法理解,

     UCSWRST 位于寄存器 UCB1CTLW0中  

    使用“=”代替“|=”

    这是数据表中的示例,  

    UCBxCTL1 |= UCSWRST;// eUSCI_B 处于重置状态
    UCBxCTLW0 |= UCMODE_3;// I2C 从模式
    UCBxI2COA0 = 0x0012;//自己的地址为12十六进制
    P2SEL |= 0x03;//配置 I2C 引脚(特定于设备)

    UCBxCTL1 &=^UCSWRST;// eUSCI_B 处于运行状态

    我在汇编程序中编程,我在汇编程序中设置并重置位,请参见下文  

    这是我的固件和汇编程序操纵位

            之二     #UCSWRST,UCB0CTLW0  
            之二     #(UCMODE_3+UCMST +UCSYNC),UCB0CTLW0  
            MOV.W  #I2SPEED_100kHz,UCB0BRW  
            BIC.w     #UCSWRST,UCB0CTLW0  

    如果我尝试在字节访问中设置或重置位到寄存器中,而不是在字访问中  

    字节未更改  

    示例:   

            之二.b.     #UCSWRST,UCB0CTL0  
            之二.b.     #(UCMODE_3+UCMST +UCSYNC),UCB0CTL1  ;*此位未更改  
            MOV.W  #I2SPEED_100kHz,UCB0BRW  
            BIC.b     #UCSWRST,UCB0CTL0  

    路易吉  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="196114" url="~ë/support/microcontroller/MSP-low-Power-microcontroller-group/MSP430/f/MSP-low-Power-microcontroller-forum/1074171/msp430fr2476-msp430fr2476/3975323#3975323]bis.b     #(UCMODE_3+UCMST+UCSYNC),UCB0CTL1  ;*此位未更改 [/QUES]

    你不停地跳。 在上一个示例中,您写信给 CTL0,但此处只写给 CTL1的下半部分。 这些设置都不驻留。 由于 UCMODE 位位于该寄存器的上8位,因此它在 CTL0上也不起作用。

    CTL0和 CTL1都是16位寄存器。 如果出于某种原因您只需要访问字节的上部或下部,则要使用的正确符号会附加“_L”或“_H”。

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

    BIS b #(SCL+SDA),P4SEL0

    P4.6/P4.5参见 UCB0SDA/SCL (假设.USCIB0RMP=1)。  UCB1SDA/SCL 位于 P3.2/P3.6上(假设 USCIB1RMP=0)。 [参考数据表(SLASEO7C)表9-11和9-25]

    您的电线连接在哪里?

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

    大卫  

    您可以向我发送设置此寄存器的示例吗?

    我使用了数据表上报告的寄存器的名称, 我尝试以  字节和单词访问,但访问方式相同  

    寄存器在数据表中定义如下(第648页 SLAU445I)

    00h UCBxCTLW0 eUSCI_Bx 控制字0读/写字01C1h 第24.4.1节
    00h UCBxCTL1 eUSCI_Bx 控制1读/写字节 C1h
    01h UCBxCTL0 eUSCI_Bx 控制0读/写字节01h

    我发现   UCBxCTL1是一 个较低的字节 LSB 位0-7  

    UCBxCTL0  是一个较高的字节,但 MSB 位8-15

     我现在在文件 MSp430fr2476.cmd 中看到,已定义此寄存器  

    UCA0CTLW0 = 0x0500;
    UCA0CTLW0_L = 0x0500;
    UCA0CTLW0_H = 0x0501;

    并且在文件 中,MSp430fr2476.h 是定义的  

    SFR_16BIT (UCB0CTLW0);/* eUSCI_Bx 控制字寄存器0 */
    SFR_8位(UCB0CTLW0_L);
    SFR_8位(UCB0CTLW0_H);

    因此  ,UCB0CTL1 和 UCB0CTL0 没有定义编译器为什么不显示警报?  

    在手册中进行定义,通常手册和定义具有相同的名称  

    明天我将尝试使用   UCA0CTLW0_L,UCA0CTLW0_H 访问 ,查看是否正常  

    谢谢你  

    路易吉  

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

    布鲁斯  

     UCB0SDA/SCL 也在 P4.3 SCL  和 P4.4 SDA 上使用此端口  

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

    大卫  

    今天上午,当启用 I2C 时,我再次尝试以下组合而不会成功  

    立即设置忙位  

    如果在删除位  #UCSWRST 之前的过程中删除位 UCMODE_3,则位忙不会  

    设置。

    此过程也会立即置于引脚配置下,因此没有其他配置  

    已启用   

    主程序:

           movx.w #stack_pointer,sp  

           MOV.w #(FRCTLP+NWITS_1),FRCTL0
           MOV.w #(FRWPPW+DFWP+PFWP),SYSCFG0  

           MOV.b #10000000b,P1OUT  
           MOV.b #00000000b,P2OUT  
           MOV.b #00000010b,P3OUT  
           MOV.b #00000101b,P4OUT  
           MOV.b #10000110b,P5OUT  
           MOV.b #00000000b,P6OUT  
           MOV.b #111111b,P1DIR  
           MOV.b #111111b,P2DIR  
           MOV.b #111111b,P3DIR  
           MOV.b #11011010b,P4DIR
           MOV.b #011111b,P5DIR  
           MOV.b #111111b,P6DIR

     
           BIS #UCSWRST,UCB1CTLW0
           BIS 编号(UCMODE_3+UCMST +UCSYNC),UCB1CTLW0_H
           BIS 编号(UCSSEL0+UCSSEL1),UCB1CTLW0_L
           MOV.W #160,UCB1BRW
           BIS b #(SCL+SDA),P4SEL0
           BIC #UCSWRST,UCB1CTLW0

           BIS #UCSWRST,UCB1CTLW0
           BIS.b #(UCMODE_3+UCMST +UCSYNC),UCB1CTLW0_H
           BIS.b #(UCSSEL0+UCSSEL1),UCB1CTLW0_L
           MOV.W #160,UCB1BRW
           BIS b #(SCL+SDA),P4SEL0
           BIC #UCSWRST,UCB1CTLW0

           BIS.b #UCSWRST,UCB1CTLW0_L
           BIS.b #(UCMODE_3+UCMST +UCSYNC),UCB1CTLW0_H
           BIS.b #(UCSSEL0+UCSSEL1),UCB1CTLW0_L
           MOV.W #160,UCB1BRW
           BIS b #(SCL+SDA),P4SEL0
           BIC.b #UCSWRST,UCB1CTLW0_L

    路易吉  

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

    我看到了三个略有不同的版本的初始化代码。 都是错的,但你使用的是哪一个?

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

    如果要使用 P4.3/P4.4引脚来建立 UCB1,则需要设置 SYSCFG3:USCIB1RMP=1。[参考数据表9-11注释(2)和用户指南表1-32]

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

    你好,布鲁斯  

    已完成设置位  SYSCFG3:USCIB1RMP=1 ,但没有任何更改,始终打开位占线  

    您可以给我发送正确配置,以确保正确吗?  

    我尝试了很多不同的配置,但没有任何东西,我不知道是错误的  

    路易吉  

     

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

    你好,大卫  

    我已经测试了所有这种组合,而且顶部的组合也发生了变化,但没有改变  

    我还设置了 SYSCFG3: USSCIB1RMP=1位,就像告诉我 Bruce 的那样,但没有任何改变  

    您可以给我发送正确配置,以确保正确吗?  

    我尝试了很多不同的配置,但没有任何东西,我不知道是错误的  

    路易吉  

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

    我没有解决这个问题,喷气机已经过测试,可以确定 I2cbus B1的初始化吗?  

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

    我没有解决这个问题,喷气机已经过测试,可以确定 I2cbus B1的初始化吗?  

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

    我将您的代码粘贴到装配体模板中,并 在 UCB1安装程序之前插入( 我希望您已经/不需要 UCB1安装程序):

    SDA	.set BIT4    ; P4.4=UCB1SDA
    SCL	.set BIT3	; P4.3=UCB1SCL
    			bis.w #USCIB1RMP,SYSCFG3  	; Use the P4 pins for UCB1
    			bic.b #(SCL+SDA),P4DIR		; Input again
    			bis.b #(SCL+SDA),P4OUT		; Cheat on
    			bis.b #(SCL+SDA),P4REN		;  the pullups
    			bic.w #LOCKLPM5,PM5CTL0		; Engage GPIOs
    

    如果我在设置后停止,UCB1寄存器看起来正常,UCBBUSY=0。 我不知道我们在做什么不同。

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

    非邀约:我也成功地完成了这一序列,我觉得阅读起来容易一些:

    			  mov.w #(UCSWRST+UCMODE_3+UCMST+UCSYNC+UCSSEL0+UCSSEL1),UCB1CTLW0
                  mov.w #160,UCB1BRW
                  bis.b #(SCL+SDA),P4SEL0
                  bic.w #UCSWRST,UCB1CTLW0
    

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

    你好,布鲁斯  

    我已经测试过,现在正在工作,最后我认为我的错误是 ,在我的测试期间,我首先没有设置位 #USSCIB1RMP,SYSCFG3

    之后,请勿使用此序列  mov.w #(UCSWRST+UCMODE_3+UCMST +UCSYNC+UCSSEL0+UCSSEL1),UCB1CTLW0

     我使用过此配置  

    BIS #USSCIB1RMP,SYSCFG3

    BIS #UCSWRST,UCB1CTLW0

    MOV.w #(UCMODE_3+UCMST +UCSYNC +UCSSEL0+UCSSEL1),UCB1CTLW0
    MOV.W #160,UCB1BRW
    BIS b #(SCL+SDA),P4SEL0
    BIC #UCSWRST,UCB1CTLW0

    使用此配置不起作用,因为可能  不接受单独的 bis.w #UCSWRST,UCB1CTLW0  

    他只能使用以下配置  

    BIS #USSCIB1RMP,SYSCFG3

    MOV.w #(UCSWRST+UCMODE_3+UCMST +UCSYNC+UCSSEL0+UCSSEL1),UCB1CTLW0
    MOV.W #160,UCB1BRW
    BIS b #(SCL+SDA),P4SEL0
    BIC #UCSWRST,UCB1CTLW0

    我也尝试过这种配置,但首先没有更改 位 #USCIB1RMP,SYSCFG3。

    当使用 单独的设置 BIS.w #UCSWRST,UCB1CTLW0设置 I 时

    我发现这种操纵是不受影响的;无论如何,我在配置过程中都有   

    BIS.w #USSCIB1RMP,SYSCFG3;使用 P4引脚用于 UCB1
    BIC.b #(SCL+SDA),P4DIR;再次输入
    BIS.b #(SCL+SDA),P4OUT;CHAAT ON
    bs.b #(SCL+SDA),P4REN;上拉
    BIC.w #LOCALPM5,PM5CTL0;启用 GPIO

    非常感谢您的支持  

    路易吉  

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

    1)第一个序列在第一个指令中设置 UCSWRST,然后在第二个指令中清除 UCSWRST (然后尝试设置一些“需要重置”字段)。

    2)我按照我添加的顺序,接合了 I2C 引脚上的内部上拉。 就我而言,我没有公共汽车(因此没有拉车),但如果你的公共汽车很慢,你的电线也不是太长,内部巴士就足够了。 您的一辆汽车上的拉杆是否可能松动?

    我很高兴你能让它发挥作用。

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

    1)当然,是的,我知道,出于这个原因,我使用了 bis.w BIC 指令  

    BIS #USSCIB1RMP,SYSCFG3

    BIS 编号(UCSWRST+UCMODE_3+UCMST +UCSYNC +UCSSEL0+UCSSEL1),UCB1CTLW0

    但同样不起作用,但当我使用此设置时,可能没有设置位  #USSCIB1RMP,SYSCFG3,这是我完全忘记的  

    2) 我的外部总线在 SDA 和 SCL 引脚上拉拔2k2,尚未测试这种新的 PCB,但在旧的 PCB 上工作100khz,在我的测试期间,我遇到400kHz 及以上,没有任何问题。

    老实说,我还没有测试所有 I2Cbus,但我看到它没有设置更多繁忙的比特,并发出停止比特。

    我认为这种方法现在可以正常工作,声音很好。

    感谢您的支持

    路易吉