?? twi_master_polling.lis
字號:
.module twi_master_polling.c
.area text(rom, con, rel)
0000 .dbfile F:\UART_TO_TWI\twi_master_polling.c
0000 .dbfunc e twi_init _twi_init fV
.even
0000 _twi_init::
0000 .dbline -1
0000 .dbline 10
0000 ; #include <iom8v.h>
0000 ; #include <macros.h>
0000 ; #include "delay.h"
0000 ; #include "twi_master_polling.h"
0000 ;
0000 ; unsigned char Write_Succsee_Flag;
0000 ; unsigned char Read_Succsee_Flag;
0000 ;
0000 ; void twi_init(void)
0000 ; {
0000 .dbline 11
0000 ; Write_Succsee_Flag = false;
0000 2224 clr R2
0002 20920100 sts _Write_Succsee_Flag,R2
0006 .dbline 12
0006 ; Read_Succsee_Flag = false;
0006 20920000 sts _Read_Succsee_Flag,R2
000A .dbline 14
000A ;
000A ; TWCR= 0X00; //disable twi
000A 26BE out 0x36,R2
000C .dbline 15
000C ; TWBR= 0x20; //set bit rate
000C 80E2 ldi R24,32
000E 80B9 out 0x0,R24
0010 .dbline 16
0010 ; TWSR= 0x00; //set prescale
0010 21B8 out 0x1,R2
0012 .dbline 18
0012 ; //TWAR= DEVICE_ADR; //set slave address 本身作為主控
0012 ; TWCR= 0x44; //enable twi 置位TWEA,TWEN TWIE
0012 84E4 ldi R24,68
0014 86BF out 0x36,R24
0016 .dbline -2
0016 L1:
0016 .dbline 0 ; func end
0016 0895 ret
0018 .dbend
0018 .dbfunc e twi_write_byte _twi_write_byte fc
0018 ; Wdata -> y+4
0018 ; RamAddress -> R20
0018 ; device_adr -> R22
.even
0018 _twi_write_byte::
0018 00D0 rcall push_gset2
001A 422F mov R20,R18
001C 602F mov R22,R16
001E .dbline -1
001E .dbline 26
001E ; }
001E ; /******************************************
001E ; I2C總線寫一個字節
001E ; 返回0: 寫成功
001E ; 返回錯誤狀態字:寫失敗
001E ; *******************************************/
001E ; unsigned char twi_write_byte(unsigned char device_adr,unsigned char RamAddress,unsigned char Wdata)
001E ; {
001E .dbline 28
001E 84EA ldi R24,164
0020 86BF out 0x36,R24
0022 .dbline 28
0022 L3:
0022 .dbline 28
0022 L4:
0022 .dbline 28
0022 ; //I2C啟動
0022 ; Start(); Wait(); //等TWINT置位
0022 26B6 in R2,0x36
0024 27FE sbrs R2,7
0026 FDCF rjmp L3
0028 .dbline 28
0028 .dbline 28
0028 .dbline 29
0028 ; if(TestAck()!=START) {Write_Succsee_Flag = false;Stop();return TestAck();}//ACK
0028 81B1 in R24,0x1
002A 887F andi R24,248
002C 8830 cpi R24,8
002E 41F0 breq L6
0030 .dbline 29
0030 .dbline 29
0030 2224 clr R2
0032 20920100 sts _Write_Succsee_Flag,R2
0036 .dbline 29
0036 84E9 ldi R24,148
0038 86BF out 0x36,R24
003A .dbline 29
003A 01B1 in R16,0x1
003C 087F andi R16,248
003E 40C0 rjmp L2
0040 L6:
0040 .dbline 31
0040 .dbline 31
0040 63B9 out 0x3,R22
0042 .dbline 31
0042 84E8 ldi R24,132
0044 86BF out 0x36,R24
0046 .dbline 31
0046 .dbline 31
0046 .dbline 31
0046 L8:
0046 .dbline 31
0046 L9:
0046 .dbline 31
0046 ; //寫I2C從器件地址和寫方式
0046 ; Write8Bit(device_adr); Wait();
0046 26B6 in R2,0x36
0048 27FE sbrs R2,7
004A FDCF rjmp L8
004C .dbline 31
004C .dbline 31
004C .dbline 32
004C ; if(TestAck()!=MT_SLA_ACK) {Write_Succsee_Flag = false;Stop();return TestAck();}//ACK
004C 81B1 in R24,0x1
004E 887F andi R24,248
0050 8831 cpi R24,24
0052 41F0 breq L11
0054 .dbline 32
0054 .dbline 32
0054 2224 clr R2
0056 20920100 sts _Write_Succsee_Flag,R2
005A .dbline 32
005A 84E9 ldi R24,148
005C 86BF out 0x36,R24
005E .dbline 32
005E 01B1 in R16,0x1
0060 087F andi R16,248
0062 2EC0 rjmp L2
0064 L11:
0064 .dbline 34
0064 .dbline 34
0064 43B9 out 0x3,R20
0066 .dbline 34
0066 84E8 ldi R24,132
0068 86BF out 0x36,R24
006A .dbline 34
006A .dbline 34
006A .dbline 34
006A L13:
006A .dbline 34
006A L14:
006A .dbline 34
006A ; //寫RAM地址
006A ; Write8Bit(RamAddress); Wait();
006A 26B6 in R2,0x36
006C 27FE sbrs R2,7
006E FDCF rjmp L13
0070 .dbline 34
0070 .dbline 34
0070 .dbline 35
0070 ; if(TestAck()!=MT_DATA_ACK) {Write_Succsee_Flag = false;Stop();return TestAck();}//ACK
0070 81B1 in R24,0x1
0072 887F andi R24,248
0074 8832 cpi R24,40
0076 41F0 breq L16
0078 .dbline 35
0078 .dbline 35
0078 2224 clr R2
007A 20920100 sts _Write_Succsee_Flag,R2
007E .dbline 35
007E 84E9 ldi R24,148
0080 86BF out 0x36,R24
0082 .dbline 35
0082 01B1 in R16,0x1
0084 087F andi R16,248
0086 1CC0 rjmp L2
0088 L16:
0088 .dbline 37
0088 .dbline 37
0088 0C80 ldd R0,y+4
008A 03B8 out 0x3,R0
008C .dbline 37
008C 84E8 ldi R24,132
008E 86BF out 0x36,R24
0090 .dbline 37
0090 .dbline 37
0090 .dbline 37
0090 L18:
0090 .dbline 37
0090 L19:
0090 .dbline 37
0090 ; //寫數據
0090 ; Write8Bit(Wdata); Wait();
0090 26B6 in R2,0x36
0092 27FE sbrs R2,7
0094 FDCF rjmp L18
0096 .dbline 37
0096 .dbline 37
0096 .dbline 38
0096 ; if(TestAck()!=MT_DATA_ACK) {Write_Succsee_Flag = false;Stop();return TestAck();}//ACK
0096 81B1 in R24,0x1
0098 887F andi R24,248
009A 8832 cpi R24,40
009C 41F0 breq L21
009E .dbline 38
009E .dbline 38
009E 2224 clr R2
00A0 20920100 sts _Write_Succsee_Flag,R2
00A4 .dbline 38
00A4 84E9 ldi R24,148
00A6 86BF out 0x36,R24
00A8 .dbline 38
00A8 01B1 in R16,0x1
00AA 087F andi R16,248
00AC 09C0 rjmp L2
00AE L21:
00AE .dbline 40
00AE ; //I2C停止
00AE ; Stop();
00AE 84E9 ldi R24,148
00B0 86BF out 0x36,R24
00B2 .dbline 41
00B2 ; delay_ms(10);//延時等寫完
00B2 0AE0 ldi R16,10
00B4 10E0 ldi R17,0
00B6 00D0 rcall _delay_ms
00B8 .dbline 42
00B8 ; Write_Succsee_Flag = true;
00B8 81E0 ldi R24,1
00BA 80930100 sts _Write_Succsee_Flag,R24
00BE .dbline 43
00BE ; return Write_Succsee_Flag;
00BE 082F mov R16,R24
00C0 .dbline -2
00C0 L2:
00C0 00D0 rcall pop_gset2
00C2 .dbline 0 ; func end
00C2 0895 ret
00C4 .dbsym l Wdata 4 c
00C4 .dbsym r RamAddress 20 c
00C4 .dbsym r device_adr 22 c
00C4 .dbend
00C4 .dbfunc e twi_read_byte _twi_read_byte fc
00C4 ; temp -> R20
00C4 ; RamAddress -> R18
00C4 ; device_adr -> R16
.even
00C4 _twi_read_byte::
00C4 00D0 rcall push_gset1
00C6 .dbline -1
00C6 .dbline 50
00C6 ; }
00C6 ; /******************************************
00C6 ; I2C總線讀一個字節
00C6 ; 如果讀失敗也返回0
00C6 ; *******************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -