📄 twi.lis
字号:
.module twi.c
.area text(rom, con, rel)
0000 .dbfile F:\2007电子设计\古欣\twitest\twi_test\twi.c
0000 .dbfunc e twi_master_init _twi_master_init fV
.even
0000 _twi_master_init::
0000 .dbline -1
0000 .dbline 7
0000 ;
0000 ; #include "config.h"
0000 ;
0000 ; //TWI master initialize
0000 ; // bit rate:100
0000 ; void twi_master_init(void)
0000 ; {
0000 .dbline 8
0000 ; TWCR= 0x00; //disable twi
0000 2224 clr R2
0002 26BE out 0x36,R2
0004 .dbline 9
0004 ; TWBR= 0x64; //set bit rate
0004 84E6 ldi R24,100
0006 80B9 out 0x0,R24
0008 .dbline 10
0008 ; TWSR= 0x00; //set prescale
0008 21B8 out 0x1,R2
000A .dbline 11
000A ; TWAR= 0x00; //set slave address
000A 22B8 out 0x2,R2
000C .dbline 12
000C ; TWCR= 0x04; //enable twi
000C 84E0 ldi R24,4
000E 86BF out 0x36,R24
0010 .dbline -2
0010 L1:
0010 .dbline 0 ; func end
0010 0895 ret
0012 .dbend
0012 .dbfunc e twi_slave_init _twi_slave_init fV
0012 ; add -> R16
.even
0012 _twi_slave_init::
0012 .dbline -1
0012 .dbline 18
0012 ; }
0012 ;
0012 ; //TWI slave initialize
0012 ; // bit rate:100
0012 ; void twi_slave_init(uint8 add)
0012 ; {
0012 .dbline 19
0012 ; TWCR= 0x00; //disable twi
0012 2224 clr R2
0014 26BE out 0x36,R2
0016 .dbline 20
0016 ; TWBR= 0x64; //set bit rate
0016 84E6 ldi R24,100
0018 80B9 out 0x0,R24
001A .dbline 21
001A ; TWSR= 0x00; //set prescale
001A 21B8 out 0x1,R2
001C .dbline 22
001C ; TWAR= (add<<1); //set slave address 从机地址为 0x01
001C 202E mov R2,R16
001E 220C lsl R2
0020 22B8 out 0x2,R2
0022 .dbline 23
0022 ; TWCR= (1<<TWEN)|(1<<TWEA)|(1<<TWIE); //enable twi
0022 85E4 ldi R24,69
0024 86BF out 0x36,R24
0026 .dbline -2
0026 L2:
0026 .dbline 0 ; func end
0026 0895 ret
0028 .dbsym r add 16 c
0028 .dbend
0028 .dbfunc e i2c_start _i2c_start fV
.even
0028 _i2c_start::
0028 .dbline -1
0028 .dbline 29
0028 ; //TWEN必须置位以使能TWI接口。TWEA也要置位以使主机寻址到自己(从机地址或广播) 时返回确认信息ACK
0028 ; }
0028 ;
0028 ; //总线上起动开始条件
0028 ; void i2c_start(void)
0028 ; {
0028 .dbline 30
0028 ; TWCR= (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
0028 84EA ldi R24,164
002A 86BF out 0x36,R24
002C L4:
002C .dbline 31
002C L5:
002C .dbline 31
002C ; while (!(TWCR & (1<<TWINT))); //等待START 信号成功发送
002C 26B6 in R2,0x36
002E 27FE sbrs R2,7
0030 FDCF rjmp L4
0032 .dbline -2
0032 L3:
0032 .dbline 0 ; func end
0032 0895 ret
0034 .dbend
0034 .dbfunc e i2c_write_addr _i2c_write_addr fc
0034 ; r_w -> R18
0034 ; addr -> R16
.even
0034 _i2c_write_addr::
0034 .dbline -1
0034 .dbline 37
0034 ; }
0034 ;
0034 ; //把一个字节数据输入器件, 返回TWI状态
0034 ; //发送地址,r_w:1为读,0为写
0034 ; uint8 i2c_write_addr(uint8 addr,uint8 r_w)
0034 ; {
0034 .dbline 38
0034 ; if(r_w)
0034 2223 tst R18
0036 21F0 breq L8
0038 .dbline 39
0038 ; {
0038 .dbline 40
0038 ; TWDR = addr|r_w; //RW 为1:读操作
0038 202E mov R2,R16
003A 222A or R2,R18
003C 23B8 out 0x3,R2
003E .dbline 41
003E ; }
003E 03C0 xjmp L9
0040 L8:
0040 .dbline 43
0040 ; else
0040 ; {
0040 .dbline 44
0040 ; TWDR = addr & 0xFE; // RW 为0: 写操作
0040 802F mov R24,R16
0042 8E7F andi R24,254
0044 83B9 out 0x3,R24
0046 .dbline 45
0046 ; }
0046 L9:
0046 .dbline 47
0046 ;
0046 ; TWCR = (1<<TWINT)|(1<<TWEN);
0046 84E8 ldi R24,132
0048 86BF out 0x36,R24
004A L10:
004A .dbline 48
004A L11:
004A .dbline 48
004A ; while (!(TWCR & (1<<TWINT)));
004A 26B6 in R2,0x36
004C 27FE sbrs R2,7
004E FDCF rjmp L10
0050 .dbline 49
0050 ; _NOP();
0050 0000 nop
0052 .dbline 50
0052 ; return(TWSR&0b11111000); //TWSR高五位为I2C工作状态。
0052 01B1 in R16,0x1
0054 087F andi R16,248
0056 .dbline -2
0056 L7:
0056 .dbline 0 ; func end
0056 0895 ret
0058 .dbsym r r_w 18 c
0058 .dbsym r addr 16 c
0058 .dbend
0058 .dbfunc e i2c_write_data _i2c_write_data fc
0058 ; data -> R16
.even
0058 _i2c_write_data::
0058 .dbline -1
0058 .dbline 56
0058 ; }
0058 ;
0058 ; //把一个字节数据输入器件, 返回TWI状态
0058 ; //发送数据
0058 ; uint8 i2c_write_data(uint8 data)
0058 ; {
0058 .dbline 57
0058 ; TWDR = data;
0058 03B9 out 0x3,R16
005A .dbline 58
005A ; TWCR = (1<<TWINT)|(1<<TWEN);
005A 84E8 ldi R24,132
005C 86BF out 0x36,R24
005E L14:
005E .dbline 59
005E L15:
005E .dbline 59
005E ; while (!(TWCR & (1<<TWINT)));
005E 26B6 in R2,0x36
0060 27FE sbrs R2,7
0062 FDCF rjmp L14
0064 .dbline 60
0064 ; _NOP();
0064 0000 nop
0066 .dbline 61
0066 ; return(TWSR&0b11111000); //TWSR高五位为I2C工作状态。
0066 01B1 in R16,0x1
0068 087F andi R16,248
006A .dbline -2
006A L13:
006A .dbline 0 ; func end
006A 0895 ret
006C .dbsym r data 16 c
006C .dbend
006C .dbfunc e i2c_read _i2c_read fc
.even
006C _i2c_read::
006C .dbline -1
006C .dbline 67
006C ; }
006C ;
006C ;
006C ; //从器件读出一个字节
006C ; uint8 i2c_read(void)
006C ; {
006C .dbline 68
006C ; TWCR = (1<<TWINT)|(1<<TWEN);
006C 84E8 ldi R24,132
006E 86BF out 0x36,R24
0070 .dbline 69
0070 ; Twi_NoAcK();
0070 .dbline 69
0070 86B7 in R24,0x36
0072 8F70 andi R24,15
0074 8068 ori R24,128
0076 86BF out 0x36,R24
0078 .dbline 69
0078 .dbline 69
0078 L18:
0078 .dbline 70
0078 L19:
0078 .dbline 70
0078 ; while (!(TWCR & (1<<TWINT)));
0078 26B6 in R2,0x36
007A 27FE sbrs R2,7
007C FDCF rjmp L18
007E .dbline 71
007E ; return(TWDR);
007E 03B1 in R16,0x3
0080 .dbline -2
0080 L17:
0080 .dbline 0 ; func end
0080 0895 ret
0082 .dbend
0082 .dbfunc e i2c_stop _i2c_stop fV
.even
0082 _i2c_stop::
0082 .dbline -1
0082 .dbline 76
0082 ; }
0082 ;
0082 ; //总线上起动停止条件
0082 ; void i2c_stop(void)
0082 ; {
0082 .dbline 77
0082 ; TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
0082 84E9 ldi R24,148
0084 86BF out 0x36,R24
0086 .dbline -2
0086 L21:
0086 .dbline 0 ; func end
0086 0895 ret
0088 .dbend
0088 .dbfunc e i2c_maste_transt _i2c_maste_transt fV
0088 ; data -> R20
0088 ; addr -> R22
.even
0088 _i2c_maste_transt::
0088 0E940000 xcall push_gset2
008C 422F mov R20,R18
008E 602F mov R22,R16
0090 .dbline -1
0090 .dbline 82
0090 ; }
0090 ;
0090 ; //操作步骤: 启动,发送地址,发送数据,关闭总线
0090 ; void i2c_maste_transt(uint8 addr, uint8 data)
0090 ; {
0090 .dbline 83
0090 ; i2c_start();
0090 CBDF xcall _i2c_start
0092 .dbline 85
0092 ;
0092 ; if(i2c_write_addr(addr, 0)==TW_MT_SLA_ACK) //发送地址成功并收到ACK
0092 2227 clr R18
0094 062F mov R16,R22
0096 CEDF xcall _i2c_write_addr
0098 0831 cpi R16,24
009A 11F4 brne L23
009C .dbline 86
009C ; {
009C .dbline 87
009C ; i2c_write_data(data);
009C 042F mov R16,R20
009E DCDF xcall _i2c_write_data
00A0 .dbline 88
00A0 ; }
00A0 L23:
00A0 .dbline 89
00A0 ; i2c_stop();
00A0 F0DF xcall _i2c_stop
00A2 .dbline -2
00A2 L22:
00A2 0E940000 xcall pop_gset2
00A6 .dbline 0 ; func end
00A6 0895 ret
00A8 .dbsym r data 20 c
00A8 .dbsym r addr 22 c
00A8 .dbend
00A8 .dbfunc e i2c_maste_read _i2c_maste_read fc
00A8 ; tmp -> R20
00A8 ; addr -> R22
.even
00A8 _i2c_maste_read::
00A8 0E940000 xcall push_gset2
00AC 602F mov R22,R16
00AE .dbline -1
00AE .dbline 93
00AE ; }
00AE ; //操作步骤,启动,发送地址,读数据,关闭总线
00AE ; uint8 i2c_maste_read(uint8 addr)
00AE ; {
00AE .dbline 94
00AE ; uint8 tmp=0;
00AE 4427 clr R20
00B0 .dbline 95
00B0 ; i2c_start();
00B0 BBDF xcall _i2c_start
00B2 .dbline 96
00B2 ; if(i2c_write_addr(addr, 1)==TW_MR_SLA_ACK) //发送地址成功并收到ACK
00B2 21E0 ldi R18,1
00B4 062F mov R16,R22
00B6 BEDF xcall _i2c_write_addr
00B8 0034 cpi R16,64
00BA 11F4 brne L26
00BC .dbline 97
00BC ; {
00BC .dbline 98
00BC ; tmp=i2c_read();
00BC D7DF xcall _i2c_read
00BE 402F mov R20,R16
00C0 .dbline 99
00C0 ; }
00C0 L26:
00C0 .dbline 100
00C0 ; i2c_stop();
00C0 E0DF xcall _i2c_stop
00C2 .dbline 101
00C2 ; return tmp;
00C2 042F mov R16,R20
00C4 .dbline -2
00C4 L25:
00C4 0E940000 xcall pop_gset2
00C8 .dbline 0 ; func end
00C8 0895 ret
00CA .dbsym r tmp 20 c
00CA .dbsym r addr 22 c
00CA .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -