📄 mspf413-tmp100 interface rev 0-01.s43
字号:
;******************************************************************************
; MSP430F413 & TMP100 Software Interface
;
; Description: I2C communication with a TMP100 in one-shot conversion mode
; is demonstrated. Temperature is read from the TMP100 and displayed to LCD.
; Only upper 8-bits from TMP100 temperature register is read, representing
; 7Fh = 128oC to 80h = -128oC in 1oC steps.
; MSP430 is I2C master with TMP100 as the slave. Ack error checking on WR
; not implemented. DCO/FLL generated MCLK = 1MHz. LMP3 implemented with
; wake-up every 2 seconds as defined by Basic Timer interrupt from
; watch crystal.
;
; /|\ /|\ /|\
; | TMP100 10k 10k MSP430F413
; | ------- | | ----------
; +---|Vcc SDA|<-|---+>|P2.0 | +----------------------+
; +--|A0 | | | S0-S23|--->| Varitronix 3.5 digit |
; |--|A1 | | | COM0|--->| Static LCD Display |
; |--|Vss SCL|<-+-----|P2.1 | +----------------------+
; \|/ ------- | |
; | XIN|<---32.768KHz Watch Crystal
;
;
; CPU registers used
#define DIGITS R6
#define RXTXI2C R7
#define ADDRI2C R8
#define DATAI2C R9
#define BITI2C R10
;
; Definitions for I2C bus
TMPADDR equ 090h ; TMP100 HW Address (A0=A1=0+WR)
SDA equ 001h ; P2.0 controls SDA line (pull-up)
SCL equ 002h ; P2.1 controls SCL line (pull-up)
;
; Z. Albus
; Texas Instruments, Inc
; August 2002
;
; Revision 0-01 Updated 5/12/04 (A. Dannenberg/Z. Albus)
; I2C functions have been modified to allow the slave to hold SCL low
; for introducing a delay and also to fulfill Philips I2C timing specs
; for standard mode transfers at 1.048576 MHz CPU frequency.
;
; NOTE: I2C routine RX/TX execution times are slightly increased vs. the
; original software version due to I2C timing compliance. Consequently, the
; per-function instantaneous current consumption during I2C routine execution
; is also slightly increased in comparison to the data given in the app note
; for the original I2C software implementation. However, the time-average
; current consumption is only increased by 0.04uA to a total average Icc
; of 2.49uA.
;******************************************************************************
#include "msp430x41x.h"
;
;------------------------------------------------------------------------------
; word & byte variables definition
ORG 0200h
;------------------------------------------------------------------------------
Neg_Sign DB 0 ; Negative Temperature Flag
;
;------------------------------------------------------------------------------
ORG 0F000h
;------------------------------------------------------------------------------
RESET mov.w #300h,SP ; Initialize stack-pointer
call #Init_Sys ; Initialize system
;
One_Shot_1 mov.b #001h,ADDRI2C ; ADDRI2C = TMP100 Pointer = Config
mov.b #081h,DATAI2C ; One-Shot Instruction Data
call #Write_I2C ; Write to TMP100
;
Mainloop bis.w #LPM3,SR ; Enter LPM3
;
Read_Temp mov.b #000h,ADDRI2C ; ADDRI2C = TMP100 Pointer = Data
call #Read_I2C ; Get Upper 8-bit Conversion Result
and.w #000FFh,DATAI2C ; Clear Upper Byte
;
call #Calc_Temp ; Handle "-" Temperature Data
call #Disp_Signed_3_5 ; Update LCD with BCD Data
;
One_Shot mov.b #001h,ADDRI2C ; ADDRI2C = TMP100 Pointer = Config
mov.b #081h,DATAI2C ; One-Shot Instruction Data
call #Write_I2C ; Write to TMP100
;
Main_End jmp Mainloop ; Loop Again
;
;------------------------------------------------------------------------------
Init_Sys; Subroutine sets up Modules and Control Registers
;------------------------------------------------------------------------------
mov.w #WDTPW+WDTHOLD,&WDTCTL ; Stop WDT
SetupFLL2 bis.b #XCAP18PF,&FLL_CTL0 ; Set load capacitance for xtal
SetupLCD mov.b #0C5h,&LCDCTL ; Static LCD, segments = 0 - 23
SetupBT mov.b #BTFRFQ1+BTFRFQ0+BTDIV+BTIP2+BTIP1+BTIP0,&BTCTL;
; 2s BT Int, Set LCD freq
bis.b #BTIE,&IE2 ; Enable Basic Timer interrupt
SetupPorts mov.b #0FFh,&P1DIR ; Set port to outputs
clr.b &P1OUT ; P1OUTs = 0
mov.b #0FFh,&P2DIR ; Set port to outputs
clr.b &P2OUT ; P2OUTs = 0
mov.b #0FFh,&P3DIR ; Set port to outputs
clr.b &P3OUT ; P3OUTs = 0
mov.b #0FFh,&P4DIR ; Set port to outputs
clr.b &P4OUT ; P4OUTs = 0
mov.b #0FFh,&P5DIR ; Set port to outputs
clr.b &P5OUT ; P5OUTs = 0
mov.b #0FFh,&P6DIR ; Set port to outputs
clr.b &P6OUT ; P6OUTs = 0
;
eint ; Enable Interrupts
;
ret ; Return to Main
;
;///////////I2C Subroutines start//////////////////////////////////////////////
;------------------------------------------------------------------------------
Read_I2C ; Reads two bytes of data transmitted from slave
; enter ADDRI2C=00 - FF I2C device address to read
; RXTXI2C=x
; DATAI2C=x
; exit ADDRI2C=x
; RXTXI2C=x
; DATAI2C=0000 - FFFF I2C device data
;------------------------------------------------------------------------------
mov.b #TMPADDR,RXTXI2C ; Load HW Address
call #I2C_Start ; Send Start, Address and Ack
mov.b ADDRI2C,RXTXI2C ; Load Pointer Address
call #I2C_TX ; Send Pointer and Ack
mov.b #TMPADDR,RXTXI2C ; Load HW Address
bis.b #01h,RXTXI2C ; Set LSB for "READ"
call #I2C_Start ; Send Start, Address+RD and Ack
call #I2C_RX ; Read Data and Ack
;
;***** Used for 2-Byte transfer only ***** ;
; call #I2C_ACKn ; Acknowledge Byte Rcv'd
; call #I2C_RX ; Read Data and Ack
;
call #I2C_NACKn ; NOT Acknowledge Byte Rcv'd
call #I2C_Stop ; Send Stop
ret ; Return from subroutine
;
;------------------------------------------------------------------------------
Write_I2C; enter ADDRI2C=00 - FF I2C device address to write to
; RXTXI2C=x
; DATAI2C=00 - FF I2C device data to write
; exit ADDRI2C=x
; RXTXI2C=x
; DATAI2C=x
;------------------------------------------------------------------------------
mov.b #TMPADDR,RXTXI2C ; Load HW Address
call #I2C_Start ; Send Start, Address and Ack
mov.b ADDRI2C,RXTXI2C ; Load Pointer Address
call #I2C_TX ; Send Pointer and Ack
mov.b DATAI2C,RXTXI2C ; Load Out-Going Data
call #I2C_TX ; Send Data and Ack
call #I2C_Stop ; Send Stop
ret ; Return from subroutine
;
;------------------------------------------------------------------------------
I2C_Start; enter SDA=1, SCL=x
; exit SDA=0, SCL=0
;------------------------------------------------------------------------------
bic.b #SCL+SDA,&P2DIR ; SCL and SDA to input direction
bic.b #SCL,&P2OUT ; SCL=1
I2C_Start2 bit.b #SCL,&P2IN ; SCL==1?
jz I2C_Start2 ; wait for SCL==1
bic.b #SDA,&P2OUT ; SDA=1
nop ; delay
nop ; (START condition needs
nop ; set-up time >4.7us)
nop
bis.b #SDA,&P2DIR ; SDA=0
nop ; delay
nop ; (START condition needs
nop ; hold time >4.0us)
nop
bis.b #SCL,&P2DIR ; SCL=0
;
;------------------------------------------------------------------------------
I2C_TX; enter SDA=x, SCL=0
; exit SDA=1, SCL=0
;------------------------------------------------------------------------------
mov #08,BITI2C ; number of bits to xfer
I2C_TX_Bit rla.b RXTXI2C ; data bit -> carry
jc I2C_TX1 ; test carry for 1 or 0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -