?? twi.lis
字號:
.module twi.c
.area data(ram, con, rel)
0000 _main_tmp::
0000 .blkb 1
.area idata
0000 00 .byte 0
.area data(ram, con, rel)
0001 .dbfile F:\2007電子設計\古欣\twitest\twi_slave_test\twi.c
0001 .dbsym e main_tmp _main_tmp c
.area text(rom, con, rel)
0000 .dbfile F:\2007電子設計\古欣\twitest\twi_slave_test\twi.c
0000 .dbfunc e twi_master_init _twi_master_init fV
.even
0000 _twi_master_init::
0000 .dbline -1
0000 .dbline 9
0000 ; #include "config.h"
0000 ;
0000 ; volatile uint8 main_tmp=0;
0000 ; //extern volatile uint8 main_tmp=0;
0000 ;
0000 ; //TWI master initialize
0000 ; // bit rate:100
0000 ; void twi_master_init(void)
0000 ; {
0000 .dbline 10
0000 ; TWCR= 0x00; //disable twi
0000 2224 clr R2
0002 26BE out 0x36,R2
0004 .dbline 11
0004 ; TWBR= 0x64; //set bit rate
0004 84E6 ldi R24,100
0006 80B9 out 0x0,R24
0008 .dbline 12
0008 ; TWSR= 0x00; //set prescale
0008 21B8 out 0x1,R2
000A .dbline 13
000A ; TWAR= 0x00; //set slave address
000A 22B8 out 0x2,R2
000C .dbline 14
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 20
0012 ; }
0012 ;
0012 ; //TWI slave initialize
0012 ; // bit rate:100
0012 ; void twi_slave_init(uint8 add)
0012 ; {
0012 .dbline 21
0012 ; TWCR= 0x00; //disable twi
0012 2224 clr R2
0014 26BE out 0x36,R2
0016 .dbline 22
0016 ; TWBR= 0x64; //set bit rate
0016 84E6 ldi R24,100
0018 80B9 out 0x0,R24
001A .dbline 23
001A ; TWSR= 0x00; //set prescale
001A 21B8 out 0x1,R2
001C .dbline 24
001C ; TWAR= add; //set slave address 從機地址為 0x01
001C 02B9 out 0x2,R16
001E .dbline 25
001E ; TWCR= (1<<TWEN)|(1<<TWEA)|(1<<TWIE); //enable twi
001E 85E4 ldi R24,69
0020 86BF out 0x36,R24
0022 .dbline -2
0022 L2:
0022 .dbline 0 ; func end
0022 0895 ret
0024 .dbsym r add 16 c
0024 .dbend
0024 .dbfunc e i2c_start _i2c_start fV
.even
0024 _i2c_start::
0024 .dbline -1
0024 .dbline 31
0024 ; //TWEN必須置位以使能TWI接口。TWEA也要置位以使主機尋址到自己(從機地址或廣播) 時返回確認信息ACK
0024 ; }
0024 ;
0024 ; //總線上起動開始條件
0024 ; void i2c_start(void)
0024 ; {
0024 .dbline 32
0024 ; TWCR= (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
0024 84EA ldi R24,164
0026 86BF out 0x36,R24
0028 L4:
0028 .dbline 33
0028 L5:
0028 .dbline 33
0028 ; while (!(TWCR & (1<<TWINT))); //等待START 信號成功發送
0028 26B6 in R2,0x36
002A 27FE sbrs R2,7
002C FDCF rjmp L4
002E .dbline -2
002E L3:
002E .dbline 0 ; func end
002E 0895 ret
0030 .dbend
0030 .dbfunc e i2c_write _i2c_write fc
0030 ; data -> R16
.even
0030 _i2c_write::
0030 .dbline -1
0030 .dbline 39
0030 ; }
0030 ;
0030 ; //把一個字節數據輸入器件, 返回TWI狀態
0030 ; //發送地址和數據都可以使用本函數
0030 ; uint8 i2c_write(uint8 data)
0030 ; {
0030 .dbline 40
0030 ; TWDR = data;
0030 03B9 out 0x3,R16
0032 .dbline 41
0032 ; TWCR = (1<<TWINT)|(1<<TWEN);
0032 84E8 ldi R24,132
0034 86BF out 0x36,R24
0036 L8:
0036 .dbline 42
0036 L9:
0036 .dbline 42
0036 ; while (!(TWCR & (1<<TWINT)));
0036 26B6 in R2,0x36
0038 27FE sbrs R2,7
003A FDCF rjmp L8
003C .dbline 43
003C ; _NOP();
003C 0000 nop
003E .dbline 44
003E ; return(TWSR&0b11111000); //TWSR高五位為I2C工作狀態。
003E 01B1 in R16,0x1
0040 087F andi R16,248
0042 .dbline -2
0042 L7:
0042 .dbline 0 ; func end
0042 0895 ret
0044 .dbsym r data 16 c
0044 .dbend
0044 .dbfunc e i2c_read _i2c_read fc
.even
0044 _i2c_read::
0044 .dbline -1
0044 .dbline 49
0044 ; }
0044 ;
0044 ; //從器件讀出一個字節
0044 ; uint8 i2c_read(void)
0044 ; {
0044 .dbline 50
0044 ; TWCR = (1<<TWINT)|(1<<TWEA)|(1<<TWEN);
0044 84EC ldi R24,196
0046 86BF out 0x36,R24
0048 L12:
0048 .dbline 51
0048 L13:
0048 .dbline 51
0048 ; while (!(TWCR & (1<<TWINT)));
0048 26B6 in R2,0x36
004A 27FE sbrs R2,7
004C FDCF rjmp L12
004E .dbline 52
004E ; return(TWDR);
004E 03B1 in R16,0x3
0050 .dbline -2
0050 L11:
0050 .dbline 0 ; func end
0050 0895 ret
0052 .dbend
0052 .dbfunc e i2c_stop _i2c_stop fV
.even
0052 _i2c_stop::
0052 .dbline -1
0052 .dbline 57
0052 ; }
0052 ;
0052 ; //總線上起動停止條件
0052 ; void i2c_stop(void)
0052 ; {
0052 .dbline 58
0052 ; TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
0052 84E9 ldi R24,148
0054 86BF out 0x36,R24
0056 .dbline -2
0056 L15:
0056 .dbline 0 ; func end
0056 0895 ret
0058 .dbend
0058 .dbfunc e i2c_maste_transt _i2c_maste_transt fV
0058 ; data -> R20
0058 ; addr -> R22
.even
0058 _i2c_maste_transt::
0058 0E940000 xcall push_gset2
005C 422F mov R20,R18
005E 602F mov R22,R16
0060 .dbline -1
0060 .dbline 63
0060 ; }
0060 ;
0060 ; //操作步驟: 啟動,發送地址,發送數據,關閉總線
0060 ; void i2c_maste_transt(uint8 addr, uint8 data)
0060 ; {
0060 .dbline 64
0060 ; i2c_start();
0060 E1DF xcall _i2c_start
0062 .dbline 65
0062 ; if(i2c_write(addr)==TW_MT_SLA_ACK) //發送地址成功并收到ACK
0062 062F mov R16,R22
0064 E5DF xcall _i2c_write
0066 0831 cpi R16,24
0068 11F4 brne L17
006A .dbline 66
006A ; {
006A .dbline 67
006A ; i2c_write(data);
006A 042F mov R16,R20
006C E1DF xcall _i2c_write
006E .dbline 68
006E ; }
006E L17:
006E .dbline 69
006E ; i2c_stop();
006E F1DF xcall _i2c_stop
0070 .dbline -2
0070 L16:
0070 0E940000 xcall pop_gset2
0074 .dbline 0 ; func end
0074 0895 ret
0076 .dbsym r data 20 c
0076 .dbsym r addr 22 c
0076 .dbend
.area vector(rom, abs)
.org 68
0044 0C943B00 jmp _twi_isr
.area text(rom, con, rel)
0076 .dbfile F:\2007電子設計\古欣\twitest\twi_slave_test\twi.c
0076 .dbfunc e twi_isr _twi_isr fV
.even
0076 _twi_isr::
0076 0E940000 xcall push_lset
007A 0E940000 xcall push_gset1
007E .dbline -1
007E .dbline 75
007E ; }
007E ;
007E ; #if TWI_MOD==0 //從機模式
007E ; #pragma interrupt_handler twi_isr:18
007E ; void twi_isr(void)
007E ; {
007E .dbline 77
007E ; //twi event
007E ; switch (TWSR&0xF8)
007E 41B1 in R20,0x1
0080 5527 clr R21
0082 487F andi R20,248
0084 5070 andi R21,0
0086 4039 cpi R20,144
0088 E0E0 ldi R30,0
008A 5E07 cpc R21,R30
008C 09F4 brne X3
008E 86C0 xjmp L25
0090 X3:
0090 80E9 ldi R24,144
0092 90E0 ldi R25,0
0094 8417 cp R24,R20
0096 9507 cpc R25,R21
0098 0CF4 brge X4
009A 35C0 xjmp L33
009C X4:
009C L32:
009C 4037 cpi R20,112
009E E0E0 ldi R30,0
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -