⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 msp430x11x1_tmp100.s43

📁 MSP430x11x1系列单片机示例汇编源代码
💻 S43
字号:
;******************************************************************************
;   MSP430x11x1 Demo - Software I2C Master Interface to TMP100
;
;   Description: I2C communication with a TMP100, in default condition, is
;   demonstrated. If temperature read > 30C (01Eh), P1.0 is set, else reset.
;   Only upper 8-bits from TMP100 temperature register are used, representing
;   7Fh = 128C, 80h = -128C. Slave Acknowledge error checking not implemented.
;   I2C timing assumed with MCLK ~800kHz.
;   ACLK = n/a, MCLK = SMCLK = default DCO ~800kHz
;
;                                   MSP430F1121
;                                -----------------
;                    /|\ /|\ /|\|              XIN|-
;                    10k 10k  | |                 |
;      /|\  TMP100    |   |   --|RST          XOUT|-
;       |   -------   |   |     |                 |
;       +--|Vcc SDA|<-|---+---->|P2.0         P1.0|---> LED
;       +--|A0     |  |         |                 |
;         -|A1     |  |         |                 |
;       +--|Vss SCL|<-+---------|P2.1             |
;      \|/  -------             |                 |
;
;
;
;   CPU registers used
#define     RXTXI2C  R7
#define     ADDRI2C  R8
#define     DATAI2C  R9
#define     BITI2C   R10
;
;   Definitions for I2C bus
SDA         EQU     001h                    ; P2.0 controls SDA line (pull-up)
SCL         EQU     002h                    ; P2.1 controls SCL line (pull-up)
Code        EQU     09Eh                    ; Device Code with A0=1, A1=float
;Code         EQU    09Ch                    ; Device Code with A1=A0=1
;
;   M. Buccini
;   Texas Instruments Inc.
;   Feb 2005
;   Built with IAR Embedded Workbench Version: 3.21A
;*****************************************************************************
#include  <msp430x11x1.h>
;------------------------------------------------------------------------------
            ORG     0F000h
;------------------------------------------------------------------------------
RESET       mov.w   #300h,SP                ; Initialize stackpointer
            mov.w   #WDTPW+WDTHOLD,&WDTCTL  ; Stop WDT
            bis.b   #01h,&P1DIR             ;
                                            ;
Mainloop    mov.b   #0,ADDRI2C              ; ADDRI2C = Pointer
            call    #Read_I2C               ;
            bic.b   #01h,&P1OUT             ; P1.0 = 0
            cmp.b   #01Eh,DATAI2C           ; DATAI2C > 30c?
            jlo     Mainloop                ; Again
            bis.b   #01h,&P1OUT             ; P1.0 = 1
            jmp     Mainloop                ; Again
;
;///////////I2C Subroutines start//////////////////////////////////////////////
;------------------------------------------------------------------------------
Read_I2C;   enter ADDRI2C=00 - FF I2C device address to read
;                 RXTXI2C=x
;                 DATAI2C=x
;           exit  ADDRI2C=x
;                 RXTXI2C=x
;                 DATAI2C=00 - FF I2C device data
;------------------------------------------------------------------------------
            mov.b   #Code,RXTXI2C           ; Control
            call    #I2C_Start              ; Send Start, control and Ack
            mov.b   ADDRI2C,RXTXI2C         ; Address
            call    #I2C_TX                 ; Send address and Ack
            mov.b   #Code,RXTXI2C           ; Control
            bis.b   #01h,RXTXI2C            ; "read"
            call    #I2C_Start              ; Send Start, control+1 and Ack
            call    #I2C_RX                 ; Send Read
            call    #I2C_RX_NAck            ; Send NAck
            call    #I2C_Stop               ; Send Stop
            ret                             ;
                                            ;
;------------------------------------------------------------------------------
I2C_Start;  enter SDA=x, SCL=x
;           exit  SDA=1, SCL=0
;------------------------------------------------------------------------------
            bic.b   #SCL+SDA,&P2DIR         ; SCL and SDA to input direction
            bic.b   #SCL+SDA,&P2OUT         ; SCL=1, SDA=1
            bis.b   #SDA,&P2DIR             ; SDA=0
            bis.b   #SCL,&P2DIR             ; SCL=0
;------------------------------------------------------------------------------
I2C_TX;     enter SDA=1, SCL=0
;           exit  SDA=1, SCL=0
;------------------------------------------------------------------------------
            mov     #08,BITI2C              ;
I2C_TX_Bit  rla.b   RXTXI2C                 ; data bit -> carry
            jc      I2C_TX1                 ;
I2C_TX0     bis.b   #SDA,&P2DIR             ; SDA=0
            jmp     I2C_TXx                 ;
I2C_TX1     bic.b   #SDA,&P2DIR             ; SDA=1
I2C_TXx     bic.b   #SCL,&P2DIR             ; SCL=1
            nop                             ; delay to meet I2C spec
            nop                             ;
            bis.b   #SCL,&P2DIR             ; SCL=0
            dec     BITI2C                  ;
            jnz     I2C_TX_Bit              ; continue until 8 bits are sent
            bic.b   #SDA,&P2DIR             ; SDA=1
                                            ;
I2C_TX_Ack  bic.b   #SCL,&P2DIR             ; SCL=1
;            bit.b   #SDA,&P2IN              ; Slave_Ack --> carry
;            jnc      I2C_Error              ; No carry = Ack error
            nop                             ; delay to meet I2C spec
            nop                             ;
            bis.b   #SCL,&P2DIR             ; SCL=0
            ret                             ; Return from subroutine
                                            ;
;------------------------------------------------------------------------------
I2C_RX  ;   enter SDA=1, SCL=0
;           exit  SDA=1, SCL=0
;------------------------------------------------------------------------------
            mov.b   #08,BITI2C              ; 8 bits to read
I2C_RX_Bit  bic.b   #SCL,&P2DIR             ; SCL=1
            bit.b   #SDA,&P2IN              ; SDA bit -> carry
            rlc.b   DATAI2C                 ; store data bit
            bis.b   #SCL,&P2DIR             ; SCL=0
            dec     BITI2C                  ; all bits read?
            jnz     I2C_RX_Bit              ; continue until 8 bits are read
            ret                             ; Return from subroutine
                                            ;
I2C_RX_Ack  bis.b   #SDA,&P2DIR             ; SDA=0, Master Ack
I2C_RX_NAck bic.b   #SCL,&P2DIR             ; SCL=1
            nop                             ; delay to meet I2C spec
            nop                             ;
            bis.b   #SCL,&P2DIR             ; SCL=0
            bic.b   #SDA,&P2DIR             ; SDA=1
            ret                             ; Return from subroutine
                                            ;
;------------------------------------------------------------------------------
I2C_Stop;   enter SDA=x, SCL=0
;           exit  SDA=1, SCL=1
;------------------------------------------------------------------------------
            bis.b   #SDA,&P2DIR             ; SDA = 0
            bic.b   #SCL,&P2DIR             ; SCL = 1
            bic.b   #SDA,&P2DIR             ; SDA = 1
I2C_End     ret                             ;
                                            ;
;------------------------------------------------------------------------------
;           Interrupt Vectors
;------------------------------------------------------------------------------
            ORG     0FFFEh                  ; MSP430 RESET Vector
            DW      RESET                   ;
            END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -