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

📄 iic.asm

📁 GPL162001的I2C功能demo程式
💻 ASM
📖 第 1 页 / 共 2 页
字号:
	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 + -