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.

[参考译文] MSP430G2333:MSP430G2333IPW28R - I2C Tx

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1007901/msp430g2333-msp430g2333ipw28r---i2c-tx

器件型号:MSP430G2333

用于 MSP430 7.11.1 (7.11.1.983)的//IAR 汇编器
#include "msp430.h"                                ;#define controlled include 文件

         命名 main                              ;模块名称
         公共主函数                              ;使主标签可以在 本模块外看到

         RSEG CSTACK                           ;预先声明段
         RSEG 代码                             ;将程序放在“代码”段中
复位   MOV #SFE (CSTACK)、SP                   ;设置堆栈
StopWDT mov.w #WDTPW+WDTHOLD、WDTCTL       ;停止看门狗计时器

//配置 SMCLK = 19.61MHz (3.3V)
主:   bis.b #RSEL0、&BCSCTL1
       BIS.b #RSEL1、&BCSCTL1
       BIS.b #RSEL2、&BCSCTL1
       BIS.b #RSEL3、&BCSCTL1                     ;RSELx=15 (1111b)

       BIS.b #DCO0、&DCOCTL
       BIS.b #DCO1、&DCOCTL
       BIS.b #DCO2、&DCOCTL                      ;DCOx=7 (111b)

       BIC.b #MOD0、&DCOCTL
       BIC.b #MOD1、&DCOCTL
       BIC.b #MOD2、&DCOCTL
       BIC.b #Mod3、&DCOCTL
       BIC.b #Mod4、&DCOCTL                      ;MODx = 0 (00000b)

       BIS.b #10h、&P1SEL                          ;P1.4 (引脚#6) = SMCLK

// P1.6 (引脚#22) = SCL   
       BIC.b #40h、         P1DIR (&P)                   ;输入
       BIS.b #40h、         P1SEL (&P)                   ;I2C 引脚 SCL =使能
       BIS.b #40h、         P1SEL2 (&P)                  ;I2C 引脚 SCL =使能

// P1.7 (引脚#23) = SDA
       BIC.b #80h、         P1DIR (&P)                   ;输入
       BIS.b #80h、         P1SEL (&P)                   ;I2C 引脚 SDA =使能
       BIS.b #80h、         P1SEL2 (&P)                  ;I2C 引脚 SDA =使能

//将 USCI_B0配置为 I2C 模式
       BIS.b #UCSWRST、  &UCB0CTL1               ;启用软件复位

       BIS.b #UCMST、      UCB0CTL0               ; I2C 主机模式
       BIS.b #UCMODE_3、&UCB0CTL0               ;eUSCI 模式= I2C
       BIS.b  #UCSYNC、  &UCB0CTL0               ;1=同步模式
       BIC.b #UCSLA10、   &UCB0CTL0               ;寻址具有7位地址的从器件


       BIS.b #UCSSEL_3+UCSWRST、和 UCB0CTL1      ;使用 SMCLK,保持软件复位
       MOV.b #00200、      UCB0BR0 (&U)                ;波特率= SMCLK/200  
       MOV.b #00000、      UCB0BR1                ;~100KHz

       BIC.b #UCSWRST、  &UCB0CTL1                ;清除软件复位,恢复操作

//发送  
       MOV.w #0020h、     UCB0I2CSA                ;I2C 从器件地址= AD7998-0 (AS =浮点)
       BIS.b #UCTR、       &UCB0CTL1                 ;UCTR=1 -> I2C=TX
       BIS.B #UCTXSTT、  &UCB0CTL1                ;发送启动条件。

nnn:   bit.B #UCB0TXIFG、&IFG2                    ;UCB0TXIFG=1?
       JNC nnn

       MOV.b #04h、          UCB0TXBUF               ;04h -> Tx
       BIS.B #UCTXSTP、  &UCB0CTL1                ;发送停止条件

I2C_rdy 位。b #UCBBUSY、   &UCB0STAT                 ;等待 I2C 模块完成所有操作
       JC i2c_rdy

       JMP $                                      ;跳转至当前位置'$'
                                                  ;(无限循环)
///----------------------------------
      常见的 INTVEC                            ;中断矢量
///----------------------------------
      org reset_vector                         ;重置向量
      DW 复位

      结束

运行:未传输任何数据。 只提供地址!!!  为什么?


分步运行-工作!!!

STEP-BY-STEP

延迟运行:

//发送  
       MOV.w #0020h、     UCB0I2CSA                ;I2C 从器件地址= AD7998-0 (AS =浮点)
       BIS.b #UCTR、        &UCB0CTL1                 ;UCTR=1 -> I2C=TX
       BIS.B #UCTXSTT、  &UCB0CTL1                 ;发送启动条件。

nnn:   bit.B #UCB0TXIFG、&IFG2                     ;UCB0TXIFG=1?
       JNC nnn

等待   mov.w #01000、      R15.                       ;延迟至 R15
L1      Dec.w             R15.                       ;减量 R15
       Jnz L1                                      ;延迟?

       MOV.b #04h、          UCB0TXBUF               ;04h -> Tx
       BIS.B #UCTXSTP、  &UCB0CTL1                 ;发送停止条件

I2C_rdy 位。b #UCBBUSY、   &UCB0STAT                 ;等待 I2C 模块完成所有操作
       JC i2c_rdy

       JMP $      

未传输任何数据。  只提供地址!!!  为什么?

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

    嗨! 任何人! 帮助! 请!!

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

    您好,

    很抱歉耽误你的回答。 我上周不在办公室。

    执行这些测试时、您是否有一个实际的 I2C 从板、其从地址为0x20h? 如果不是、则可能会导致此问题。 主器件只发送地址、并且在它们从器件获得响应之前无法发送数据。

    此致、

    现金 Hao

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

    是的。 可用!

    MSP430G2333+AD7998

    所有屏幕截图均来自连接到 AD7998的示波器

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

    在分步调试器模式中、写入 UCB0TXBUF 寄存器后、当读取时、我会在 UCB0RXBUF 寄存器中获得相同的数据!

               BIC.b #UCTR、&UCB0CTL1        ;UCTR=0 -> I2C=RX
               BIS.B #UCTXSTT、&UCB0CTL1   ;发送开始条件。

    POLL_STT  位.B #UCTXSTT、和 UCB0CTL1    ;轮询 UCTXSTT 位
               JC POLL_STT                  ;当被清除时,

               MOV.b UCB0RXBUF、R8
               BIS.B #UCTXSTP、和 UCB0CTL1    ; 发送停止条件



    运行 I2C RX

    在调试器 UCB0RXBUF = 04h 和 R8=04h 中

    这意味着从器件正在响应!

    就像在"运行"模式中这样- 没有传输任何数据。 只提供地址!!! 读取后- UCB0RXBUF = 00h

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

    为什么处于写入模式的主器件不生成数据发送、而是立即启动停止过程?

    为什么他在分步调试中这么做?