📄 twi.lis
字号:
014E ; // 等待总线准备完成
014E ; while(Twi_State);
014E 20901500 lds R2,_Twi_State
0152 2220 tst R2
0154 E1F7 brne L52
0156 .dbline 213
0156 ; // 设置状态
0156 ; Twi_State = TWI_MASTER_RX;
0156 83E0 ldi R24,3
0158 80931500 sts _Twi_State,R24
015C .dbline 215
015C ; // 保存数据
015C ; Twi_DeviceAddrRW = (deviceAddr|0x01); // RW 为1 : 读操作
015C 842F mov R24,R20
015E 8160 ori R24,1
0160 80931400 sts _Twi_DeviceAddrRW,R24
0164 .dbline 217
0164 ;
0164 ; if(Twi_ReceiveBuffer.status==TWI_DATA_FREE)
0164 20901000 lds R2,_Twi_ReceiveBuffer+7
0168 2220 tst R2
016A 49F4 brne L55
016C .dbline 218
016C ; {
016C .dbline 219
016C ; InitQueue(&Twi_ReceiveBuffer); //清空上次发送的信息
016C 00E0 ldi R16,<_Twi_ReceiveBuffer
016E 10E0 ldi R17,>_Twi_ReceiveBuffer
0170 0E940000 xcall _InitQueue
0174 .dbline 220
0174 ; Twi_ReceiveBuffer.status=TWI_DATA_RECEIVE;
0174 81E0 ldi R24,1
0176 80931000 sts _Twi_ReceiveBuffer+7,R24
017A .dbline 221
017A ; Twi_ReceiveBuffer.memo=length;
017A C0921100 sts _Twi_ReceiveBuffer+8,R12
017E .dbline 222
017E ; }
017E L55:
017E .dbline 225
017E ;
017E ; // 发送开始条件
017E ; Twi_Start();
017E 86B7 in R24,0x36
0180 8F70 andi R24,15
0182 806A ori R24,160
0184 86BF out 0x36,R24
0186 .dbline 226
0186 ; WDR(); //喂狗;
0186 A895 wdr
0188 L60:
0188 .dbline 228
0188 L61:
0188 .dbline 228
0188 ; //等待数据准备好
0188 ; while(Twi_State); //注意有可能引起死循环
0188 20901500 lds R2,_Twi_State
018C 2220 tst R2
018E E1F7 brne L60
0190 .dbline 229
0190 ; WDR(); //喂狗;
0190 A895 wdr
0192 .dbline 230
0192 ; i=0;
0192 6627 clr R22
0194 19C0 xjmp L64
0196 L63:
0196 .dbline 232
0196 ; while(((TwiErrorCode==TW_MR_SLA_NACK)||(TwiErrorCode==TW_MR_ARB_LOST)||(TwiErrorCode==TW_MR_DATA_NACK))&&i<TWI_FAIL_MAX) //器件不响应或总线仲裁失败
0196 ; {
0196 .dbline 233
0196 ; i++;
0196 6395 inc R22
0198 .dbline 234
0198 ; if((TwiErrorCode==TW_MR_DATA_NACK)&&(Twi_ReceiveBuffer.count>=length))
0198 80910400 lds R24,_TwiErrorCode
019C 8835 cpi R24,88
019E 29F4 brne L66
01A0 20900B00 lds R2,_Twi_ReceiveBuffer+2
01A4 2C14 cp R2,R12
01A6 08F0 brlo L66
01A8 .dbline 235
01A8 ; {
01A8 .dbline 236
01A8 ; break;
01A8 1DC0 xjmp L65
01AA L66:
01AA .dbline 239
01AA ; }
01AA ; //Twi_Stop();
01AA ; Delay(255);
01AA 0FEF ldi R16,255
01AC 29DF xcall _Delay
01AE .dbline 240
01AE ; Twi_State = TWI_MASTER_RX;
01AE 83E0 ldi R24,3
01B0 80931500 sts _Twi_State,R24
01B4 .dbline 241
01B4 ; Twi_Start();
01B4 86B7 in R24,0x36
01B6 8F70 andi R24,15
01B8 806A ori R24,160
01BA 86BF out 0x36,R24
01BC .dbline 242
01BC ; WDR(); //喂狗;
01BC A895 wdr
01BE L69:
01BE .dbline 243
01BE L70:
01BE .dbline 243
01BE 20901500 lds R2,_Twi_State
01C2 2220 tst R2
01C4 E1F7 brne L69
01C6 .dbline 244
01C6 A895 wdr
01C8 .dbline 245
01C8 L64:
01C8 .dbline 231
01C8 80910400 lds R24,_TwiErrorCode
01CC 8834 cpi R24,72
01CE 41F0 breq L74
01D0 80910400 lds R24,_TwiErrorCode
01D4 8833 cpi R24,56
01D6 21F0 breq L74
01D8 80910400 lds R24,_TwiErrorCode
01DC 8835 cpi R24,88
01DE 11F4 brne L72
01E0 L74:
01E0 6431 cpi R22,20
01E2 C8F2 brlo L63
01E4 L72:
01E4 L65:
01E4 .dbline 247
01E4 ; while(Twi_State);
01E4 ; WDR(); //喂狗;
01E4 ; }
01E4 ; // 取数据
01E4 ; for(result=0; (result<length)&&(Twi_ReceiveBuffer.count>0); result++)
01E4 4427 clr R20
01E6 08C0 xjmp L78
01E8 L75:
01E8 .dbline 248
01E8 00E0 ldi R16,<_Twi_ReceiveBuffer
01EA 10E0 ldi R17,>_Twi_ReceiveBuffer
01EC 0E940000 xcall _DeQueue
01F0 F501 movw R30,R10
01F2 0193 st Z+,R16
01F4 5F01 movw R10,R30
01F6 L76:
01F6 .dbline 247
01F6 4395 inc R20
01F8 L78:
01F8 .dbline 247
01F8 4C15 cp R20,R12
01FA 28F4 brsh L80
01FC 2224 clr R2
01FE 30900B00 lds R3,_Twi_ReceiveBuffer+2
0202 2314 cp R2,R3
0204 88F3 brlo L75
0206 L80:
0206 .dbline 249
0206 ; *data++ = DeQueue(&Twi_ReceiveBuffer);
0206 ; Twi_ReceiveBuffer.status=TWI_DATA_FREE;
0206 2224 clr R2
0208 20921000 sts _Twi_ReceiveBuffer+7,R2
020C .dbline 250
020C ; if(i>=TWI_FAIL_MAX)
020C 6431 cpi R22,20
020E 10F0 brlo L82
0210 .dbline 251
0210 ; {
0210 .dbline 252
0210 ; return (FALSE);
0210 0027 clr R16
0212 01C0 xjmp L51
0214 L82:
0214 .dbline 255
0214 ; }
0214 ; else
0214 ; {
0214 .dbline 256
0214 ; return (result); //返回接收到的字节数;
0214 042F mov R16,R20
0216 .dbline -2
0216 L51:
0216 0E940000 xcall pop_gset4
021A .dbline 0 ; func end
021A 0895 ret
021C .dbsym r result 20 c
021C .dbsym r i 22 c
021C .dbsym r data 10 pc
021C .dbsym r length 12 c
021C .dbsym r deviceAddr 20 c
021C .dbend
021C .dbfunc e Twi_MasterSendNI _Twi_MasterSendNI fc
021C ; retval -> R20
021C ; data -> R22,R23
021C ; length -> R18
021C ; deviceAddr -> R16
.even
021C _Twi_MasterSendNI::
021C 0E940000 xcall push_gset2
0220 6C81 ldd R22,y+4
0222 7D81 ldd R23,y+5
0224 .dbline -1
0224 .dbline 273
0224 ; }
0224 ; }
0224 ; /*********************************************************************************************************
0224 ; ** 函数名称:Twi_MasterSendNI
0224 ; ** 功能描述:主模式非中断发送
0224 ; ** 输 入: deviceAddr:从机地址
0224 ; ** length:数据长度
0224 ; ** * data 缓冲区指针
0224 ; ** 输 出:
0224 ; ** 全局变量:
0224 ; ** 调用模块:
0224 ; ** 说明:
0224 ; ** 注意:
0224 ; ** 日 期: 2006年8月29日
0224 ; ********************************************************************************************************/
0224 ; uint8 Twi_MasterSendNI(uint8 deviceAddr, uint8 length, uint8* data)
0224 ; {
0224 .dbline 274
0224 ; uint8 retval = TWI_OK;
0224 4427 clr R20
0226 .dbline 275
0226 ; WDR(); //喂狗;
0226 A895 wdr
0228 .dbline 277
0228 ; // 关Twi_中断
0228 ; TWCR&=~(1<<TWIE);
0228 86B7 in R24,0x36
022A 8E7F andi R24,254
022C 86BF out 0x36,R24
022E .dbline 278
022E ; WDR(); //喂狗;
022E A895 wdr
0230 .dbline 280
0230 ; // 发送开始条件
0230 ; Twi_Start();
0230 86B7 in R24,0x36
0232 8F70 andi R24,15
0234 806A ori R24,160
0236 86BF out 0x36,R24
0238 .dbline 281
0238 ; WDR(); //喂狗;
0238 A895 wdr
023A .dbline 282
023A L85:
023A .dbline 282
023A L86:
023A .dbline 282
023A ; Twi_WaitForComplete();
023A 26B6 in R2,0x36
023C 27FE sbrs R2,7
023E FDCF rjmp L85
0240 .dbline 282
0240 .dbline 282
0240 .dbline 284
0240 ; // 发送器件写地址
0240 ; Twi_SendByte( deviceAddr & 0xFE );
0240 .dbline 284
0240 802F mov R24,R16
0242 8E7F andi R24,254
0244 83B9 out 0x3,R24
0246 .dbline 284
0246 86B7 in R24,0x36
0248 8F70 andi R24,15
024A 8068 ori R24,128
024C 86BF out 0x36,R24
024E .dbline 284
024E .dbline 284
024E .dbline 285
024E L88:
024E .dbline 285
024E L89:
024E .dbline 285
024E ; Twi_WaitForComplete();
024E 26B6 in R2,0x36
0250 27FE sbrs R2,7
0252 FDCF rjmp L88
0254 .dbline 285
0254 .dbline 285
0254 .dbline 287
0254 ; // 检查器件是否可用
0254 ; if( TWSR == TW_MT_SLA_ACK)
0254 81B1 in R24,0x1
0256 8831 cpi R24,24
0258 89F4 brne L91
025A .dbline 288
025A ; {
025A 0DC0 xjmp L94
025C L93:
025C .dbline 291
025C ; // 发送数据
025C ; while(length)
025C ; {
025C .dbline 292
025C ; Twi_SendByte( *data++ );
025C .dbline 292
025C FB01 movw R30,R22
025E 2190 ld R2,Z+
0260 BF01 movw R22,R30
0262 23B8 out 0x3,R2
0264 .dbline 292
0264 86B7 in R24,0x36
0266 8F70 andi R24,15
0268 8068 ori R24,128
026A 86BF out 0x36,R24
026C .dbline 292
026C .dbline 292
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -