📄 twi_master_polling.s
字号:
.module twi_master_polling.c
.area text(rom, con, rel)
.dbfile H:\程序库\twi_master_polling.c
.dbfunc e twi_init _twi_init fV
.even
_twi_init::
.dbline -1
.dbline 10
; #include <iom8v.h>
; #include <macros.h>
; #include "delay.h"
; #include "twi_master_polling.h"
;
; unsigned char Write_Succsee_Flag;
; unsigned char Read_Succsee_Flag;
;
; void twi_init(void)
; {
.dbline 11
; Write_Succsee_Flag = false;
clr R2
sts _Write_Succsee_Flag,R2
.dbline 12
; Read_Succsee_Flag = false;
sts _Read_Succsee_Flag,R2
.dbline 14
;
; TWCR= 0X00; //disable twi
out 0x36,R2
.dbline 15
; TWBR= 0x20; //set bit rate
ldi R24,32
out 0x0,R24
.dbline 16
; TWSR= 0x00; //set prescale
out 0x1,R2
.dbline 18
; //TWAR= DEVICE_ADR; //set slave address 本身作为主控
; TWCR= 0x44; //enable twi 置位TWEA,TWEN TWIE
ldi R24,68
out 0x36,R24
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e twi_write_byte _twi_write_byte fc
; Wdata -> y+4
; RamAddress -> R20
; device_adr -> R22
.even
_twi_write_byte::
rcall push_gset2
mov R20,R18
mov R22,R16
.dbline -1
.dbline 26
; }
; /******************************************
; I2C总线写一个字节
; 返回0: 写成功
; 返回错误状态字:写失败
; *******************************************/
; unsigned char twi_write_byte(unsigned char device_adr,unsigned char RamAddress,unsigned char Wdata)
; {
.dbline 28
ldi R24,164
out 0x36,R24
.dbline 28
L3:
.dbline 28
L4:
.dbline 28
; //I2C启动
; Start(); Wait(); //等TWINT置位
in R2,0x36
sbrs R2,7
rjmp L3
.dbline 28
.dbline 28
.dbline 29
; if(TestAck()!=START) {Write_Succsee_Flag = false;Stop();return TestAck();}//ACK
in R24,0x1
andi R24,248
cpi R24,8
breq L6
.dbline 29
.dbline 29
clr R2
sts _Write_Succsee_Flag,R2
.dbline 29
ldi R24,148
out 0x36,R24
.dbline 29
in R16,0x1
andi R16,248
rjmp L2
L6:
.dbline 31
.dbline 31
out 0x3,R22
.dbline 31
ldi R24,132
out 0x36,R24
.dbline 31
.dbline 31
.dbline 31
L8:
.dbline 31
L9:
.dbline 31
; //写I2C从器件地址和写方式
; Write8Bit(device_adr); Wait();
in R2,0x36
sbrs R2,7
rjmp L8
.dbline 31
.dbline 31
.dbline 32
; if(TestAck()!=MT_SLA_ACK) {Write_Succsee_Flag = false;Stop();return TestAck();}//ACK
in R24,0x1
andi R24,248
cpi R24,24
breq L11
.dbline 32
.dbline 32
clr R2
sts _Write_Succsee_Flag,R2
.dbline 32
ldi R24,148
out 0x36,R24
.dbline 32
in R16,0x1
andi R16,248
rjmp L2
L11:
.dbline 34
.dbline 34
out 0x3,R20
.dbline 34
ldi R24,132
out 0x36,R24
.dbline 34
.dbline 34
.dbline 34
L13:
.dbline 34
L14:
.dbline 34
; //写RAM地址
; Write8Bit(RamAddress); Wait();
in R2,0x36
sbrs R2,7
rjmp L13
.dbline 34
.dbline 34
.dbline 35
; if(TestAck()!=MT_DATA_ACK) {Write_Succsee_Flag = false;Stop();return TestAck();}//ACK
in R24,0x1
andi R24,248
cpi R24,40
breq L16
.dbline 35
.dbline 35
clr R2
sts _Write_Succsee_Flag,R2
.dbline 35
ldi R24,148
out 0x36,R24
.dbline 35
in R16,0x1
andi R16,248
rjmp L2
L16:
.dbline 37
.dbline 37
ldd R0,y+4
out 0x3,R0
.dbline 37
ldi R24,132
out 0x36,R24
.dbline 37
.dbline 37
.dbline 37
L18:
.dbline 37
L19:
.dbline 37
; //写数据
; Write8Bit(Wdata); Wait();
in R2,0x36
sbrs R2,7
rjmp L18
.dbline 37
.dbline 37
.dbline 38
; if(TestAck()!=MT_DATA_ACK) {Write_Succsee_Flag = false;Stop();return TestAck();}//ACK
in R24,0x1
andi R24,248
cpi R24,40
breq L21
.dbline 38
.dbline 38
clr R2
sts _Write_Succsee_Flag,R2
.dbline 38
ldi R24,148
out 0x36,R24
.dbline 38
in R16,0x1
andi R16,248
rjmp L2
L21:
.dbline 40
; //I2C停止
; Stop();
ldi R24,148
out 0x36,R24
.dbline 41
; delay_ms(10);//延时等写完
ldi R16,10
ldi R17,0
rcall _delay_ms
.dbline 42
; Write_Succsee_Flag = true;
ldi R24,1
sts _Write_Succsee_Flag,R24
.dbline 43
; return Write_Succsee_Flag;
mov R16,R24
.dbline -2
L2:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym l Wdata 4 c
.dbsym r RamAddress 20 c
.dbsym r device_adr 22 c
.dbend
.dbfunc e twi_read_byte _twi_read_byte fc
; temp -> R20
; RamAddress -> R18
; device_adr -> R16
.even
_twi_read_byte::
rcall push_gset1
.dbline -1
.dbline 50
; }
; /******************************************
; I2C总线读一个字节
; 如果读失败也返回0
; *******************************************/
; unsigned char twi_read_byte(unsigned char device_adr,unsigned char RamAddress)
; {
.dbline 54
ldi R24,164
out 0x36,R24
.dbline 54
L24:
.dbline 54
L25:
.dbline 54
; unsigned char temp;
;
; //I2C启动
; Start(); Wait();
in R2,0x36
sbrs R2,7
rjmp L24
.dbline 54
.dbline 54
.dbline 55
; if (TestAck()!=START) {Read_Succsee_Flag = false;Stop();return TestAck();}//ACK
in R24,0x1
andi R24,248
cpi R24,8
breq L27
.dbline 55
.dbline 55
clr R2
sts _Read_Succsee_Flag,R2
.dbline 55
ldi R24,148
out 0x36,R24
.dbline 55
in R16,0x1
andi R16,248
rjmp L23
L27:
.dbline 57
.dbline 57
out 0x3,R16
.dbline 57
ldi R24,132
out 0x36,R24
.dbline 57
.dbline 57
.dbline 57
L29:
.dbline 57
L30:
.dbline 57
; //写I2C从器件地址和写方式
; Write8Bit(device_adr); Wait();
in R2,0x36
sbrs R2,7
rjmp L29
.dbline 57
.dbline 57
.dbline 58
; if (TestAck()!=MT_SLA_ACK) {Read_Succsee_Flag = false;Stop();return TestAck();}//ACK
in R24,0x1
andi R24,248
cpi R24,24
breq L32
.dbline 58
.dbline 58
clr R2
sts _Read_Succsee_Flag,R2
.dbline 58
ldi R24,148
out 0x36,R24
.dbline 58
in R16,0x1
andi R16,248
rjmp L23
L32:
.dbline 60
.dbline 60
out 0x3,R18
.dbline 60
ldi R24,132
out 0x36,R24
.dbline 60
.dbline 60
.dbline 60
L34:
.dbline 60
L35:
.dbline 60
; //写RAM地址
; Write8Bit(RamAddress); Wait();
in R2,0x36
sbrs R2,7
rjmp L34
.dbline 60
.dbline 60
.dbline 61
; if (TestAck()!=MT_DATA_ACK) {Read_Succsee_Flag = false;Stop();return TestAck();}
in R24,0x1
andi R24,248
cpi R24,40
breq L37
.dbline 61
.dbline 61
clr R2
sts _Read_Succsee_Flag,R2
.dbline 61
ldi R24,148
out 0x36,R24
.dbline 61
in R16,0x1
andi R16,248
rjmp L23
L37:
.dbline 63
ldi R24,164
out 0x36,R24
.dbline 63
L39:
.dbline 63
L40:
.dbline 63
; //I2C重新启动
; Start(); Wait();
in R2,0x36
sbrs R2,7
rjmp L39
.dbline 63
.dbline 63
.dbline 64
; if (TestAck()!=RE_START) {Read_Succsee_Flag = false;Stop();return TestAck();}
in R24,0x1
andi R24,248
cpi R24,16
breq L42
.dbline 64
.dbline 64
clr R2
sts _Read_Succsee_Flag,R2
.dbline 64
ldi R24,148
out 0x36,R24
.dbline 64
in R16,0x1
andi R16,248
rjmp L23
L42:
.dbline 66
.dbline 66
mov R24,R16
subi R24,255 ; addi 1
out 0x3,R24
.dbline 66
ldi R24,132
out 0x36,R24
.dbline 66
.dbline 66
.dbline 66
L44:
.dbline 66
L45:
.dbline 66
; //写I2C从器件地址和读方式
; Write8Bit(device_adr+1); Wait();
in R2,0x36
sbrs R2,7
rjmp L44
.dbline 66
.dbline 66
.dbline 67
; if(TestAck()!=MR_SLA_ACK) {Read_Succsee_Flag = false;Stop();return TestAck();}//ACK
in R24,0x1
andi R24,248
cpi R24,64
breq L47
.dbline 67
.dbline 67
clr R2
sts _Read_Succsee_Flag,R2
.dbline 67
ldi R24,148
out 0x36,R24
.dbline 67
in R16,0x1
andi R16,248
rjmp L23
L47:
.dbline 69
ldi R24,196
out 0x36,R24
.dbline 69
L49:
.dbline 69
L50:
.dbline 69
; //启动主I2C读方式,且设为准备响应
; Twi(); Wait();
in R2,0x36
sbrs R2,7
rjmp L49
.dbline 69
.dbline 69
.dbline 70
; if(TestAck()!=MR_DATA_ACK) {Read_Succsee_Flag = false;Stop();return TestAck();}//ACK
in R24,0x1
andi R24,248
cpi R24,80
breq L52
.dbline 70
.dbline 70
clr R2
sts _Read_Succsee_Flag,R2
.dbline 70
ldi R24,148
out 0x36,R24
.dbline 70
in R16,0x1
andi R16,248
rjmp L23
L52:
.dbline 72
; //读取I2C接收数据
; temp=TWDR;
in R20,0x3
.dbline 73
; Read_Succsee_Flag = true;
ldi R24,1
sts _Read_Succsee_Flag,R24
.dbline 75
; //I2C停止
; Stop();
ldi R24,148
out 0x36,R24
.dbline 76
; return temp;
mov R16,R20
.dbline -2
L23:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r temp 20 c
.dbsym r RamAddress 18 c
.dbsym r device_adr 16 c
.dbend
.area bss(ram, con, rel)
.dbfile H:\程序库\twi_master_polling.c
_Read_Succsee_Flag::
.blkb 1
.dbsym e Read_Succsee_Flag _Read_Succsee_Flag c
_Write_Succsee_Flag::
.blkb 1
.dbsym e Write_Succsee_Flag _Write_Succsee_Flag c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -