📄 twi.s
字号:
sub R16,R2
.dbline -2
L18:
xcall pop_gset5
.dbline 0 ; func end
ret
.dbsym r result 20 c
.dbsym r i 22 c
.dbsym r data 10 pc
.dbsym r length 12 c
.dbsym r deviceAddr 14 c
.dbend
.dbfunc e Twi_MasterReceive _Twi_MasterReceive fc
; result -> R20
; i -> R22
; data -> R10,R11
; length -> R12
; deviceAddr -> R20
.even
_Twi_MasterReceive::
xcall push_gset4
mov R12,R18
mov R20,R16
ldd R10,y+8
ldd R11,y+9
.dbline -1
.dbline 207
; }
; }
; /*********************************************************************************************************
; ** 函数名称:Twi_MasterReceive
; ** 功能描述:主模式接收
; ** 输 入: deviceAddr:从机地址
; ** length:数据长度
; ** * data 缓冲区指针
; **
; ** 输 出: 返回接收到的字节数
; ** 全局变量:
; ** 调用模块:
; ** 说明:
; ** 注意:
; ** 日 期: 2006年8月29日
; ********************************************************************************************************/
;
; uint8 Twi_MasterReceive(uint8 deviceAddr, uint8 length, uint8* data)
; {
.dbline 209
; uint8 i,result;
; WDR(); //喂狗;
wdr
L52:
.dbline 211
L53:
.dbline 211
; // 等待总线准备完成
; while(Twi_State);
lds R2,_Twi_State
tst R2
brne L52
.dbline 213
; // 设置状态
; Twi_State = TWI_MASTER_RX;
ldi R24,3
sts _Twi_State,R24
.dbline 215
; // 保存数据
; Twi_DeviceAddrRW = (deviceAddr|0x01); // RW 为1 : 读操作
mov R24,R20
ori R24,1
sts _Twi_DeviceAddrRW,R24
.dbline 217
;
; if(Twi_ReceiveBuffer.status==TWI_DATA_FREE)
lds R2,_Twi_ReceiveBuffer+7
tst R2
brne L55
.dbline 218
; {
.dbline 219
; InitQueue(&Twi_ReceiveBuffer); //清空上次发送的信息
ldi R16,<_Twi_ReceiveBuffer
ldi R17,>_Twi_ReceiveBuffer
xcall _InitQueue
.dbline 220
; Twi_ReceiveBuffer.status=TWI_DATA_RECEIVE;
ldi R24,1
sts _Twi_ReceiveBuffer+7,R24
.dbline 221
; Twi_ReceiveBuffer.memo=length;
sts _Twi_ReceiveBuffer+8,R12
.dbline 222
; }
L55:
.dbline 225
;
; // 发送开始条件
; Twi_Start();
in R24,0x36
andi R24,15
ori R24,160
out 0x36,R24
.dbline 226
; WDR(); //喂狗;
wdr
L60:
.dbline 228
L61:
.dbline 228
; //等待数据准备好
; while(Twi_State); //注意有可能引起死循环
lds R2,_Twi_State
tst R2
brne L60
.dbline 229
; WDR(); //喂狗;
wdr
.dbline 230
; i=0;
clr R22
xjmp L64
L63:
.dbline 232
; while(((TwiErrorCode==TW_MR_SLA_NACK)||(TwiErrorCode==TW_MR_ARB_LOST)||(TwiErrorCode==TW_MR_DATA_NACK))&&i<TWI_FAIL_MAX) //器件不响应或总线仲裁失败
; {
.dbline 233
; i++;
inc R22
.dbline 234
; if((TwiErrorCode==TW_MR_DATA_NACK)&&(Twi_ReceiveBuffer.count>=length))
lds R24,_TwiErrorCode
cpi R24,88
brne L66
lds R2,_Twi_ReceiveBuffer+2
cp R2,R12
brlo L66
.dbline 235
; {
.dbline 236
; break;
xjmp L65
L66:
.dbline 239
; }
; //Twi_Stop();
; Delay(255);
ldi R16,255
xcall _Delay
.dbline 240
; Twi_State = TWI_MASTER_RX;
ldi R24,3
sts _Twi_State,R24
.dbline 241
; Twi_Start();
in R24,0x36
andi R24,15
ori R24,160
out 0x36,R24
.dbline 242
; WDR(); //喂狗;
wdr
L69:
.dbline 243
L70:
.dbline 243
lds R2,_Twi_State
tst R2
brne L69
.dbline 244
wdr
.dbline 245
L64:
.dbline 231
lds R24,_TwiErrorCode
cpi R24,72
breq L74
lds R24,_TwiErrorCode
cpi R24,56
breq L74
lds R24,_TwiErrorCode
cpi R24,88
brne L72
L74:
cpi R22,20
brlo L63
L72:
L65:
.dbline 247
; while(Twi_State);
; WDR(); //喂狗;
; }
; // 取数据
; for(result=0; (result<length)&&(Twi_ReceiveBuffer.count>0); result++)
clr R20
xjmp L78
L75:
.dbline 248
ldi R16,<_Twi_ReceiveBuffer
ldi R17,>_Twi_ReceiveBuffer
xcall _DeQueue
movw R30,R10
st Z+,R16
movw R10,R30
L76:
.dbline 247
inc R20
L78:
.dbline 247
cp R20,R12
brsh L80
clr R2
lds R3,_Twi_ReceiveBuffer+2
cp R2,R3
brlo L75
L80:
.dbline 249
; *data++ = DeQueue(&Twi_ReceiveBuffer);
; Twi_ReceiveBuffer.status=TWI_DATA_FREE;
clr R2
sts _Twi_ReceiveBuffer+7,R2
.dbline 250
; if(i>=TWI_FAIL_MAX)
cpi R22,20
brlo L82
.dbline 251
; {
.dbline 252
; return (FALSE);
clr R16
xjmp L51
L82:
.dbline 255
; }
; else
; {
.dbline 256
; return (result); //返回接收到的字节数;
mov R16,R20
.dbline -2
L51:
xcall pop_gset4
.dbline 0 ; func end
ret
.dbsym r result 20 c
.dbsym r i 22 c
.dbsym r data 10 pc
.dbsym r length 12 c
.dbsym r deviceAddr 20 c
.dbend
.dbfunc e Twi_MasterSendNI _Twi_MasterSendNI fc
; retval -> R20
; data -> R22,R23
; length -> R18
; deviceAddr -> R16
.even
_Twi_MasterSendNI::
xcall push_gset2
ldd R22,y+4
ldd R23,y+5
.dbline -1
.dbline 273
; }
; }
; /*********************************************************************************************************
; ** 函数名称:Twi_MasterSendNI
; ** 功能描述:主模式非中断发送
; ** 输 入: deviceAddr:从机地址
; ** length:数据长度
; ** * data 缓冲区指针
; ** 输 出:
; ** 全局变量:
; ** 调用模块:
; ** 说明:
; ** 注意:
; ** 日 期: 2006年8月29日
; ********************************************************************************************************/
; uint8 Twi_MasterSendNI(uint8 deviceAddr, uint8 length, uint8* data)
; {
.dbline 274
; uint8 retval = TWI_OK;
clr R20
.dbline 275
; WDR(); //喂狗;
wdr
.dbline 277
; // 关Twi_中断
; TWCR&=~(1<<TWIE);
in R24,0x36
andi R24,254
out 0x36,R24
.dbline 278
; WDR(); //喂狗;
wdr
.dbline 280
; // 发送开始条件
; Twi_Start();
in R24,0x36
andi R24,15
ori R24,160
out 0x36,R24
.dbline 281
; WDR(); //喂狗;
wdr
.dbline 282
L85:
.dbline 282
L86:
.dbline 282
; Twi_WaitForComplete();
in R2,0x36
sbrs R2,7
rjmp L85
.dbline 282
.dbline 282
.dbline 284
; // 发送器件写地址
; Twi_SendByte( deviceAddr & 0xFE );
.dbline 284
mov R24,R16
andi R24,254
out 0x3,R24
.dbline 284
in R24,0x36
andi R24,15
ori R24,128
out 0x36,R24
.dbline 284
.dbline 284
.dbline 285
L88:
.dbline 285
L89:
.dbline 285
; Twi_WaitForComplete();
in R2,0x36
sbrs R2,7
rjmp L88
.dbline 285
.dbline 285
.dbline 287
; // 检查器件是否可用
; if( TWSR == TW_MT_SLA_ACK)
in R24,0x1
cpi R24,24
brne L91
.dbline 288
; {
xjmp L94
L93:
.dbline 291
; // 发送数据
; while(length)
; {
.dbline 292
; Twi_SendByte( *data++ );
.dbline 292
movw R30,R22
ld R2,Z+
movw R22,R30
out 0x3,R2
.dbline 292
in R24,0x36
andi R24,15
ori R24,128
out 0x36,R24
.dbline 292
.dbline 292
.dbline 293
L96:
.dbline 293
L97:
.dbline 293
in R2,0x36
sbrs R2,7
rjmp L96
.dbline 293
.dbline 293
.dbline 294
dec R18
.dbline 295
wdr
.dbline 296
L94:
.dbline 290
tst R18
brne L93
.dbline 297
; Twi_WaitForComplete();
; length--;
; WDR(); //喂狗;
; }
; }
xjmp L92
L91:
.dbline 299
; else
; {
.dbline 301
; // 如未回应器件地址,停止发送,返回错误
; retval = TWI_ERROR_NODEV;
ldi R20,1
.dbline 302
; }
L92:
.dbline 305
;
; // 发送停止条件,保持TWEA以便从接收
; Twi_Stop();
in R24,0x36
andi R24,15
ori R24,208
out 0x36,R24
L99:
.dbline 306
L100:
.dbline 306
; while( !(TWCR&(1<<TWSTO)) );
in R2,0x36
sbrs R2,4
rjmp L99
.dbline 308
; // 开Twi_中断
; TWCR|=(1<<TWIE);
in R24,0x36
ori R24,1
out 0x36,R24
.dbline 309
; return retval;
mov R16,R20
.dbline -2
L84:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r retval 20 c
.dbsym r data 22 pc
.dbsym r length 18 c
.dbsym r deviceAddr 16 c
.dbend
.dbfunc e Twi_MasterReceiveNI _Twi_MasterReceiveNI fc
; retval -> R20
; data -> R22,R23
; length -> R18
; deviceAddr -> R16
.even
_Twi_MasterReceiveNI::
xcall push_gset2
ldd R22,y+4
ldd R23,y+5
.dbline -1
.dbline 326
; }
; /*********************************************************************************************************
; ** 函数名称:主模式非中断接收
; ** 功能描述:
; ** 输 入: deviceAddr:从机地址
; ** length:数据长度
; ** * data 缓冲区指针
; ** 输 出:
; ** 全局变量:
; ** 调用模块:
; ** 说明:
; ** 注意:
; ** 日 期: 2006年8月29日
; ********************************************************************************************************/
;
; uint8 Twi_MasterReceiveNI(uint8 deviceAddr, uint8 length, uint8 *data)
; {
.dbline 327
; uint8 retval = TWI_OK;
clr R20
.dbline 328
; WDR(); //喂狗;
wdr
.dbline 330
; // 关Twi_中断
; TWCR&=~(1<<TWIE);
in R24,0x36
andi R24,254
out 0x36,R24
.dbline 334
;
; //发送开始条件
;
; Twi_Start();
in R24,0x36
andi R24,15
ori R24,160
out 0x36,R24
.dbline 335
; WDR(); //喂狗;
wdr
.dbline 336
L103:
.dbline 336
L104:
.dbline 336
; Twi_WaitForComplete();
in R2,0x36
sbrs R2,7
rjmp L103
.dbline 336
.dbline 336
.dbline 338
; // 发送器件读地址
; Twi_SendByte( deviceAddr | 0x01 );
.dbline 338
mov R24,R16
ori R24,1
out 0x3,R24
.dbline 338
in R24,0x36
andi R24,15
ori R24,128
out 0x36,R24
.dbline 338
.dbline 338
.dbline 339
; WDR(); //喂狗;
wdr
.dbline 340
L106:
.dbline 340
L107:
.dbline 340
; Twi_WaitForComplete();
in R2,0x36
sbrs R2,7
rjmp L106
.dbline 340
.dbline 340
.dbline 342
; // 检查器件是否可用
; if( TWSR == TW_MR_SLA_ACK)
in R24,0x1
cpi R24,64
brne L109
.dbline 343
; {
xjmp L112
L111:
.dbline 346
; // 接收数据并回应
; while(length > 1)
; {
.dbline 347
; Twi_Ack();
in R24,0x36
andi R24,15
ori R24,192
out 0x36,R24
.dbline 348
L114:
.dbline 348
L115:
.dbline 348
in R2,0x36
sbrs R2,7
rjmp L114
.dbline 348
.dbline 348
.dbline 349
in R2,0x3
movw R30,R22
st Z+,R2
movw R22,R30
.dbline 350
dec R18
.dbline 351
wdr
.dbline 352
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -