📄 twi_master_drv.s
字号:
adc R31,R3
lds R2,187
std z+0,R2
.dbline 180
; Twi_set_stop();
lds R24,188
ori R24,16
sts 188,R24
.dbline 181
; twi_busy = FALSE;
clr R2
sts _twi_busy,R2
.dbline 182
; twi_err = TWI_RECEIVE_OK;
ldi R24,1
sts _twi_err,R24
.dbline 183
; break;
xjmp L5
L4:
.dbline 187
lds R24,188
ori R24,16
sts 188,R24
.dbline 188
clr R2
sts _twi_busy,R2
.dbline 189
ldi R24,6
sts _twi_err,R24
.dbline 190
L5:
.dbline -2
L3:
.dbline 0 ; func end
ret
.dbend
.dbfunc e twi_send_message_polling _twi_send_message_polling fc
; info -> y+6
; nbbytes -> y+4
; rw -> R20
; slave_addr -> R22
.even
_twi_send_message_polling::
xcall push_gset2
mov R20,R18
mov R22,R16
.dbline -1
.dbline 213
;
; //if we arrived here, unknown state has occurred.....
; default :
; Twi_set_stop();
; twi_busy = FALSE;
; twi_err = TWI_UNKNOWN;
; break;
; }
; }
;
; /*****************************************************************************
; 函数介绍:TWI主机模式,查询方式
; 输入参数: slave_addr:从机地址
; rw:=TWI_WRITE发送模式;=TWI_READ接收模式
; nbbytes:最大字节数
; *info:数据缓存地址
; 输出参数:
; 返回值:twi_err:TWI通讯状态
; - TWI_TRANSFER_OK 发送完成
; - TWI_RECEIVE_OK 接收完成
; - TWI_BUS_ERROR 总线冲突
; - TWI_HOST_ADR_NACK 从机地址无应答
; - TWI_HOST_DATA_NACK 从机数据无应答(不存在)
; - TWI_ARBITRATION_LOST 仲裁失败
; - TWI_UNKNOWN TWI状态错误
; - TWI_NOT_FREE TWI通信忙
; - TWI_OK TWI通信开始
; *****************************************************************************/
; unsigned char twi_send_message_polling( uchar slave_addr,uchar rw, uchar nbbytes, uchar *info )
; {
.dbline 214
; twi_message.address = slave_addr;
sts _twi_message,R22
.dbline 215
; twi_message.rw = rw;
sts _twi_message+1,R20
.dbline 216
; twi_message.nbbytes = nbbytes;
ldd R0,y+4
sts _twi_message+2,R0
.dbline 217
; twi_message.buf = info;
ldd R0,y+6
ldd R1,y+7
sts _twi_message+3+1,R1
sts _twi_message+3,R0
L60:
.dbline 218
L61:
.dbline 218
; Twi_wait_hw_stop();
lds R2,188
clr R3
sbrc R2,4
rjmp L60
.dbline 219
; Disable_twi_interrupt(); //FIXME
lds R24,188
andi R24,254
sts 188,R24
.dbline 220
; twi_nb_transmited=0;
clr R2
sts _twi_nb_transmited,R2
.dbline 221
; if (!twi_busy)
lds R2,_twi_busy
tst R2
brne L63
.dbline 222
; {
.dbline 223
; twi_busy =1;
ldi R24,1
sts _twi_busy,R24
.dbline 224
; twi_err = TWI_OK;
ldi R24,8
sts _twi_err,R24
.dbline 225
; Twi_set_start();
lds R24,188
ori R24,32
sts 188,R24
xjmp L66
X17:
.dbline 227
; while (twi_busy)
; {
L68:
.dbline 228
L69:
.dbline 228
lds R24,188
andi R24,128
cpi R24,128
brne L68
.dbline 229
xcall _twi_decode_status
.dbline 231
L66:
.dbline 226
lds R2,_twi_busy
tst R2
brne L69
.dbline 233
; Twi_wait_event();
; twi_decode_status();
; // Twi_clear_si(); //REMOVE FROM MAIN LOOP, ADDED IN ALL NECESARY CASE (See JSB /RLE)
; }
; // Twi_set_stop(); RLE
; return twi_err;
lds R16,_twi_err
xjmp L56
L63:
.dbline 235
; }
; Twi_set_stop();
lds R24,188
ori R24,16
sts 188,R24
.dbline 236
; return TWI_NOT_FREE;
ldi R16,7
.dbline -2
L56:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym l info 6 pc
.dbsym l nbbytes 4 c
.dbsym r rw 20 c
.dbsym r slave_addr 22 c
.dbend
.dbfunc e twi_send_message_interrupt _twi_send_message_interrupt fc
; info -> y+2
; nbbytes -> y+0
; rw -> R18
; slave_addr -> R16
.even
_twi_send_message_interrupt::
.dbline -1
.dbline 258
; }
;
; /*****************************************************************************
; 函数介绍:TWI主机模式,中断方式
; 输入参数: slave_addr:从机地址
; rw:=TWI_WRITE发送模式;=TWI_READ接收模式
; nbbytes:最大字节数
; *info:数据缓存地址
; 输出参数:
; 返回值:twi_err:TWI通讯状态
; - TWI_TRANSFER_OK 发送完成
; - TWI_RECEIVE_OK 接收完成
; - TWI_BUS_ERROR 总线冲突
; - TWI_HOST_ADR_NACK 从机地址无应答
; - TWI_HOST_DATA_NACK 从机数据无应答(不存在)
; - TWI_ARBITRATION_LOST 仲裁失败
; - TWI_UNKNOWN TWI状态错误 //接受复位
; - TWI_NOT_FREE TWI通信忙
; - TWI_OK TWI通信开始
; *****************************************************************************/
; unsigned char twi_send_message_interrupt( uchar slave_addr,uchar rw, uchar nbbytes, uchar *info)
; {
.dbline 259
; twi_message.address = slave_addr;
sts _twi_message,R16
.dbline 260
; twi_message.rw = rw;
sts _twi_message+1,R18
.dbline 261
; twi_message.nbbytes = nbbytes;
ldd R0,y+0
sts _twi_message+2,R0
.dbline 262
; twi_message.buf = info;
ldd R0,y+2
ldd R1,y+3
sts _twi_message+3+1,R1
sts _twi_message+3,R0
L75:
.dbline 263
L76:
.dbline 263
; Twi_wait_hw_stop();
lds R2,188
clr R3
sbrc R2,4
rjmp L75
.dbline 264
; twi_nb_transmited=0;
clr R2
sts _twi_nb_transmited,R2
.dbline 265
; if (!twi_busy)
lds R2,_twi_busy
tst R2
brne L78
.dbline 266
; {
.dbline 267
; twi_err = TWI_OK;
ldi R24,8
sts _twi_err,R24
.dbline 268
; twi_busy =1;
ldi R24,1
sts _twi_busy,R24
.dbline 269
; Enable_twi_interrupt();
lds R24,188
ori R24,1
sts 188,R24
.dbline 270
; Twi_set_start();
lds R24,188
ori R24,32
sts 188,R24
.dbline 271
; return twi_err;
lds R16,_twi_err
xjmp L71
L78:
.dbline 273
; }
; Twi_set_stop();
lds R24,188
ori R24,16
sts 188,R24
.dbline 274
; return TWI_NOT_FREE;
ldi R16,7
.dbline -2
L71:
.dbline 0 ; func end
ret
.dbsym l info 2 pc
.dbsym l nbbytes 0 c
.dbsym r rw 18 c
.dbsym r slave_addr 16 c
.dbend
.area vector(rom, abs)
.org 140
jmp _twi_interrupt
.area text(rom, con, rel)
.dbfile F:\zzz\i2c-master\twi_master_drv.c
.dbfunc e twi_interrupt _twi_interrupt fV
.even
_twi_interrupt::
xcall push_lset
.dbline -1
.dbline 287
; }
;
; /*****************************************************************************
; 函数介绍:TWI中断例程
; 输入参数:
; 输出参数:
; 返回值:无
; *****************************************************************************/
; //#pragma vector = TWI_vect
; //__interrupt void twi_interrupt()
; #pragma interrupt_handler twi_interrupt:36
; void twi_interrupt()
; {
.dbline 288
; twi_decode_status();
xcall _twi_decode_status
.dbline -2
L80:
xcall pop_lset
.dbline 0 ; func end
reti
.dbend
.dbfunc e TWI_MW _TWI_MW fV
; info -> y+8
; nbbytes -> R22
; slave_addr -> R20
.even
_TWI_MW::
xcall push_gset2
mov R22,R18
mov R20,R16
sbiw R28,4
.dbline -1
.dbline 301
; // Twi_clear_si(); //REMOVE FROM MAIN LOOP, ADDED IN ALL NECESARY CASE (See JSB /RLE)
; }
;
; /*****************************************************************************
; 函数介绍:主机发送模式
; 输入参数: slave_addr:从机地址
; nbbytes:最大字节数
; *info:数据缓存地址
; 输出参数:
; 返回值:无
; *****************************************************************************/
; void TWI_MW(uchar slave_addr,uchar nbbytes,uchar *info) //用户程序
; {
.dbline 303
; //twi_send_message_polling(slave_addr, TWI_WRITE, nbbytes, info); //查询方式
; twi_send_message_interrupt(slave_addr, TWI_WRITE, nbbytes, info); //中断方式
ldd R0,y+8
ldd R1,y+9
std y+3,R1
std y+2,R0
std y+0,R22
clr R18
mov R16,R20
xcall _twi_send_message_interrupt
.dbline -2
L81:
adiw R28,4
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym l info 8 pc
.dbsym r nbbytes 22 c
.dbsym r slave_addr 20 c
.dbend
.dbfunc e TWI_MR _TWI_MR fV
; info -> y+8
; nbbytes -> R22
; slave_addr -> R20
.even
_TWI_MR::
xcall push_gset2
mov R22,R18
mov R20,R16
sbiw R28,4
.dbline -1
.dbline 315
; }
;
; /*****************************************************************************
; 函数介绍:主机接收模式
; 输入参数: slave_addr:从机地址
; nbbytes:最大字节数
; *info:数据缓存地址
; 输出参数:
; 返回值:无
; *****************************************************************************/
; void TWI_MR(uchar slave_addr,uchar nbbytes,uchar *info)
; {
.dbline 317
; //twi_send_message_polling(slave_addr, TWI_READ, nbbytes, info); //查询方式
; twi_send_message_interrupt(slave_addr, TWI_READ, nbbytes, info); //中断方式
ldd R0,y+8
ldd R1,y+9
std y+3,R1
std y+2,R0
std y+0,R22
ldi R18,1
mov R16,R20
xcall _twi_send_message_interrupt
.dbline -2
L82:
adiw R28,4
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym l info 8 pc
.dbsym r nbbytes 22 c
.dbsym r slave_addr 20 c
.dbend
.area lit(rom, con, rel)
L84:
.byte 144,'U
.byte 'U
.area text(rom, con, rel)
.dbfile F:\zzz\i2c-master\twi_master_drv.c
.dbfunc e main _main fV
; Mkeybuf -> y+5
; Mdisbuf -> y+2
; i -> R20,R21
.even
_main::
sbiw R28,9
.dbline -1
.dbline 323
; }
;
;
;
; void main(void)
; {
.dbline 326
; int i;
;
; uchar Mdisbuf[3]={0x90,0x55,0x55};
ldi R24,<L84
ldi R25,>L84
movw R30,R28
adiw R30,2
ldi R16,3
ldi R17,0
st -y,R31
st -y,R30
st -y,R25
st -y,R24
xcall asgncblk
.dbline 329
; uchar Mkeybuf[4];
;
; twi_busy = 0;
clr R2
sts _twi_busy,R2
.dbline 331
;
; CLI();
cli
.dbline 332
; twi_lib_init();
xcall _twi_lib_init
.dbline 333
; SEI();
sei
xjmp L86
L85:
.dbline 341
;
;
; /*while(1)
; if(!twi_busy)
; TWI_MR(0x4F, 2, Mkeybuf); //向从机温度传感器0x4F读取2个数据
; */
; while(1)
; {
.dbline 342
; if(!twi_busy)
lds R2,_twi_busy
tst R2
brne L88
.dbline 343
; TWI_MR(0x21, 4, Mkeybuf);
movw R24,R28
adiw R24,5
std y+1,R25
std y+0,R24
ldi R18,4
ldi R16,33
xcall _TWI_MR
L88:
.dbline 345
;
; if(!twi_busy){
lds R2,_twi_busy
tst R2
brne L90
.dbline 345
.dbline 346
; Mdisbuf[2]=0x09;//点亮
ldi R24,9
std y+4,R24
.dbline 347
; TWI_MW(0x21, 3, Mdisbuf); //向从机0x21写入3个数据
movw R24,R28
adiw R24,2
std y+1,R25
std y+0,R24
ldi R18,3
ldi R16,33
xcall _TWI_MW
.dbline 348
; }
L90:
.dbline 349
clr R20
clr R21
L93:
.dbline 349
L94:
.dbline 349
; for(i=0;i<2000;i++);
subi R20,255 ; offset = 1
sbci R21,255
.dbline 349
cpi R20,208
ldi R30,7
cpc R21,R30
brlt L93
.dbline 350
; if(!twi_busy){
lds R2,_twi_busy
tst R2
brne L97
.dbline 350
.dbline 351
; Mdisbuf[2]=0x89;//灭
ldi R24,137
std y+4,R24
.dbline 352
; TWI_MW(0x21, 3, Mdisbuf); //向从机0x21写入3个数据
movw R24,R28
adiw R24,2
std y+1,R25
std y+0,R24
ldi R18,3
ldi R16,33
xcall _TWI_MW
.dbline 353
; }
L97:
.dbline 354
clr R20
clr R21
L100:
.dbline 354
L101:
.dbline 354
subi R20,255 ; offset = 1
sbci R21,255
.dbline 354
cpi R20,208
ldi R30,7
cpc R21,R30
brlt L100
.dbline 355
L86:
.dbline 340
xjmp L85
L104:
.dbline 361
L105:
.dbline 361
xjmp L104
X18:
.dbline -2
L83:
adiw R28,9
.dbline 0 ; func end
ret
.dbsym l Mkeybuf 5 A[4:4]c
.dbsym l Mdisbuf 2 A[3:3]c
.dbsym r i 20 I
.dbend
.area bss(ram, con, rel)
.dbfile F:\zzz\i2c-master\twi_master_drv.c
_twi_nb_transmited::
.blkb 1
.dbsym e twi_nb_transmited _twi_nb_transmited c
_twi_err::
.blkb 1
.dbsym e twi_err _twi_err c
_twi_busy::
.blkb 1
.dbsym e twi_busy _twi_busy c
_twi_message::
.blkb 5
.dbstruct 0 5 .1
.dbfield 0 address c
.dbfield 1 rw c
.dbfield 2 nbbytes c
.dbfield 3 buf pc
.dbend
.dbsym e twi_message _twi_message S[.1]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -