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

📄 example_eeprom.s43

📁 430单片机串行通信i2c和uart代码
💻 S43
字号:
;******************************************************************************
;  MSP430F20xx Demo - USI I2C interface with AT24C02 EEPROM
;
;  Description: USI module is used in I2C mode to transmit 10 bytes of 
;  data to the AT24C02 EEPROM. The data is split into 2 streams of 8 bytes & 2 
;  bytes each so it can be prefixed by the page address of the EEPROM device. 
;  Data is then continuously read from the EEPROM and stored in RAM. 
;  LED turns on if transmitted data = received data. Received data can also be 
;  veiwed in the debugger window.
;
;   ACLK = n/a, MCLK = SMCLK = Calibrated 1MHz
;         
;               MSP430F20x2/3              AT24C02A EEPROM
;             -----------------          -----------------
;         /|\|              XIN|-     - | Vcc             |
;          | |                 |        |                 |
;          --|RST          XOUT|-       |                 |
;            |                 |        |                 |
;      LED <-|P1.0             |        |                 |
;            |                 |        |                 |
;            |         SDA/P1.7|------->|SDA              |
;            |         SCL/P1.6|------->|SCL          GND |
;
;  Note: Internal pull-ups are used in this example for SDA & SCL
;        EEPROM slave address = 0x50 
;
;  P.Thanigai
;  Texas Instruments Inc.
;  August 2007
;  Built with IAR Embedded Workbench Version: 3.42A
;*****************************************************************************
#include  <msp430x20x2.h>
EXTERN    TI_USI_I2C_MasterInit
EXTERN    TI_USI_I2CSelect
EXTERN    TI_USI_I2CRead
EXTERN    TI_USI_I2CWrite
EXTERN    TI_USI_I2CStop
            RSEG    DATA16_C
Transmit1   DB      0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07
Transmit2   DB      0x08,0x08,0x09   
            RSEG    DATA16_N
Receive     DS      10  
Check       DS      10
;-------------------------------------------------------------------------------
            RSEG    CSTACK                  ; Define stack segment
;-------------------------------------------------------------------------------
            RSEG    CODE                    ; Assemble to Flash memory
            EVEN
;-------------------------------------------------------------------------------
RESET       mov.w   #SFE(CSTACK),SP         ; Initialize stackpointer
StopWDT     mov.w   #WDTPW+WDTHOLD,&WDTCTL  ; Stop WDT
SetupDCO    mov.b   &CALBC1_1MHZ,&BCSCTL1   ; Load DCO calibration constants  
            mov.b   &CALDCO_1MHZ,&DCOCTL  
SetupPx     bis.b   #0x01,&P1DIR            ; P1.0& 1.1 as output 
            bic.b   #0x01,&P1OUT
InitCall    mov.b   #0xEA,R12               ; USIDIV_7+USISSEL_2+USICKPL
            mov.w   #StatusCallback,R14     ; Callback fn. pointer
            call    #TI_USI_I2C_MasterInit  ; Initialize USI master
SlaveDetect            
            xor.b   #0x01,&P1OUT            ; Detect if slave is present...
            mov.w   #0xFFFF,R5              ; ... LED toggles until slave ACKS
L1          dec.w   R5
            jnz     L1 
Poll_0      call    #AcknowledgePoll        ; Slave device present?
            cmp.b   #0,R12                  ; Is result zero (ACK)?
            jnz     SlaveDetect             ; Loop until device acknowledges
            clr.b   &P1OUT                  ; Slave acknowledged, LED off
TransmitCall_1
            mov.w   #0x50,R12               ; Slave address
            mov.w   #9,R14                  ; length = 9
            push.w  #Transmit1              ; pointer to data buffer 
            push.w  #0x00                   ; generate stop
            call    #TI_USI_I2CWrite        ; transmit data stream #1
            add.w   #4,SP                   ; compensate SP on return
            bis.w   #LPM0+GIE,SR            ; enter LPM, enable interrupts 
Poll_1      call    #AcknowledgePoll        ; Device ready for next transfer?
            cmp.b   #0,R12                  ; Is result zero (ACK)?
            jnz     Poll_1                  ; Loop until device acknowledges
TransmitCall_2
            mov.w   #0x50,R12               ; Slave address
            mov.w   #3,R14                  ; length = 3
            push.w  #Transmit2              ; pointer to data buffer 
            push.w  #0x00                   ; generate stop
            call    #TI_USI_I2CWrite        ; transmit data stream #2
            add.w   #4,SP                   ; compensate SP on return
            bis.w   #LPM0+GIE,SR            ; enter LPM, enable interrupts 
Poll_2      call    #AcknowledgePoll        ; Device ready for next transfer?
            cmp.b   #0,R12                  ; Is result zero (ACK)?
            jnz     Poll_2                  ; Loop until device acknowledges
TransmitCall_3
            mov.w   #0x50,R12               ; Slave address
            mov.w   #1,R14                  ; length = 1
            push.w  #Transmit1              ; pointer to data buffer 
            push.w  #0x01                   ; generate stop
            call    #TI_USI_I2CWrite        ; transmit to reset internal counter
            add.w   #4,SP                   ; compensate SP on return
            bis.w   #LPM0+GIE,SR            ; enter LPM, enable interrupts
ReceiveCall  
            mov.w   #0x50,R12               ; Slave address
            mov.w   #10,R14                 ; length = 10
            push.w  #Receive                ; pointer to data buffer
            push.w  #0x01                   ; do not generate stop
            call    #TI_USI_I2CRead         ; receive stream#1,#2
            add.w   #4,SP                   ; compensate SP on return
            bis.w   #LPM0+GIE,SR            ; enter LPM, enable interrupts 
StopTransaction      
            call    #TI_USI_I2CStop         ; Stop I2C transactions
CheckResult            
            mov.w   #Receive,R6             ; store received data location
            clr.b   R4
Compare     cmp.b   R4,0(R6)
            jz      Increment               ; data valid, continue
            clr.b   &P1OUT                  ; data invalid, LED off
            jmp     EndProgram
Increment   
            inc.b   R4
            inc.w   R6
            cmp.b   #10,R4
            jnz     Compare                 ; if all 10 bytes are correct.
            bis.b   #0x01,&P1OUT            ; ... turn on LED
EndProgram  jmp     $                       ; program ends here
AcknowledgePoll           
            mov.b   #0x50,R12               ; slave address
            call    #TI_USI_I2CSelect       ; Ack polling function 
            ret
StatusCallback
            mov.w   #1,R12                  ; wake up on exit
            ret

;-------------------------------------------------------------------------------
            COMMON  INTVEC                  ; Interrupt Vectors
;-------------------------------------------------------------------------------
            ORG     RESET_VECTOR            ; POR, ext. Reset
            DW      RESET                   ;
            END

⌨️ 快捷键说明

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