📄 twi.s
字号:
L112:
.dbline 345
ldi R24,1
cp R24,R18
brlo L111
.dbline 354
; Twi_WaitForComplete();
; *data++ = TWDR;
; length--;
; WDR(); //喂狗;
; }
; // 接收数据无回应 (末位信号)
; Twi_NoAcK();
in R24,0x36
andi R24,15
ori R24,128
out 0x36,R24
.dbline 355
L117:
.dbline 355
L118:
.dbline 355
; Twi_WaitForComplete();
in R2,0x36
sbrs R2,7
rjmp L117
.dbline 355
.dbline 355
.dbline 356
; *data++ = TWDR;
in R2,0x3
movw R30,R22
st Z+,R2
movw R22,R30
.dbline 357
; }
xjmp L110
L109:
.dbline 359
; else
; {
.dbline 361
; // 如未回应器件地址,停止发送,返回错误
; retval = TWI_ERROR_NODEV;
ldi R20,1
.dbline 362
; }
L110:
.dbline 364
; // 发送停止条件,保持TWEA以便从接收
; Twi_Stop();
in R24,0x36
andi R24,15
ori R24,208
out 0x36,R24
.dbline 366
; // 开Twi_中断
; TWCR|=TWIE;
in R2,0x36
out 0x36,R2
.dbline 367
; return retval;
mov R16,R20
.dbline -2
L102:
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_SlaveReceiveService _Twi_SlaveReceiveService fV
; i -> R20
.even
_Twi_SlaveReceiveService::
xcall push_gset1
.dbline -1
.dbline 382
; }
; /*********************************************************************************************************
; ** 函数名称:Twi_SlaveReceiveService
; ** 功能描述:此函数在本机被选中为从写入时运行
; ** 输 入: receiveDataLength:接收数据长度
; ** * receiveData:数据缓冲区指针
; ** 输 出:
; ** 全局变量:
; ** 调用模块:
; ** 说明:
; ** 注意:
; ** 日 期: 2006年8月29日
; ********************************************************************************************************/
; void Twi_SlaveReceiveService()
; {
.dbline 384
; uint8 i;
; WDR(); //喂狗;
wdr
.dbline 387
; //此函数在本机被选中为从写入时运行
; // 接收到的数据存入本地缓冲区
; if((Twi_LocalBuffer.status==TWI_DATA_RECEIVE)&&(Twi_ReceiveBuffer.status==TWI_DATA_RECEIVE))
lds R24,_Twi_LocalBuffer+7
cpi R24,1
brne L121
lds R24,_Twi_ReceiveBuffer+7
cpi R24,1
brne L121
.dbline 388
; {
.dbline 389
; for(i=0;!EmptyQueue(&Twi_ReceiveBuffer); i++)
clr R20
xjmp L128
L125:
.dbline 390
.dbline 391
ldi R16,<_Twi_ReceiveBuffer
ldi R17,>_Twi_ReceiveBuffer
xcall _DeQueue
mov R18,R16
ldi R16,<_Twi_LocalBuffer
ldi R17,>_Twi_LocalBuffer
xcall _EnQueue
.dbline 392
L126:
.dbline 389
inc R20
L128:
.dbline 389
lds R2,_Twi_ReceiveBuffer+2
tst R2
brne L125
.dbline 393
clr R2
sts _Twi_ReceiveBuffer+7,R2
.dbline 394
ldi R24,3
sts _Twi_LocalBuffer+7,R24
.dbline 395
L121:
.dbline -2
L120:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbend
.dbfunc e Twi_SlaveTransmitService _Twi_SlaveTransmitService fc
; i -> R20
.even
_Twi_SlaveTransmitService::
xcall push_gset1
.dbline -1
.dbline 409
; {
; EnQueue(&Twi_LocalBuffer, DeQueue(&Twi_ReceiveBuffer));
; }
; Twi_ReceiveBuffer.status=TWI_DATA_FREE;
; Twi_LocalBuffer.status=TWI_DATA_READY;
; }
; }
; /*********************************************************************************************************
; ** 函数名称:Twi_SlaveTransmitService
; ** 功能描述:此函数在本机被选中为从读出时运行
; ** 输 入: transmitDataLengthMax
; ** 输 出:
; ** 全局变量:
; ** 调用模块:
; ** 说明:
; ** 注意:
; ** 日 期: 2006年8月29日
; ********************************************************************************************************/
; uint8 Twi_SlaveTransmitService(void)
; {
.dbline 410
; uint8 i=0;
clr R20
.dbline 411
; WDR(); //喂狗;
wdr
.dbline 416
; //此函数在本机被选中为从读出时运行
; //要发送的数据存入发送缓冲区
;
;
; if ((Twi_LocalBuffer.status==TWI_DATA_SEND)&&Twi_SendBuffer.status==TWI_DATA_FREE)
lds R24,_Twi_LocalBuffer+7
cpi R24,2
brne L133
lds R2,_Twi_SendBuffer+7
tst R2
brne L133
.dbline 417
; {
.dbline 418
; InitQueue(&Twi_SendBuffer); //清除上次发送的信息
ldi R16,<_Twi_SendBuffer
ldi R17,>_Twi_SendBuffer
xcall _InitQueue
.dbline 419
; for(i=0; (Twi_LocalBuffer.count>0)&&(Twi_SendBuffer.errorcode!=QUEUE_OVERFLOW); i++)
xjmp L140
L137:
.dbline 420
.dbline 421
ldi R16,<_Twi_LocalBuffer
ldi R17,>_Twi_LocalBuffer
xcall _DeQueue
mov R18,R16
ldi R16,<_Twi_SendBuffer
ldi R17,>_Twi_SendBuffer
xcall _EnQueue
.dbline 422
L138:
.dbline 419
inc R20
L140:
.dbline 419
clr R2
lds R3,_Twi_LocalBuffer+2
cp R2,R3
brsh L143
lds R24,_Twi_SendBuffer+6
cpi R24,1
brne L137
L143:
.dbline 423
; {
; EnQueue(&Twi_SendBuffer,DeQueue(&Twi_LocalBuffer));
; }
; Twi_SendBuffer.status= TWI_DATA_SEND;
ldi R24,2
sts _Twi_SendBuffer+7,R24
.dbline 424
; Twi_LocalBuffer.status=TWI_DATA_FREE;
clr R2
sts _Twi_LocalBuffer+7,R2
.dbline 425
; }
L133:
.dbline 426
; return i;
mov R16,R20
.dbline -2
L132:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbend
.area vector(rom, abs)
.org 76
jmp _twi_isr
.area text(rom, con, rel)
.dbfile D:\桌面\mp3\TWI\TWI.c
.dbfunc e twi_isr _twi_isr fV
; status -> R20
.even
_twi_isr::
xcall push_lset
xcall push_gset2
.dbline -1
.dbline 441
; }
; /*********************************************************************************************************
; ** 函数名称:
; ** 功能描述:Twi_ (TWI) 中断服务程序
; ** 输 入:
; ** 输 出:
; ** 全局变量:
; ** 调用模块:
; ** 说明:
; ** 注意:
; ** 日 期: 2006年8月29日
; ********************************************************************************************************/
; #pragma interrupt_handler twi_isr: iv_TWI
; void twi_isr(void)
; {
.dbline 444
; //读状态位
; uint8 status;
; status = TWSR & TWSR_STATUS_MASK;
in R20,0x1
andi R20,248
.dbline 445
; switch(status)
mov R22,R20
clr R23
cpi R22,104
ldi R30,0
cpc R23,R30
brne X4
xjmp L168
X4:
ldi R24,104
ldi R25,0
cp R24,R22
cpc R25,R23
brge X5
xjmp L191
X5:
L190:
cpi R22,48
ldi R30,0
cpc R23,R30
brne X6
xjmp L157
X6:
ldi R24,48
ldi R25,0
cp R24,R22
cpc R25,R23
brge X7
xjmp L193
X7:
L192:
cpi R22,16
ldi R30,0
cpc R23,R30
brne X8
xjmp L150
X8:
ldi R24,16
ldi R25,0
cp R24,R22
cpc R25,R23
brlt L195
L194:
cpi R22,0
cpc R22,R23
brne X9
xjmp L189
X9:
X1:
cpi R22,0
ldi R30,0
cpc R23,R30
brge X10
xjmp L147
X10:
L196:
cpi R22,8
ldi R30,0
cpc R23,R30
brne X11
xjmp L150
X11:
xjmp L147
L195:
cpi R22,32
ldi R30,0
cpc R23,R30
brne X12
xjmp L157
X12:
ldi R24,32
ldi R25,0
cp R24,R22
cpc R25,R23
brlt L198
L197:
cpi R22,24
ldi R30,0
cpc R23,R30
brne X13
xjmp L151
X13:
xjmp L147
L198:
cpi R22,40
ldi R30,0
cpc R23,R30
brne X14
xjmp L151
X14:
xjmp L147
L193:
cpi R22,72
ldi R30,0
cpc R23,R30
brne X15
xjmp L157
X15:
ldi R24,72
ldi R25,0
cp R24,R22
cpc R25,R23
brlt L200
L199:
cpi R22,56
ldi R30,0
cpc R23,R30
brne X16
xjmp L158
X16:
cpi R22,56
ldi R30,0
cpc R23,R30
brge X17
xjmp L147
X17:
L201:
cpi R22,64
ldi R30,0
cpc R23,R30
brne X18
xjmp L160
X18:
xjmp L147
L200:
cpi R22,88
ldi R30,0
cpc R23,R30
brne X19
xjmp L156
X19:
ldi R24,88
ldi R25,0
cp R24,R22
cpc R25,R23
brlt L203
L202:
cpi R22,80
ldi R30,0
cpc R23,R30
brne X20
xjmp L159
X20:
xjmp L147
L203:
cpi R22,96
ldi R30,0
cpc R23,R30
brne X21
xjmp L168
X21:
xjmp L147
L191:
cpi R22,160
ldi R30,0
cpc R23,R30
brne X22
xjmp L180
X22:
ldi R24,160
ldi R25,0
cp R24,R22
cpc R25,R23
brge X23
xjmp L205
X23:
L204:
cpi R22,128
ldi R30,0
cpc R23,R30
brne X24
xjmp L174
X24:
ldi R24,128
ldi R25,0
cp R24,R22
cpc R25,R23
brlt L207
L206:
cpi R22,112
ldi R30,0
cpc R23,R30
brne X25
xjmp L168
X25:
cpi R22,112
ldi R30,0
cpc R23,R30
brge X26
xjmp L147
X26:
L208:
cpi R22,120
ldi R30,0
cpc R23,R30
brne X27
xjmp L168
X27:
xjmp L147
L207:
cpi R22,144
ldi R30,0
cpc R23,R30
brne X28
xjmp L174
X28:
ldi R24,144
ldi R25,0
cp R24,R22
cpc R25,R23
brlt L210
L209:
cpi R22,136
ldi R30,0
cpc R23,R30
brne X29
xjmp L179
X29:
xjmp L147
L210:
cpi R22,152
ldi R30,0
cpc R23,R30
brne X30
xjmp L179
X30:
xjmp L147
L205:
cpi R22,184
ldi R30,0
cpc R23,R30
brne X31
xjmp L182
X31:
ldi R24,184
ldi R25,0
cp R24,R22
cpc R25,R23
brlt L212
L211:
cpi R22,168
ldi R30,0
cpc R23,R30
brne X32
xjmp L181
X32:
cpi R22,168
ldi R30,0
cpc R23,R30
brge X33
xjmp L147
X33:
L213:
cpi R22,176
ldi R30,0
cpc R23,R30
brne X34
xjmp L181
X34:
xjmp L147
L212:
cpi R22,200
ldi R30,0
cpc R23,R30
brne X35
xjmp L186
X35:
ldi R24,200
ldi R25,0
cp R24,R22
cpc R25,R23
brlt L215
L214:
cpi R22,192
ldi R30,0
cpc R23,R30
brne X36
xjmp L186
X36:
xjmp L147
L215:
cpi R22,248
ldi R30,0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -