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

📄 i2c.s

📁 AVR系列被广泛应用的单片机MEGA8开发(原理图)及例程
💻 S
字号:
	.module I2C.C
	.area text(rom, con, rel)
	.dbfile D:\Datasheet\Atmel\FROMJI~1\AVR_Demo\m8\SoftWare\I2C.C
	.dbfunc e i2c_Write _i2c_Write fc
;          Wdata -> R20
;       RomAddrL -> R22
	.even
_i2c_Write::
	rcall push_gset2
	mov R20,R18
	mov R22,R16
	.dbline -1
	.dbline 8
; #include <iom8v.h>
; #include <macros.h>
; #include "Uart.h"
; #include"I2C.H"
; #include "M8Demo.h"
; 
; unsigned char i2c_Write(unsigned char RomAddrL,unsigned char Wdata) 
; {     PORTC|=0x38;
	.dbline 8
	in R24,0x15
	ori R24,56
	out 0x15,R24
	.dbline 9
; 	  Delayms(10);
	ldi R16,10
	ldi R17,0
	rcall _Delayms
	.dbline 10
; 	  Start();//I2C启动
	ldi R24,164
	out 0x36,R24
	.dbline 11
L2:
	.dbline 11
L3:
	.dbline 11
; 	  Wait();
	in R2,0x36
	sbrs R2,7
	rjmp L2
	.dbline 11
	.dbline 11
	.dbline 12
; 	  if(TestAck()!=START) 
	in R24,0x1
	andi R24,248
	cpi R24,8
	breq L5
	.dbline 13
; 	  {PutStr("ERROR1");goto end_i2c_write;} //ACK
	.dbline 13
	ldi R16,<L7
	ldi R17,>L7
	rcall _PutStr
	.dbline 13
	rjmp L8
L5:
	.dbline 15
; 	  
; 	  Write8Bit(wr_device_add);//写I2C从器件地址和写方式
	.dbline 15
	ldi R24,160
	out 0x3,R24
	.dbline 15
	ldi R24,132
	out 0x36,R24
	.dbline 15
	.dbline 15
	.dbline 16
L9:
	.dbline 16
L10:
	.dbline 16
; 	  Wait();
	in R2,0x36
	sbrs R2,7
	rjmp L9
	.dbline 16
	.dbline 16
	.dbline 17
; 	  if(TestAck()!=MT_ADDR_ACK)
	in R24,0x1
	andi R24,248
	cpi R24,24
	breq L12
	.dbline 18
; 	    	{PutStr("ERROR2");goto end_i2c_write;} //ACK
	.dbline 18
	ldi R16,<L14
	ldi R17,>L14
	rcall _PutStr
	.dbline 18
	rjmp L8
L12:
	.dbline 20
; 	    	
; 	  Write8Bit(RomAddrL);//写24C02的ROM地址
	.dbline 20
	out 0x3,R22
	.dbline 20
	ldi R24,132
	out 0x36,R24
	.dbline 20
	.dbline 20
	.dbline 21
L15:
	.dbline 21
L16:
	.dbline 21
; 	  Wait();
	in R2,0x36
	sbrs R2,7
	rjmp L15
	.dbline 21
	.dbline 21
	.dbline 22
; 	  if(TestAck()!=MT_DATA_ACK)
	in R24,0x1
	andi R24,248
	cpi R24,40
	breq L18
	.dbline 23
; 	  	{PutStr("ERROR4");goto end_i2c_write;} //ACK
	.dbline 23
	ldi R16,<L20
	ldi R17,>L20
	rcall _PutStr
	.dbline 23
	rjmp L8
L18:
	.dbline 25
; 
; 	  Write8Bit(Wdata);//写数据到24C02的ROM
	.dbline 25
	out 0x3,R20
	.dbline 25
	ldi R24,132
	out 0x36,R24
	.dbline 25
	.dbline 25
	.dbline 26
L21:
	.dbline 26
L22:
	.dbline 26
; 	  Wait();
	in R2,0x36
	sbrs R2,7
	rjmp L21
	.dbline 26
	.dbline 26
	.dbline 27
; 	  if(TestAck()!=MT_DATA_ACK) 	
	in R24,0x1
	andi R24,248
	cpi R24,40
	breq L24
	.dbline 28
; 	  	{PutStr("ERROR5");goto end_i2c_write;} //ACK
	.dbline 28
	ldi R16,<L26
	ldi R17,>L26
	rcall _PutStr
	.dbline 28
	rjmp L8
L24:
	.dbline 29
; 	  Stop();//I2C停止
	ldi R24,148
	out 0x36,R24
	.dbline 30
; 	   twi_Disable();
	rcall _twi_Disable
	.dbline 31
; Delayms(10  );
	ldi R16,10
	ldi R17,0
	rcall _Delayms
	.dbline 32
; 	  return 0;
	clr R16
	rjmp L1
L8:
	.dbline 35
; end_i2c_write:
; 	
; 	 Stop();//I2C停止
	ldi R24,148
	out 0x36,R24
	.dbline 36
; 	  twi_Disable();
	rcall _twi_Disable
	.dbline 37
; 	  	  return 1;
	ldi R16,1
	.dbline -2
L1:
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r Wdata 20 c
	.dbsym r RomAddrL 22 c
	.dbend
	.dbfunc e i2c_Read _i2c_Read fc
;           temp -> R20
;       RomAddrL -> R20
	.even
_i2c_Read::
	rcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 46
; 	
; }
; 
; /******************************************
;       I2C总线读一个字节(Mega8 as Master)
; 		   如果读失败也返回0
; */
; unsigned char i2c_Read(unsigned char RomAddrL)       //this is a sample of reading 24c01(EEPROM)
;       {
	.dbline 48
; 	   unsigned char temp;
; 	   PORTC|=0x38;
	in R24,0x15
	ori R24,56
	out 0x15,R24
	.dbline 49
; 	   Delayms(10  );
	ldi R16,10
	ldi R17,0
	rcall _Delayms
	.dbline 50
; 	   Start();//I2C启动
	ldi R24,164
	out 0x36,R24
	.dbline 51
L28:
	.dbline 51
L29:
	.dbline 51
; 	   Wait();
	in R2,0x36
	sbrs R2,7
	rjmp L28
	.dbline 51
	.dbline 51
	.dbline 52
; 	   if (TestAck()!=START) return 0;//ACK	   
	in R24,0x1
	andi R24,248
	cpi R24,8
	breq L31
	.dbline 52
	clr R16
	rjmp L27
L31:
	.dbline 53
; 	   Write8Bit(wr_device_add);//写I2C从器件地址和写方式
	.dbline 53
	ldi R24,160
	out 0x3,R24
	.dbline 53
	ldi R24,132
	out 0x36,R24
	.dbline 53
	.dbline 53
	.dbline 54
L33:
	.dbline 54
L34:
	.dbline 54
; 	   Wait(); 
	in R2,0x36
	sbrs R2,7
	rjmp L33
	.dbline 54
	.dbline 54
	.dbline 55
; 	   if (TestAck()!=MT_ADDR_ACK) return 0;//ACK
	in R24,0x1
	andi R24,248
	cpi R24,24
	breq L36
	.dbline 55
	clr R16
	rjmp L27
L36:
	.dbline 57
; 	  
; 	   Write8Bit(RomAddrL);//写24C02的ROM地址
	.dbline 57
	out 0x3,R20
	.dbline 57
	ldi R24,132
	out 0x36,R24
	.dbline 57
	.dbline 57
	.dbline 58
L38:
	.dbline 58
L39:
	.dbline 58
; 	   Wait();
	in R2,0x36
	sbrs R2,7
	rjmp L38
	.dbline 58
	.dbline 58
	.dbline 59
; 	   if (TestAck()!=MT_DATA_ACK) return 0;
	in R24,0x1
	andi R24,248
	cpi R24,40
	breq L41
	.dbline 59
	clr R16
	rjmp L27
L41:
	.dbline 61
; 
; 	   Start();//I2C重新启动
	ldi R24,164
	out 0x36,R24
	.dbline 62
L43:
	.dbline 62
L44:
	.dbline 62
; 	   Wait();
	in R2,0x36
	sbrs R2,7
	rjmp L43
	.dbline 62
	.dbline 62
	.dbline 63
; 	   if (TestAck()!=RE_START)  return 0;
	in R24,0x1
	andi R24,248
	cpi R24,16
	breq L46
	.dbline 63
	clr R16
	rjmp L27
L46:
	.dbline 64
; 	   Write8Bit(rd_device_add);//写I2C从器件地址和读方式
	.dbline 64
	ldi R24,161
	out 0x3,R24
	.dbline 64
	ldi R24,132
	out 0x36,R24
	.dbline 64
	.dbline 64
	.dbline 65
L48:
	.dbline 65
L49:
	.dbline 65
; 	   Wait();
	in R2,0x36
	sbrs R2,7
	rjmp L48
	.dbline 65
	.dbline 65
	.dbline 66
; 	   if(TestAck()!=MR_ADDR_ACK)  return 0;//ACK
	in R24,0x1
	andi R24,248
	cpi R24,64
	breq L51
	.dbline 66
	clr R16
	rjmp L27
L51:
	.dbline 67
; 	   Twi();//启动主I2C读方式
	ldi R24,132
	out 0x36,R24
	.dbline 68
L53:
	.dbline 68
L54:
	.dbline 68
; 	   Wait();
	in R2,0x36
	sbrs R2,7
	rjmp L53
	.dbline 68
	.dbline 68
	.dbline 69
; 	   if(TestAck()!=MR_DATA_NOACK) return 0;//ACK	
	in R24,0x1
	andi R24,248
	cpi R24,88
	breq L56
	.dbline 69
	clr R16
	rjmp L27
L56:
	.dbline 70
; 	   temp=TWDR;//读取I2C接收数据
	in R20,0x3
	.dbline 71
; 	   Delayms(10  );
	ldi R16,10
	ldi R17,0
	rcall _Delayms
	.dbline 72
;            Stop();//I2C停止
	ldi R24,148
	out 0x36,R24
	.dbline 73
;             twi_Disable();
	rcall _twi_Disable
	.dbline 74
; 	   return temp;
	mov R16,R20
	.dbline -2
L27:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r temp 20 c
	.dbsym r RomAddrL 20 c
	.dbend
	.area data(ram, con, rel)
	.dbfile D:\Datasheet\Atmel\FROMJI~1\AVR_Demo\m8\SoftWare\I2C.C
L26:
	.blkb 7
	.area idata
	.byte 'E,'R,'R,'O,'R,53,0
	.area data(ram, con, rel)
	.dbfile D:\Datasheet\Atmel\FROMJI~1\AVR_Demo\m8\SoftWare\I2C.C
L20:
	.blkb 7
	.area idata
	.byte 'E,'R,'R,'O,'R,52,0
	.area data(ram, con, rel)
	.dbfile D:\Datasheet\Atmel\FROMJI~1\AVR_Demo\m8\SoftWare\I2C.C
L14:
	.blkb 7
	.area idata
	.byte 'E,'R,'R,'O,'R,50,0
	.area data(ram, con, rel)
	.dbfile D:\Datasheet\Atmel\FROMJI~1\AVR_Demo\m8\SoftWare\I2C.C
L7:
	.blkb 7
	.area idata
	.byte 'E,'R,'R,'O,'R,49,0
	.area data(ram, con, rel)
	.dbfile D:\Datasheet\Atmel\FROMJI~1\AVR_Demo\m8\SoftWare\I2C.C

⌨️ 快捷键说明

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