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

📄 i2cproc.asm

📁 153控制收音5800的源码
💻 ASM
字号:
include		"I2cproc.inc"
;===============================================
;	Function:I2cDelay():;;多个延时函数共用.
;===============================================
I2cDelay:
	
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP

		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP
		NOP

		ret

;===============================================
;	Function:I2cStart()
;===============================================
I2cStart:
		bs		SdaPort,@SDA
		bs		SclPort,@SCL
		call		I2cDelay

		bc		SdaPort,@SDA
		call		I2cDelay
		call		I2cDelay

		bc		SclPort,@SCL
		call		I2cDelay
		call		I2cDelay
		ret



;===============================================
;	Function:I2cStop()
;===============================================
I2cStop:

		bc		SdaPort,@SDA
		call		I2cDelay
		bs		SclPort,@SCL
		call		I2cDelay
		bs		SdaPort,@SDA
		call		I2cDelay
		call		I2cDelay
		bc		SclPort,@SCL
		call		I2cDelay
		call		I2cDelay

		ret

;===============================================
;	Function:I2cStop()
;===============================================


;===============================================
;	Function:I2cGetAck()(GetAck(Read0),DoAck(Send1))
;===============================================
I2cGetAck:
		;Set @SDA to input Modual
		
		ior		SdaPort
		mov		IO_buff,A
		bs		IO_buff,@SDA
		mov		A,IO_buff
		iow		SdaPort

		CLR		A_buff
		call		I2cDelay

		;@SCL = 1

		bs		SclPort,@SCL
		call		I2cDelay
		;if(@SDA == 0) A_buff=(1<<ACK);
		jbs		SdaPort,@SDA
		bs		A_buff,ACK

		;@SCL = 0
		bc		SclPort,@SCL
		call		I2cDelay
		;Set @SDA output 
		ior		SdaPort
		mov		IO_buff,A
		bc		IO_buff,@SDA
		mov		A,IO_buff
		iow		SdaPort

		mov		A,A_buff
		ret



;===============================================
;	Function:I2cDoAck()
;===============================================
I2cDoAck:
		;@SDA = 0;
		bc		SdaPort,@SDA
		call		I2cDelay
		call		I2cDelay

		;@SCL = 1;
		bs		SclPort,@SCL
		call		I2cDelay
		call		I2cDelay
		bc		SclPort,@SCL
		call		I2cDelay
		call		I2cDelay
		bs		SclPort,@SDA
		call		I2cDelay
		call		I2cDelay
		ret



;===============================================
;	Function:I2cDoAck()
;===============================================
I2cUnDoAck:
		;@SDA = 0;
		bs		SdaPort,@SDA
		call		I2cDelay
		bs		SclPort,@SCL
		call		I2cDelay
		call		I2cDelay
		bc		SclPort,@SCL
		call		I2cDelay
		call		I2cDelay
		;@SCL = 0;
		bc		SclPort,@SDA
		call		I2cDelay
		ret

;===============================================
;	Function:I2cSendByte(A=Data)
;===============================================
I2cSendByte:
		mov		A_buff,A
		mov		A,@8
		mov		Count,A

I2cLoopSend:
		;if(A_buff & 0x80) Send1 else Send0;
		jbs		A_buff,7
		jmp		I2cSend0

I2cSend1:
		bs		SdaPort,@SDA
		jmp 		I2cSendBegin

I2cSend0:
		bc		SdaPort,@SDA

I2cSendBegin:
		call		I2cDelay

		;@SCL = 1;
		bs		SclPort,@SCL
		call		I2cDelay
		call		I2cDelay

		;@SCL = 0;
		bc		SclPort,@SCL
		call		I2cDelay

I2cSendNext:
		;A_buff <<= 1;
		rlc		A_buff
		djz		Count
		jmp		I2cLoopSend

		ret

;===============================================
;	Function:I2cSendVByte(A=Data)
;===============================================
I2cSendVByte:
		mov		A_buff,A
		mov		A,@8
		mov		Count,A

I2cLoopSendV:
		;if(A_buff & 0x01) Send1 else Send 0;
		jbs		A_buff,0
		jmp		I2cSendV0

I2cSendV1:
		;@SDA = 1;
		bs		SdaPort,@SDA
		jmp 		I2cSendVBegin

I2cSendV0:
		;@SDA = 0
		bc		SdaPort,@SDA

I2cSendVBegin:
		call		I2cDelay
		
		;@SCL = 1
		bs		SclPort,@SCL
		call		I2cDelay
		call		I2cDelay

		;@SCL = 0;
		bc		SclPort,@SCL
		call		I2cDelay

		;A_buff >>= 1;
		rrc		A_buff
		djz		Count
		jmp		I2cLoopSendV
		ret

;===============================================
;	Function:I2cReadByte()= A
;===============================================	
I2cReadByte:
		;Set Input @SDA
		ior		SdaPort
		mov		IO_buff,A
		bs		IO_buff,@SDA
		mov		A,IO_buff
		iow		SdaPort

		CLR		A_buff

		mov		A,@8
		mov		Count,A
I2cLoopRead:
		;@SDA = 1;
		bs		SdaPort,@SDA
		call		I2cDelay

		;@SCL = 1
		bs		SclPort,@SCL
		call		I2cDelay
		call		I2cDelay

		;A_buff <<= 1;
		bs		FLAG,C
		rlc		A_buff

		;if(@SDA)
		jbs		SdaPort,@SDA
		bc		A_buff,0
		call		I2cDelay

		;@SCL = 0;
		bc		SclPort,@SCL
		call		I2cDelay

		djz		Count
		jmp		I2cLoopRead

		;Set @SDA output
		ior		SdaPort
		mov		IO_buff,A
		bc		IO_buff,@SDA
		mov		A,IO_buff
		iow		SdaPort
		
		mov		A,A_buff

		ret

;**********************************************
;*	下面是标准协议,可以用于标准I2C传输
;**********************************************
;==============================================
;	Function:I2cRead(I2cDevId,I2cAddr)
;===============================================
I2cRead:
 	call	I2cStart

	; Device Id:I2cAddr
	mov		A,@0x21;I2cDevId
	call 		I2cSendByte
	call		I2cGetAck
	jbs		A_buff,ACK
	jmp		I2cReadDone

	; Read Data:0AH
	call 		I2cReadByte
	mov		channel_cnt,a
	call		I2cDoAck
	

	; Read Data:00AL
	call		I2cReadByte
	mov		channel_cnt,A
	call		I2cDoAck

	; Read Data:0BH
	call 		I2cReadByte
	mov		RSSI,a
	call		I2cDoAck
	

	; Read Data:0BL
	call		I2cReadByte
	;mov		channel_cnt,A
		
	call		I2cUnDoAck
	; Set Ok flag!
	mov		A,@1
	NOP

I2cReadDone:
	;call		I2cStop
	call		I2cStop
	mov		A,A_buff
	ret
	
;===============================================
;	Function:I2cWrite(I2cDevId,I2cAddr,I2cData)
;===============================================
;I2cWrite:
; 	call		I2cStart

	; Device Id : (A = I2cDevId)
;	mov		A,I2cDevId
;	call 		I2cSendByte
;	call		I2cGetAck
;	jbs		A_buff,ACK
;	jmp		I2cWriteDone
;
	; Sub Address : (A = I2cAddr)
;	mov		A,I2cAddr
;	call 		I2cSendByte
;	call		I2cGetAck
;	jbs		A_buff,ACK
;	jmp		I2cWriteDone

	; Write Data : (A = I2cData)
;	mov		A,I2cData
;	call 		I2cSendByte
;	call		I2cGetAck
;	jbs		A_buff,ACK
;	jmp		I2cWriteDone

	; return true!
;	mov		A,@1
;	NOP
;
;I2cWriteDone:
;	call		I2cStop
;	mov		A,A_buff
;
;	ret




;===============================================
;	END OF I2C
;===============================================

⌨️ 快捷键说明

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