📄 iic.asm
字号:
jz next5?
r1=0x0d0
[P_ICSR]=r1
call F_Error1
goto Error
next5?:
r1=[R_SendData]
r1+=1
[R_SendData]=r1
r2-=1
jnz seriessend?
r1=0x0d0
[P_ICSR]=r1
r1=[P_ICCR]
[P_ICCR]=r1
r1=[P_TimerA_Ctrl] //enable timera for program time, 10ms
r1|=0x2000
[P_TimerA_Ctrl]=r1
nop
proloop?:
r1=[R_TimerFlag]
jz proloop?
r1=0x00
[R_TimerFlag]=r1
r1=[P_TimerA_Ctrl]
r1&=(~0x2000)
[P_TimerA_Ctrl]=r1
r1=[R_LowAddr]
r1+=16
[R_LowAddr]=r1
cmp r1,0x100
je skip1?
call F_Delay
goto serieswriteloop
skip1?:
r1=0
[R_LowAddr]=r1
r1=[R_HighAddr]
r1+=0x02
[R_HighAddr]=r1
r1&=0x0e
cmp r1,0x08
je seriesreceivetest
call F_Delay
goto serieswriteloop
seriesreceivetest:
r2=0x00 //low addr byte
[R_LowAddr]=r2
r3=0x00 //high addr byte
r3+=deviceaddr+write
[R_HighAddr]=r3
seriesreadloop:
r1=0x00
[R_IICFlag]=r1
r1=[R_HighAddr] //send device addr
[P_IDSR]=r1
r1=0x0f0
[P_ICSR]=r1 //send data
waitloop?:
r1=[P_ICCR]
test r1,0x010
jz waitloop?
r1=[P_ICSR]
r1&=0x0f
test r1,0x01
jz next?
r1=0x0d0
[P_ICSR]=r1
call F_Error
goto Error //ack not receive
next?:
test r1,0x08
jz next1?
r1=0x0d0
[P_ICSR]=r1
call F_Error1
goto Error
next1?:
r1=[R_LowAddr]
[P_IDSR]=r1
r1=[P_ICCR]
[P_ICCR]=r1
waitloop1?:
r1=[P_ICCR]
test r1,0x010
jz waitloop1?
r1=[P_ICSR]
r1&=0x0f
test r1,0x01
jz next2?
r1=0x0d0
[P_ICSR]=r1
call F_Error
goto Error
next2?:
test r1,0x08
jz next3?
r1=0x0d0
[P_ICSR]=r1
call F_Error1
goto Error
next3?:
r1=0xd0
[P_ICSR]=r1
r1=[P_ICCR]
[P_ICCR]=r1
call F_Delay
r1=0x90
[P_ICSR]=r1
r2=15
r1=[R_HighAddr]
r1+=Read
[P_IDSR]=r1
r1=0x0b0
[P_ICSR]=r1
waitloop2?:
r1=[P_ICCR]
test r1,0x010
jz waitloop2?
r1=[P_ICSR]
r1&=0x0f
test r1,0x01
jz next4?
r1=0xd0
[P_ICSR]=r1
call F_Error
goto Error
next4?:
test r1,0x08
jz next5?
r1=0x0d0
[P_ICSR]=r1
call F_Error1
goto Error
next5?:
r1=[P_ICCR]
[P_ICCR]=r1
wait5?:
r1=[P_ICCR]
test r1,0x010
jz wait5?
r1=0x00
[R_IICFlag]=r1
r1=[P_IDSR]
r3=[R_StoreAddr]
[r3++]=r1
[R_StoreAddr]=r3
r2-=1
jnz next5?
r1=[P_ICCR]
r1&=(~0x80)
[P_ICCR]=r1
waitloop3?:
r1=[P_ICCR]
test r1,0x010
jz waitloop3?
r1=0x00
[R_IICFlag]=r1
r1=[P_IDSR]
r2=[R_StoreAddr]
[r2++]=r1
[R_StoreAddr]=r2
r1=0x090
[P_ICSR]=r1
r1=[P_ICCR]
r1|=0x80
[P_ICCR]=r1
r1=[R_LowAddr]
r1+=16
[R_LowAddr]=r1
cmp r1,0x100
je skip2?
call F_Delay
goto seriesreadloop
skip2?:
r1=0x00
[R_LowAddr]=r1
r1=[R_HighAddr]
r1+=0x02
[R_HighAddr]=r1
r1&=0x0e
cmp r1,0x08
je seriesjudge
call F_Delay
goto seriesreadloop
seriesjudge:
r1=0x80
r2=0x100
judgeloop?:
r3=[r2++]
cmp r3,r1
je skip?
call F_Error
skip?:
r1+=1
r1&=0x0ff
cmp r2,0x500
jne judgeloop?
nop
jmp $ //test ok
/////////////////////////////////////////////
//////////////////////////////////////////////
IIC_Series_WriteRead_INT:
r1=0x10000-32768/100
[P_TimerA_Preload]=r1
r1=0x01
[P_I2CEN]=r1
r1=0xc062
[P_TimerA_Ctrl]=r1
irq on
r1=0x09a //clock is 75kHz, enable ACK
[P_ICCR]=r1
r1=0x05
[P_IDEBCLK]=r1
r2=0x00 //low addr byte
[R_LowAddr]=r2
r3=0x00 //high addr byte
r3+=deviceaddr+write
[R_HighAddr]=r3
r1=0x0e0
[R_SendData]=r1
r1=0x00
[R_WR]=r1
/////////////////////////////////////////////////////////
r1=0x0d0
[P_ICSR]=r1
INT_serieswriteloop:
r1=0x00
[R_IICFlag]=r1
r1=[R_HighAddr] //send device addr
[P_IDSR]=r1
r1=0x0f0
[P_ICSR]=r1 //send data
waitloop?:
r1=[P_ICCR]
test r1,0x010
jz waitloop?
r1=[P_ICSR]
r1&=0x0f
test r1,0x01
jz next?
r1=0x0d0
[P_ICSR]=r1
call F_Error
goto Error //ack not receive
next?:
test r1,0x08
jz next1?
r1=0x0d0
[P_ICSR]=r1
call F_Error1
goto Error
next1?:
r1=0x00
[R_IICFlag]=r1
r1=[R_LowAddr]
[P_IDSR]=r1
r1=[P_ICCR]
[P_ICCR]=r1
waitloop1?:
r1=[P_ICCR]
test r1,0x010
jz waitloop1?
r1=[P_ICSR]
r1&=0x0f
test r1,0x01
jz next2?
r1=0x0d0
[P_ICSR]=r1
call F_Error
goto Error
next2?:
test r1,0x08
jz next3?
r1=0x0d0
[P_ICSR]=r1
call F_Error1
goto Error
next3?:
r3=16 //global variable
seriessend?:
r1=0x00
[R_IICFlag]=r1
r1=[R_SendData]
[P_IDSR]=r1
r1=[P_ICCR]
r1|=0x20 //enable int
[P_ICCR]=r1
nop
waitloop2?:
r1=[R_IICFlag]
jz waitloop2?
test r1,0x0f
jz next6?
test r1,0x01
jz next4?
call F_Error
goto Error
next4?:
test r1,0x08
jz next6?
call F_Error1
goto Error
next6?:
r1=0x00
[R_IICFlag]=r1
r1=[P_TimerA_Ctrl] //enable timera for program time, 10ms
r1|=0x2000
[P_TimerA_Ctrl]=r1
nop
proloop?:
r1=[R_TimerFlag]
jz proloop?
r1=0x00
[R_TimerFlag]=r1
r1=[P_TimerA_Ctrl]
r1&=(~0x2000)
[P_TimerA_Ctrl]=r1
r1=[R_LowAddr]
r1+=16
[R_LowAddr]=r1
cmp r1,0x100
je skip1?
call F_Delay
goto INT_serieswriteloop
skip1?:
r1=0
[R_LowAddr]=r1
r1=[R_HighAddr]
r1+=0x02
[R_HighAddr]=r1
r1&=0x0e
cmp r1,0x08
je INT_seriesreceivetest
call F_Delay
goto INT_serieswriteloop
INT_seriesreceivetest:
r1=0x01
[R_WR]=r1
r2=0x00 //low addr byte
[R_LowAddr]=r2
r3=0x00 //high addr byte
r3+=deviceaddr+write
[R_HighAddr]=r3
INT_seriesreadloop:
r1=0x00
[R_IICFlag]=r1
r1=[R_HighAddr] //send device addr
[P_IDSR]=r1
r1=0x0f0
[P_ICSR]=r1 //send data
waitloop?:
r1=[P_ICCR]
test r1,0x010
jz waitloop?
r1=[P_ICSR]
r1&=0x0f
test r1,0x01
jz next?
r1=0x0d0
[P_ICSR]=r1
call F_Error
goto Error //ack not receive
next?:
test r1,0x08
jz next1?
r1=0x0d0
[P_ICSR]=r1
call F_Error1
goto Error
next1?:
r1=[R_LowAddr]
[P_IDSR]=r1
r1=[P_ICCR]
[P_ICCR]=r1
waitloop1?:
r1=[P_ICCR]
test r1,0x010
jz waitloop1?
r1=[P_ICSR]
r1&=0x0f
test r1,0x01
jz next2?
r1=0x0d0
[P_ICSR]=r1
call F_Error
goto Error
next2?:
test r1,0x08
jz next3?
r1=0x0d0
[P_ICSR]=r1
call F_Error1
goto Error
next3?:
r1=0xd0
[P_ICSR]=r1
r1=[P_ICCR]
[P_ICCR]=r1
call F_Delay
r1=0x90
[P_ICSR]=r1
r3=15
r1=[R_HighAddr]
r1+=Read
[P_IDSR]=r1
r1=0x0b0
[P_ICSR]=r1
waitloop2?:
r1=[P_ICCR]
test r1,0x010
jz waitloop2?
r1=[P_ICSR]
r1&=0x0f
test r1,0x01
jz next4?
r1=0xd0
[P_ICSR]=r1
call F_Error
goto Error
next4?:
test r1,0x08
jz next5?
r1=0x0d0
[P_ICSR]=r1
call F_Error1
goto Error
next5?:
r1=[P_ICCR]
r1|=0x20 //enable int
[P_ICCR]=r1
nop
wait5?:
r1=[R_IICFlag]
jz wait5?
r1=0x00
[R_IICFlag]=r1
nop
waitloop3?:
r1=[P_ICCR]
test r1,0x010
jz waitloop3?
r1=0x00
[R_IICFlag]=r1
r1=[P_IDSR]
r2=[R_StoreAddr]
[r2++]=r1
[R_StoreAddr]=r2
r1=0x090
[P_ICSR]=r1
r1=[P_ICCR]
r1|=0x80
[P_ICCR]=r1
r1=[R_LowAddr]
r1+=16
[R_LowAddr]=r1
cmp r1,0x100
je skip2?
call F_Delay
goto INT_seriesreadloop
skip2?:
r1=0x00
[R_LowAddr]=r1
r1=[R_HighAddr]
r1+=0x02
[R_HighAddr]=r1
r1&=0x0e
cmp r1,0x08
je INT_seriesjudge
call F_Delay
goto INT_seriesreadloop
INT_seriesjudge:
r1=0xe0
r2=0x100
judgeloop?:
r3=[r2++]
cmp r3,r1
je skip?
call F_Error
skip?:
r1+=1
r1&=0x0ff
cmp r2,0x500
jne judgeloop?
nop
jmp $
Error:
r2=[R_Error]
nop
jmp $
F_Error:
push r1 to [sp]
r1=[R_Error]
r1+=1
[R_Error]=r1
pop r1 from [sp]
retf
F_Delay:
push r1 to [sp]
r1=100
wait?:
r1-=1
jnz wait?
pop r1 from [sp]
retf
F_Error1:
push r1 to [sp]
r1=[R_Error1]
r1+=1
[R_Error1]=r1
pop r1 from [sp]
retf
.text
//---------------------------------------------------------------
//---------------------------------------------------------------
_BREAK:
reti
_FIQ:
push r1,r2 to [sp]
pop r1,r2 from [sp]
reti
_IRQ0:
reti
_IRQ1:
reti
_IRQ2:
reti
_IRQ3:
reti
_IRQ4:
push r1,r2 to [sp]
IN r2,P_INT_Status2
r1 = r2 & INT_TimerA
jz L_EndTimerA?
r1=[P_TimerA_Ctrl]
[P_TimerA_Ctrl]=r1
r1=0x01
[R_TimerFlag]=r1
L_EndTimerA?:
pop r1,r2 from [sp]
reti
_IRQ5:
push r1,r2 to [sp]
r1=[P_INT_Status2]
test r1,INT_I2C
jz END_IRQ5
////////////////////////////////////
r1=[R_WR]
jnz receive
transmit?:
r1=[R_SendData]
r1+=1
[R_SendData]=r1
r3-=1
jz trend?
[P_IDSR]=r1
r1=[P_ICCR]
[P_ICCR]=r1
jmp END_IRQ5
trend?:
r1=[P_ICSR]
r1&=0x0f
r1|=0x8000
[R_IICFlag]=r1
r1=0xd0
[P_ICSR]=r1
r1=[P_ICCR]
r1&=(~0x20)
[P_ICCR]=r1
jmp END_IRQ5
receive:
r1=[P_IDSR]
r2=[R_StoreAddr]
[r2++]=r1
[R_StoreAddr]=r2
r3-=1
jz recend?
r1=[P_ICCR]
[P_ICCR]=r1
jmp END_IRQ5
recend?:
r1=0x8000
[R_IICFlag]=r1
r1=[P_ICCR]
r1&=(~0xa0)
[P_ICCR]=r1
END_IRQ5:
pop r1,r2 from [sp]
reti
_IRQ6:
push r1 to [sp]
pop r1 from [sp]
reti
_IRQ7:
push r1,r3 to [sp]
pop r1,r3 from [sp]
reti
.END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -