📄 i2c.lis
字号:
.module I2C.C
.area text(rom, con, rel)
0000 .dbfile D:\Datasheet\Atmel\FROMJI~1\AVR_Demo\m8\SoftWare\I2C.C
0000 .dbfunc e i2c_Write _i2c_Write fc
0000 ; Wdata -> R20
0000 ; RomAddrL -> R22
.even
0000 _i2c_Write::
0000 00D0 rcall push_gset2
0002 422F mov R20,R18
0004 602F mov R22,R16
0006 .dbline -1
0006 .dbline 8
0006 ; #include <iom8v.h>
0006 ; #include <macros.h>
0006 ; #include "Uart.h"
0006 ; #include"I2C.H"
0006 ; #include "M8Demo.h"
0006 ;
0006 ; unsigned char i2c_Write(unsigned char RomAddrL,unsigned char Wdata)
0006 ; { PORTC|=0x38;
0006 .dbline 8
0006 85B3 in R24,0x15
0008 8863 ori R24,56
000A 85BB out 0x15,R24
000C .dbline 9
000C ; Delayms(10);
000C 0AE0 ldi R16,10
000E 10E0 ldi R17,0
0010 00D0 rcall _Delayms
0012 .dbline 10
0012 ; Start();//I2C启动
0012 84EA ldi R24,164
0014 86BF out 0x36,R24
0016 .dbline 11
0016 L2:
0016 .dbline 11
0016 L3:
0016 .dbline 11
0016 ; Wait();
0016 26B6 in R2,0x36
0018 27FE sbrs R2,7
001A FDCF rjmp L2
001C .dbline 11
001C .dbline 11
001C .dbline 12
001C ; if(TestAck()!=START)
001C 81B1 in R24,0x1
001E 887F andi R24,248
0020 8830 cpi R24,8
0022 21F0 breq L5
0024 .dbline 13
0024 ; {PutStr("ERROR1");goto end_i2c_write;} //ACK
0024 .dbline 13
0024 00E0 ldi R16,<L7
0026 10E0 ldi R17,>L7
0028 00D0 rcall _PutStr
002A .dbline 13
002A 33C0 rjmp L8
002C L5:
002C .dbline 15
002C ;
002C ; Write8Bit(wr_device_add);//写I2C从器件地址和写方式
002C .dbline 15
002C 80EA ldi R24,160
002E 83B9 out 0x3,R24
0030 .dbline 15
0030 84E8 ldi R24,132
0032 86BF out 0x36,R24
0034 .dbline 15
0034 .dbline 15
0034 .dbline 16
0034 L9:
0034 .dbline 16
0034 L10:
0034 .dbline 16
0034 ; Wait();
0034 26B6 in R2,0x36
0036 27FE sbrs R2,7
0038 FDCF rjmp L9
003A .dbline 16
003A .dbline 16
003A .dbline 17
003A ; if(TestAck()!=MT_ADDR_ACK)
003A 81B1 in R24,0x1
003C 887F andi R24,248
003E 8831 cpi R24,24
0040 21F0 breq L12
0042 .dbline 18
0042 ; {PutStr("ERROR2");goto end_i2c_write;} //ACK
0042 .dbline 18
0042 00E0 ldi R16,<L14
0044 10E0 ldi R17,>L14
0046 00D0 rcall _PutStr
0048 .dbline 18
0048 24C0 rjmp L8
004A L12:
004A .dbline 20
004A ;
004A ; Write8Bit(RomAddrL);//写24C02的ROM地址
004A .dbline 20
004A 63B9 out 0x3,R22
004C .dbline 20
004C 84E8 ldi R24,132
004E 86BF out 0x36,R24
0050 .dbline 20
0050 .dbline 20
0050 .dbline 21
0050 L15:
0050 .dbline 21
0050 L16:
0050 .dbline 21
0050 ; Wait();
0050 26B6 in R2,0x36
0052 27FE sbrs R2,7
0054 FDCF rjmp L15
0056 .dbline 21
0056 .dbline 21
0056 .dbline 22
0056 ; if(TestAck()!=MT_DATA_ACK)
0056 81B1 in R24,0x1
0058 887F andi R24,248
005A 8832 cpi R24,40
005C 21F0 breq L18
005E .dbline 23
005E ; {PutStr("ERROR4");goto end_i2c_write;} //ACK
005E .dbline 23
005E 00E0 ldi R16,<L20
0060 10E0 ldi R17,>L20
0062 00D0 rcall _PutStr
0064 .dbline 23
0064 16C0 rjmp L8
0066 L18:
0066 .dbline 25
0066 ;
0066 ; Write8Bit(Wdata);//写数据到24C02的ROM
0066 .dbline 25
0066 43B9 out 0x3,R20
0068 .dbline 25
0068 84E8 ldi R24,132
006A 86BF out 0x36,R24
006C .dbline 25
006C .dbline 25
006C .dbline 26
006C L21:
006C .dbline 26
006C L22:
006C .dbline 26
006C ; Wait();
006C 26B6 in R2,0x36
006E 27FE sbrs R2,7
0070 FDCF rjmp L21
0072 .dbline 26
0072 .dbline 26
0072 .dbline 27
0072 ; if(TestAck()!=MT_DATA_ACK)
0072 81B1 in R24,0x1
0074 887F andi R24,248
0076 8832 cpi R24,40
0078 21F0 breq L24
007A .dbline 28
007A ; {PutStr("ERROR5");goto end_i2c_write;} //ACK
007A .dbline 28
007A 00E0 ldi R16,<L26
007C 10E0 ldi R17,>L26
007E 00D0 rcall _PutStr
0080 .dbline 28
0080 08C0 rjmp L8
0082 L24:
0082 .dbline 29
0082 ; Stop();//I2C停止
0082 84E9 ldi R24,148
0084 86BF out 0x36,R24
0086 .dbline 30
0086 ; twi_Disable();
0086 00D0 rcall _twi_Disable
0088 .dbline 31
0088 ; Delayms(10 );
0088 0AE0 ldi R16,10
008A 10E0 ldi R17,0
008C 00D0 rcall _Delayms
008E .dbline 32
008E ; return 0;
008E 0027 clr R16
0090 04C0 rjmp L1
0092 L8:
0092 .dbline 35
0092 ; end_i2c_write:
0092 ;
0092 ; Stop();//I2C停止
0092 84E9 ldi R24,148
0094 86BF out 0x36,R24
0096 .dbline 36
0096 ; twi_Disable();
0096 00D0 rcall _twi_Disable
0098 .dbline 37
0098 ; return 1;
0098 01E0 ldi R16,1
009A .dbline -2
009A L1:
009A 00D0 rcall pop_gset2
009C .dbline 0 ; func end
009C 0895 ret
009E .dbsym r Wdata 20 c
009E .dbsym r RomAddrL 22 c
009E .dbend
009E .dbfunc e i2c_Read _i2c_Read fc
009E ; temp -> R20
009E ; RomAddrL -> R20
.even
009E _i2c_Read::
009E 00D0 rcall push_gset1
00A0 402F mov R20,R16
00A2 .dbline -1
00A2 .dbline 46
00A2 ;
00A2 ; }
00A2 ;
00A2 ; /******************************************
00A2 ; I2C总线读一个字节(Mega8 as Master)
00A2 ; 如果读失败也返回0
00A2 ; */
00A2 ; unsigned char i2c_Read(unsigned char RomAddrL) //this is a sample of reading 24c01(EEPROM)
00A2 ; {
00A2 .dbline 48
00A2 ; unsigned char temp;
00A2 ; PORTC|=0x38;
00A2 85B3 in R24,0x15
00A4 8863 ori R24,56
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -