📄 twi.lis
字号:
026C .dbline 293
026C L96:
026C .dbline 293
026C L97:
026C .dbline 293
026C 26B6 in R2,0x36
026E 27FE sbrs R2,7
0270 FDCF rjmp L96
0272 .dbline 293
0272 .dbline 293
0272 .dbline 294
0272 2A95 dec R18
0274 .dbline 295
0274 A895 wdr
0276 .dbline 296
0276 L94:
0276 .dbline 290
0276 2223 tst R18
0278 89F7 brne L93
027A .dbline 297
027A ; Twi_WaitForComplete();
027A ; length--;
027A ; WDR(); //喂狗;
027A ; }
027A ; }
027A 01C0 xjmp L92
027C L91:
027C .dbline 299
027C ; else
027C ; {
027C .dbline 301
027C ; // 如未回应器件地址,停止发送,返回错误
027C ; retval = TWI_ERROR_NODEV;
027C 41E0 ldi R20,1
027E .dbline 302
027E ; }
027E L92:
027E .dbline 305
027E ;
027E ; // 发送停止条件,保持TWEA以便从接收
027E ; Twi_Stop();
027E 86B7 in R24,0x36
0280 8F70 andi R24,15
0282 806D ori R24,208
0284 86BF out 0x36,R24
0286 L99:
0286 .dbline 306
0286 L100:
0286 .dbline 306
0286 ; while( !(TWCR&(1<<TWSTO)) );
0286 26B6 in R2,0x36
0288 24FE sbrs R2,4
028A FDCF rjmp L99
028C .dbline 308
028C ; // 开Twi_中断
028C ; TWCR|=(1<<TWIE);
028C 86B7 in R24,0x36
028E 8160 ori R24,1
0290 86BF out 0x36,R24
0292 .dbline 309
0292 ; return retval;
0292 042F mov R16,R20
0294 .dbline -2
0294 L84:
0294 0E940000 xcall pop_gset2
0298 .dbline 0 ; func end
0298 0895 ret
029A .dbsym r retval 20 c
029A .dbsym r data 22 pc
029A .dbsym r length 18 c
029A .dbsym r deviceAddr 16 c
029A .dbend
029A .dbfunc e Twi_MasterReceiveNI _Twi_MasterReceiveNI fc
029A ; retval -> R20
029A ; data -> R22,R23
029A ; length -> R18
029A ; deviceAddr -> R16
.even
029A _Twi_MasterReceiveNI::
029A 0E940000 xcall push_gset2
029E 6C81 ldd R22,y+4
02A0 7D81 ldd R23,y+5
02A2 .dbline -1
02A2 .dbline 326
02A2 ; }
02A2 ; /*********************************************************************************************************
02A2 ; ** 函数名称:主模式非中断接收
02A2 ; ** 功能描述:
02A2 ; ** 输 入: deviceAddr:从机地址
02A2 ; ** length:数据长度
02A2 ; ** * data 缓冲区指针
02A2 ; ** 输 出:
02A2 ; ** 全局变量:
02A2 ; ** 调用模块:
02A2 ; ** 说明:
02A2 ; ** 注意:
02A2 ; ** 日 期: 2006年8月29日
02A2 ; ********************************************************************************************************/
02A2 ;
02A2 ; uint8 Twi_MasterReceiveNI(uint8 deviceAddr, uint8 length, uint8 *data)
02A2 ; {
02A2 .dbline 327
02A2 ; uint8 retval = TWI_OK;
02A2 4427 clr R20
02A4 .dbline 328
02A4 ; WDR(); //喂狗;
02A4 A895 wdr
02A6 .dbline 330
02A6 ; // 关Twi_中断
02A6 ; TWCR&=~(1<<TWIE);
02A6 86B7 in R24,0x36
02A8 8E7F andi R24,254
02AA 86BF out 0x36,R24
02AC .dbline 334
02AC ;
02AC ; //发送开始条件
02AC ;
02AC ; Twi_Start();
02AC 86B7 in R24,0x36
02AE 8F70 andi R24,15
02B0 806A ori R24,160
02B2 86BF out 0x36,R24
02B4 .dbline 335
02B4 ; WDR(); //喂狗;
02B4 A895 wdr
02B6 .dbline 336
02B6 L103:
02B6 .dbline 336
02B6 L104:
02B6 .dbline 336
02B6 ; Twi_WaitForComplete();
02B6 26B6 in R2,0x36
02B8 27FE sbrs R2,7
02BA FDCF rjmp L103
02BC .dbline 336
02BC .dbline 336
02BC .dbline 338
02BC ; // 发送器件读地址
02BC ; Twi_SendByte( deviceAddr | 0x01 );
02BC .dbline 338
02BC 802F mov R24,R16
02BE 8160 ori R24,1
02C0 83B9 out 0x3,R24
02C2 .dbline 338
02C2 86B7 in R24,0x36
02C4 8F70 andi R24,15
02C6 8068 ori R24,128
02C8 86BF out 0x36,R24
02CA .dbline 338
02CA .dbline 338
02CA .dbline 339
02CA ; WDR(); //喂狗;
02CA A895 wdr
02CC .dbline 340
02CC L106:
02CC .dbline 340
02CC L107:
02CC .dbline 340
02CC ; Twi_WaitForComplete();
02CC 26B6 in R2,0x36
02CE 27FE sbrs R2,7
02D0 FDCF rjmp L106
02D2 .dbline 340
02D2 .dbline 340
02D2 .dbline 342
02D2 ; // 检查器件是否可用
02D2 ; if( TWSR == TW_MR_SLA_ACK)
02D2 81B1 in R24,0x1
02D4 8034 cpi R24,64
02D6 E9F4 brne L109
02D8 .dbline 343
02D8 ; {
02D8 0DC0 xjmp L112
02DA L111:
02DA .dbline 346
02DA ; // 接收数据并回应
02DA ; while(length > 1)
02DA ; {
02DA .dbline 347
02DA ; Twi_Ack();
02DA 86B7 in R24,0x36
02DC 8F70 andi R24,15
02DE 806C ori R24,192
02E0 86BF out 0x36,R24
02E2 .dbline 348
02E2 L114:
02E2 .dbline 348
02E2 L115:
02E2 .dbline 348
02E2 26B6 in R2,0x36
02E4 27FE sbrs R2,7
02E6 FDCF rjmp L114
02E8 .dbline 348
02E8 .dbline 348
02E8 .dbline 349
02E8 23B0 in R2,0x3
02EA FB01 movw R30,R22
02EC 2192 st Z+,R2
02EE BF01 movw R22,R30
02F0 .dbline 350
02F0 2A95 dec R18
02F2 .dbline 351
02F2 A895 wdr
02F4 .dbline 352
02F4 L112:
02F4 .dbline 345
02F4 81E0 ldi R24,1
02F6 8217 cp R24,R18
02F8 80F3 brlo L111
02FA .dbline 354
02FA ; Twi_WaitForComplete();
02FA ; *data++ = TWDR;
02FA ; length--;
02FA ; WDR(); //喂狗;
02FA ; }
02FA ; // 接收数据无回应 (末位信号)
02FA ; Twi_NoAcK();
02FA 86B7 in R24,0x36
02FC 8F70 andi R24,15
02FE 8068 ori R24,128
0300 86BF out 0x36,R24
0302 .dbline 355
0302 L117:
0302 .dbline 355
0302 L118:
0302 .dbline 355
0302 ; Twi_WaitForComplete();
0302 26B6 in R2,0x36
0304 27FE sbrs R2,7
0306 FDCF rjmp L117
0308 .dbline 355
0308 .dbline 355
0308 .dbline 356
0308 ; *data++ = TWDR;
0308 23B0 in R2,0x3
030A FB01 movw R30,R22
030C 2192 st Z+,R2
030E BF01 movw R22,R30
0310 .dbline 357
0310 ; }
0310 01C0 xjmp L110
0312 L109:
0312 .dbline 359
0312 ; else
0312 ; {
0312 .dbline 361
0312 ; // 如未回应器件地址,停止发送,返回错误
0312 ; retval = TWI_ERROR_NODEV;
0312 41E0 ldi R20,1
0314 .dbline 362
0314 ; }
0314 L110:
0314 .dbline 364
0314 ; // 发送停止条件,保持TWEA以便从接收
0314 ; Twi_Stop();
0314 86B7 in R24,0x36
0316 8F70 andi R24,15
0318 806D ori R24,208
031A 86BF out 0x36,R24
031C .dbline 366
031C ; // 开Twi_中断
031C ; TWCR|=TWIE;
031C 26B6 in R2,0x36
031E 26BE out 0x36,R2
0320 .dbline 367
0320 ; return retval;
0320 042F mov R16,R20
0322 .dbline -2
0322 L102:
0322 0E940000 xcall pop_gset2
0326 .dbline 0 ; func end
0326 0895 ret
0328 .dbsym r retval 20 c
0328 .dbsym r data 22 pc
0328 .dbsym r length 18 c
0328 .dbsym r deviceAddr 16 c
0328 .dbend
0328 .dbfunc e Twi_SlaveReceiveService _Twi_SlaveReceiveService fV
0328 ; i -> R20
.even
0328 _Twi_SlaveReceiveService::
0328 0E940000 xcall push_gset1
032C .dbline -1
032C .dbline 382
032C ; }
032C ; /*********************************************************************************************************
032C ; ** 函数名称:Twi_SlaveReceiveService
032C ; ** 功能描述:此函数在本机被选中为从写入时运行
032C ; ** 输 入: receiveDataLength:接收数据长度
032C ; ** * receiveData:数据缓冲区指针
032C ; ** 输 出:
032C ; ** 全局变量:
032C ; ** 调用模块:
032C ; ** 说明:
032C ; ** 注意:
032C ; ** 日 期: 2006年8月29日
032C ; ********************************************************************************************************/
032C ; void Twi_SlaveReceiveService()
032C ; {
032C .dbline 384
032C ; uint8 i;
032C ; WDR(); //喂狗;
032C A895 wdr
032E .dbline 387
032E ; //此函数在本机被选中为从写入时运行
032E ; // 接收到的数据存入本地缓冲区
032E ; if((Twi_LocalBuffer.status==TWI_DATA_RECEIVE)&&(Twi_ReceiveBuffer.status==TWI_DATA_RECEIVE))
032E 80911900 lds R24,_Twi_LocalBuffer+7
0332 8130 cpi R24,1
0334 D1F4 brne L121
0336 80911000 lds R24,_Twi_ReceiveBuffer+7
033A 8130 cpi R24,1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -