📄 twi_master_drv.lis
字号:
02EC 2090BB00 lds R2,187
02F0 2082 std z+0,R2
02F2 .dbline 180
02F2 ; Twi_set_stop();
02F2 8091BC00 lds R24,188
02F6 8061 ori R24,16
02F8 8093BC00 sts 188,R24
02FC .dbline 181
02FC ; twi_busy = FALSE;
02FC 2224 clr R2
02FE 20920200 sts _twi_busy,R2
0302 .dbline 182
0302 ; twi_err = TWI_RECEIVE_OK;
0302 81E0 ldi R24,1
0304 80930100 sts _twi_err,R24
0308 .dbline 183
0308 ; break;
0308 0BC0 xjmp L5
030A L4:
030A .dbline 187
030A 8091BC00 lds R24,188
030E 8061 ori R24,16
0310 8093BC00 sts 188,R24
0314 .dbline 188
0314 2224 clr R2
0316 20920200 sts _twi_busy,R2
031A .dbline 189
031A 86E0 ldi R24,6
031C 80930100 sts _twi_err,R24
0320 .dbline 190
0320 L5:
0320 .dbline -2
0320 L3:
0320 .dbline 0 ; func end
0320 0895 ret
0322 .dbend
0322 .dbfunc e twi_send_message_polling _twi_send_message_polling fc
0322 ; info -> y+6
0322 ; nbbytes -> y+4
0322 ; rw -> R20
0322 ; slave_addr -> R22
.even
0322 _twi_send_message_polling::
0322 0E940000 xcall push_gset2
0326 422F mov R20,R18
0328 602F mov R22,R16
032A .dbline -1
032A .dbline 213
032A ;
032A ; //if we arrived here, unknown state has occurred.....
032A ; default :
032A ; Twi_set_stop();
032A ; twi_busy = FALSE;
032A ; twi_err = TWI_UNKNOWN;
032A ; break;
032A ; }
032A ; }
032A ;
032A ; /*****************************************************************************
032A ; 函数介绍:TWI主机模式,查询方式
032A ; 输入参数: slave_addr:从机地址
032A ; rw:=TWI_WRITE发送模式;=TWI_READ接收模式
032A ; nbbytes:最大字节数
032A ; *info:数据缓存地址
032A ; 输出参数:
032A ; 返回值:twi_err:TWI通讯状态
032A ; - TWI_TRANSFER_OK 发送完成
032A ; - TWI_RECEIVE_OK 接收完成
032A ; - TWI_BUS_ERROR 总线冲突
032A ; - TWI_HOST_ADR_NACK 从机地址无应答
032A ; - TWI_HOST_DATA_NACK 从机数据无应答(不存在)
032A ; - TWI_ARBITRATION_LOST 仲裁失败
032A ; - TWI_UNKNOWN TWI状态错误
032A ; - TWI_NOT_FREE TWI通信忙
032A ; - TWI_OK TWI通信开始
032A ; *****************************************************************************/
032A ; unsigned char twi_send_message_polling( uchar slave_addr,uchar rw, uchar nbbytes, uchar *info )
032A ; {
032A .dbline 214
032A ; twi_message.address = slave_addr;
032A 60930300 sts _twi_message,R22
032E .dbline 215
032E ; twi_message.rw = rw;
032E 40930400 sts _twi_message+1,R20
0332 .dbline 216
0332 ; twi_message.nbbytes = nbbytes;
0332 0C80 ldd R0,y+4
0334 00920500 sts _twi_message+2,R0
0338 .dbline 217
0338 ; twi_message.buf = info;
0338 0E80 ldd R0,y+6
033A 1F80 ldd R1,y+7
033C 10920700 sts _twi_message+3+1,R1
0340 00920600 sts _twi_message+3,R0
0344 L60:
0344 .dbline 218
0344 L61:
0344 .dbline 218
0344 ; Twi_wait_hw_stop();
0344 2090BC00 lds R2,188
0348 3324 clr R3
034A 24FC sbrc R2,4
034C FBCF rjmp L60
034E .dbline 219
034E ; Disable_twi_interrupt(); //FIXME
034E 8091BC00 lds R24,188
0352 8E7F andi R24,254
0354 8093BC00 sts 188,R24
0358 .dbline 220
0358 ; twi_nb_transmited=0;
0358 2224 clr R2
035A 20920000 sts _twi_nb_transmited,R2
035E .dbline 221
035E ; if (!twi_busy)
035E 20900200 lds R2,_twi_busy
0362 2220 tst R2
0364 C9F4 brne L63
0366 .dbline 222
0366 ; {
0366 .dbline 223
0366 ; twi_busy =1;
0366 81E0 ldi R24,1
0368 80930200 sts _twi_busy,R24
036C .dbline 224
036C ; twi_err = TWI_OK;
036C 88E0 ldi R24,8
036E 80930100 sts _twi_err,R24
0372 .dbline 225
0372 ; Twi_set_start();
0372 8091BC00 lds R24,188
0376 8062 ori R24,32
0378 8093BC00 sts 188,R24
037C 06C0 xjmp L66
037E X17:
037E .dbline 227
037E ; while (twi_busy)
037E ; {
037E L68:
037E .dbline 228
037E L69:
037E .dbline 228
037E 8091BC00 lds R24,188
0382 8078 andi R24,128
0384 8038 cpi R24,128
0386 D9F7 brne L68
0388 .dbline 229
0388 45DE xcall _twi_decode_status
038A .dbline 231
038A L66:
038A .dbline 226
038A 20900200 lds R2,_twi_busy
038E 2220 tst R2
0390 B1F7 brne L69
0392 .dbline 233
0392 ; Twi_wait_event();
0392 ; twi_decode_status();
0392 ; // Twi_clear_si(); //REMOVE FROM MAIN LOOP, ADDED IN ALL NECESARY CASE (See JSB /RLE)
0392 ; }
0392 ; // Twi_set_stop(); RLE
0392 ; return twi_err;
0392 00910100 lds R16,_twi_err
0396 06C0 xjmp L56
0398 L63:
0398 .dbline 235
0398 ; }
0398 ; Twi_set_stop();
0398 8091BC00 lds R24,188
039C 8061 ori R24,16
039E 8093BC00 sts 188,R24
03A2 .dbline 236
03A2 ; return TWI_NOT_FREE;
03A2 07E0 ldi R16,7
03A4 .dbline -2
03A4 L56:
03A4 0E940000 xcall pop_gset2
03A8 .dbline 0 ; func end
03A8 0895 ret
03AA .dbsym l info 6 pc
03AA .dbsym l nbbytes 4 c
03AA .dbsym r rw 20 c
03AA .dbsym r slave_addr 22 c
03AA .dbend
03AA .dbfunc e twi_send_message_interrupt _twi_send_message_interrupt fc
03AA ; info -> y+2
03AA ; nbbytes -> y+0
03AA ; rw -> R18
03AA ; slave_addr -> R16
.even
03AA _twi_send_message_interrupt::
03AA .dbline -1
03AA .dbline 258
03AA ; }
03AA ;
03AA ; /*****************************************************************************
03AA ; 函数介绍:TWI主机模式,中断方式
03AA ; 输入参数: slave_addr:从机地址
03AA ; rw:=TWI_WRITE发送模式;=TWI_READ接收模式
03AA ; nbbytes:最大字节数
03AA ; *info:数据缓存地址
03AA ; 输出参数:
03AA ; 返回值:twi_err:TWI通讯状态
03AA ; - TWI_TRANSFER_OK 发送完成
03AA ; - TWI_RECEIVE_OK 接收完成
03AA ; - TWI_BUS_ERROR 总线冲突
03AA ; - TWI_HOST_ADR_NACK 从机地址无应答
03AA ; - TWI_HOST_DATA_NACK 从机数据无应答(不存在)
03AA ; - TWI_ARBITRATION_LOST 仲裁失败
03AA ; - TWI_UNKNOWN TWI状态错误 //接受复位
03AA ; - TWI_NOT_FREE TWI通信忙
03AA ; - TWI_OK TWI通信开始
03AA ; *****************************************************************************/
03AA ; unsigned char twi_send_message_interrupt( uchar slave_addr,uchar rw, uchar nbbytes, uchar *info)
03AA ; {
03AA .dbline 259
03AA ; twi_message.address = slave_addr;
03AA 00930300 sts _twi_message,R16
03AE .dbline 260
03AE ; twi_message.rw = rw;
03AE 20930400 sts _twi_message+1,R18
03B2 .dbline 261
03B2 ; twi_message.nbbytes = nbbytes;
03B2 0880 ldd R0,y+0
03B4 00920500 sts _twi_message+2,R0
03B8 .dbline 262
03B8 ; twi_message.buf = info;
03B8 0A80 ldd R0,y+2
03BA 1B80 ldd R1,y+3
03BC 10920700 sts _twi_message+3+1,R1
03C0 00920600 sts _twi_message+3,R0
03C4 L75:
03C4 .dbline 263
03C4 L76:
03C4 .dbline 263
03C4 ; Twi_wait_hw_stop();
03C4 2090BC00 lds R2,188
03C8 3324 clr R3
03CA 24FC sbrc R2,4
03CC FBCF rjmp L75
03CE .dbline 264
03CE ; twi_nb_transmited=0;
03CE 2224 clr R2
03D0 20920000 sts _twi_nb_transmited,R2
03D4 .dbline 265
03D4 ; if (!twi_busy)
03D4 20900200 lds R2,_twi_busy
03D8 2220 tst R2
03DA 99F4 brne L78
03DC .dbline 266
03DC ; {
03DC .dbline 267
03DC ; twi_err = TWI_OK;
03DC 88E0 ldi R24,8
03DE 80930100 sts _twi_err,R24
03E2 .dbline 268
03E2 ; twi_busy =1;
03E2 81E0 ldi R24,1
03E4 80930200 sts _twi_busy,R24
03E8 .dbline 269
03E8 ; Enable_twi_interrupt();
03E8 8091BC00 lds R24,188
03EC 8160 ori R24,1
03EE 8093BC00 sts 188,R24
03F2 .dbline 270
03F2 ; Twi_set_start();
03F2 8091BC00 lds R24,188
03F6 8062 ori R24,32
03F8 8093BC00 sts 188,R24
03FC .dbline 271
03FC ; return twi_err;
03FC 00910100 lds R16,_twi_err
0400 06C0 xjmp L71
0402 L78:
0402 .dbline 273
0402 ; }
0402 ; Twi_set_stop();
0402 8091BC00 lds R24,188
0406 8061 ori R24,16
0408 8093BC00 sts 188,R24
040C .dbline 274
040C ; return TWI_NOT_FREE;
040C 07E0 ldi R16,7
040E .dbline -2
040E L71:
040E .dbline 0 ; func end
040E 0895 ret
0410 .dbsym l info 2 pc
0410 .dbsym l nbbytes 0 c
0410 .dbsym r rw 18 c
0410 .dbsym r slave_addr 16 c
0410 .dbend
.area vector(rom, abs)
.org 140
008C 0C940802 jmp _twi_interrupt
.area text(rom, con, rel)
0410 .dbfile F:\zzz\i2c-master\twi_master_drv.c
0410 .dbfunc e twi_interrupt _twi_interrupt fV
.even
0410 _twi_interrupt::
0410 0E940000 xcall push_lset
0414 .dbline -1
0414 .dbline 287
0414 ; }
0414 ;
0414 ; /*****************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -