📄 i2c.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 + -