📄 iic_drive.s
字号:
.module IIC_drive.C
.area text(rom, con, rel)
.dbfile D:\mega16\drive\IIC_drive.C
.dbfunc e IIC_init _IIC_init fV
.even
_IIC_init::
.dbline -1
.dbline 20
; /******************************************************************************/
; /* 用TWI口 读写IIC总线 */
; /* MEGA16 8M */
; /* 100K */
; /******************************************************************************/
;
; #include "config.h"
;
; #define TW_START 0X08
; #define TW_SLA_ACK 0X18
; #define TW_SLA_NO_ACK 0X20
; #define TW_DATA_ACK 0X28
; #define TW_DATA_NO_ACK 0X30
;
;
; #define TW_STATE (TWSR & 0XF8)
;
; /******************************************************************************/
; void IIC_init(void)
; {
.dbline 21
; TWCR= 0X00; //disable twi
clr R2
out 0x36,R2
.dbline 22
; TWBR= 0x20; //set bit rate
ldi R24,32
out 0x0,R24
.dbline 23
; TWSR= 0x00; //set prescale
out 0x1,R2
.dbline 24
; TWAR= 0x00; //set slave address
out 0x2,R2
.dbline 25
; TWCR= 0x00; //enable twi
out 0x36,R2
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e IIC_START _IIC_START fV
.even
_IIC_START::
.dbline -1
.dbline 29
; }
; /******************************************************************************/
; void IIC_START(void)
; {
.dbline 30
; TWCR = BIT(TWINT) | BIT(TWSTA) | BIT(TWEN);
ldi R24,164
out 0x36,R24
L3:
.dbline 31
L4:
.dbline 31
; while(!(TWCR & BIT(TWINT)));
in R2,0x36
sbrs R2,7
rjmp L3
.dbline -2
L2:
.dbline 0 ; func end
ret
.dbend
.dbfunc e IIC_STOP _IIC_STOP fV
.even
_IIC_STOP::
.dbline -1
.dbline 35
; }
; /******************************************************************************/
; void IIC_STOP(void)
; {
.dbline 36
; TWCR = BIT(TWINT) | BIT(TWSTO) | BIT(TWEN);
ldi R24,148
out 0x36,R24
L7:
.dbline 37
L8:
.dbline 37
; while(!(TWCR & BIT(TWINT)));
in R2,0x36
sbrs R2,7
rjmp L7
.dbline -2
L6:
.dbline 0 ; func end
ret
.dbend
.dbfunc e IIC_send _IIC_send fV
; IIC_state -> <dead>
; IIC_data -> R16
.even
_IIC_send::
.dbline -1
.dbline 41
; }
; /******************************************************************************/
; void IIC_send(unsigned char IIC_data)
; {
.dbline 43
; unsigned char IIC_state;
; TWDR = IIC_data;
out 0x3,R16
.dbline 44
; TWCR = BIT(TWINT) | BIT(TWEN);
ldi R24,132
out 0x36,R24
L11:
.dbline 45
L12:
.dbline 45
; while(!(TWCR & TWINT));
in R24,0x36
andi R24,7
breq L11
.dbline -2
L10:
.dbline 0 ; func end
ret
.dbsym l IIC_state 1 c
.dbsym r IIC_data 16 c
.dbend
.dbfunc e IIC_take _IIC_take fc
.even
_IIC_take::
.dbline -1
.dbline 49
; }
; /******************************************************************************/
; unsigned char IIC_take(void)
; {
.dbline 50
; TWCR |= BIT(TWINT) | BIT(TWEN) | BIT(TWEA);
in R24,0x36
ori R24,196
out 0x36,R24
L15:
.dbline 51
L16:
.dbline 51
; while(!(TWCR & BIT(TWINT)));
in R2,0x36
sbrs R2,7
rjmp L15
.dbline 52
; return (TWDR);
in R16,0x3
.dbline -2
L14:
.dbline 0 ; func end
ret
.dbend
.dbfunc e IIC_read _IIC_read fc
; n_byte -> R20
; IIC_data -> R22,R23
; IIC_address -> R10
.even
_IIC_read::
xcall push_gset3
movw R22,R18
mov R10,R16
ldd R20,y+6
.dbline -1
.dbline 56
; }
; /******************************************************************************/
; unsigned char IIC_read(unsigned char IIC_address,unsigned char *IIC_data,unsigned char n_byte)
; {
.dbline 57
; IIC_address |= 0x01;
mov R24,R10
ori R24,1
mov R10,R24
.dbline 58
; IIC_START();
xcall _IIC_START
.dbline 59
; IIC_send(IIC_address);
mov R16,R10
xcall _IIC_send
.dbline 60
; if(TW_STATE != TW_SLA_ACK)
in R24,0x1
andi R24,248
cpi R24,24
breq L22
.dbline 61
; {
.dbline 64
; // IIC_STOP();
; // return FALSE;
; }
xjmp L22
L21:
.dbline 66
; while(--n_byte)
; {
.dbline 67
; *IIC_data++ = IIC_take();
xcall _IIC_take
movw R30,R22
st Z+,R16
movw R22,R30
.dbline 68
; if(TW_STATE == TW_DATA_NO_ACK)
in R24,0x1
andi R24,248
cpi R24,48
brne L24
.dbline 69
; {
.dbline 72
; // IIC_STOP();
; // return FALSE;
; }
L24:
.dbline 73
L22:
.dbline 65
mov R24,R20
subi R24,1
mov R20,R24
tst R24
brne L21
.dbline 74
; }
; TWCR |= BIT(TWINT) | BIT(TWEN);
in R24,0x36
ori R24,132
out 0x36,R24
L26:
.dbline 75
L27:
.dbline 75
; while(!(TWCR & BIT(TWINT)));
in R2,0x36
sbrs R2,7
rjmp L26
.dbline 76
; *IIC_data = TWDR;
in R2,0x3
movw R30,R22
std z+0,R2
.dbline 77
; if(TW_STATE == TW_DATA_NO_ACK)
in R24,0x1
andi R24,248
cpi R24,48
brne L29
.dbline 78
; {
.dbline 81
; // IIC_STOP();
; // return FALSE;
; }
L29:
.dbline 82
; IIC_STOP();
xcall _IIC_STOP
.dbline 83
; return TRUE;
ldi R16,1
.dbline -2
L18:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r n_byte 20 c
.dbsym r IIC_data 22 pc
.dbsym r IIC_address 10 c
.dbend
.dbfunc e IIC_write _IIC_write fc
; n_byte -> R20
; IIC_data -> R22,R23
; IIC_address -> R10
.even
_IIC_write::
xcall push_gset3
movw R22,R18
mov R10,R16
ldd R20,y+6
.dbline -1
.dbline 87
; }
; /******************************************************************************/
; unsigned char IIC_write(unsigned char IIC_address,unsigned char *IIC_data,unsigned char n_byte)
; {
.dbline 88
; IIC_address &= 0xfe;
mov R24,R10
andi R24,254
mov R10,R24
.dbline 89
; IIC_START();
xcall _IIC_START
.dbline 90
; IIC_send(IIC_address);
mov R16,R10
xcall _IIC_send
.dbline 91
; if(TW_STATE != TW_SLA_ACK)
in R24,0x1
andi R24,248
cpi R24,24
breq L35
.dbline 92
; {
.dbline 95
; // IIC_STOP();
; // return FALSE;
; }
xjmp L35
L34:
.dbline 97
; while(n_byte--)
; {
.dbline 98
; IIC_send(*IIC_data++);
movw R30,R22
ld R16,Z+
movw R22,R30
xcall _IIC_send
.dbline 99
; if(TW_STATE != TW_DATA_ACK)
in R24,0x1
andi R24,248
cpi R24,40
breq L37
.dbline 100
; {
.dbline 103
; // IIC_STOP();
; // return FALSE;
; }
L37:
.dbline 104
L35:
.dbline 96
mov R2,R20
clr R3
subi R20,1
tst R2
brne L34
.dbline 105
; }
; IIC_STOP();
xcall _IIC_STOP
.dbline 106
; return TRUE;
ldi R16,1
.dbline -2
L31:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r n_byte 20 c
.dbsym r IIC_data 22 pc
.dbsym r IIC_address 10 c
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -