
5-5
MSP430 Microcode Example
CALL
#NOP9
;delay before SCL for start low
;bit mask, MSB (bit) first
I2C_Send MOV.b #80h,Mask
;******************** test bit, send if low
I2C_Send1 BIT.B Mask,Data(Tbl_Pntr)
JC
I2C_Send2
BIS.B #SCL,&SCLEN
CALL
#NOP9
BIS.B #SDA,&SDAEN
BIC.B #SCL,&SCLEN
;
jmp skip1
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
DS_busy
BIT.b #SCL,&SCLIN
;test if DS part busy (C=0)
JNC
DS_busy
;yes, loop again
;skip1
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
JMP
I2C_Send3
;******************** send high bit
I2C_Send2 BIS.B #SCL,&SCLEN
;data bit = 1: set SCL = low
CALL
#NOP9
;delay low portion of clock
BIC.B #SDA,&SDAEN
;set SDA = high
CALL
#NOP9
;delay
BIC.B #SCL,&SCLEN
;set SCL = high
;
jmp skip2
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
DS_busy2 BIT.b #SCL,&SCLIN
;test if DS part busy (C=0)
JNC
DS_busy2
;yes, loop again
;skip2
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;******************** shift mask, test for end of byte
I2C_Send3 CLRC
;clear carry bit
RRC.B Mask
;shift 0 into MSB, shift
”
1
”
right
JNCI2C_Send1
;
”
1
”
shifted into carry
; No = jump send1
CALL
#NOP9
;extend SCL pulse before ackn
;
JMP pointers
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;bit = 1
;jump if bit = 1
;data is 0, SCL = low
;delay low portion of clock
;set SDA = low
;set SCL (clock) = high
;******************** check acknowledge signal from DS part
I2C_Ackn BIS.B #SCL,&SCLEN
;set SCL = low for Acknowledge Bit
BIC.B #SDA,&SDAEN
;set SDA = high, master releases SDA
CALL
#NOP8
;extend SCL low before ackn.
BIC.B #SCL,&SCLEN
;set SCL = high, master releases SCL
Ackn_Test BIT.B #SDA,&SDAIN
;test for ackn in carry bit (0=Ackn.)
JC
Ackn_Test
;no ackn (C=1), test again for acknowledge
BIS.b #SDA,&SDAEN
;hold SDA line low after Ackn.
;******************** change pointers, check for end of string
;pointers
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
INCTbl_Pntr
;increment table pointer next byte in table
DECStrng_Pntr
;decrement string pointer
JNZI2C_Send
;if not 0 then send next byte
;
jmp tempend
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>