📄 twi_1.lis
字号:
0486 8F70 andi R24,15
0488 8068 ori R24,128
048A 86BF out 0x36,R24
048C .dbline 345
048C ; // 设置状态
048C ; I2cState = I2C_IDLE;
048C 2224 clr R2
048E 20921000 sts _I2cState,R2
0492 .dbline 347
0492 ;
0492 ; break;
0492 C8C0 xjmp L55
0494 L64:
0494 .dbline 351
0494 ; case TW_MR_DATA_ACK: // 0x50: 接收到数据,ACK 已返回
0494 ;
0494 ; // 保存接收到的数据位
0494 ; *(I2cReceiveData+I2cReceiveDataIndex) = TWDR;
0494 20900700 lds R2,_I2cReceiveData
0498 30900800 lds R3,_I2cReceiveData+1
049C E0910500 lds R30,_I2cReceiveDataIndex
04A0 F0910600 lds R31,_I2cReceiveDataIndex+1
04A4 E20D add R30,R2
04A6 F31D adc R31,R3
04A8 23B0 in R2,0x3
04AA 2082 std z+0,R2
04AC .dbline 352
04AC ; I2cReceiveDataIndex++;
04AC 80910500 lds R24,_I2cReceiveDataIndex
04B0 90910600 lds R25,_I2cReceiveDataIndex+1
04B4 0196 adiw R24,1
04B6 90930600 sts _I2cReceiveDataIndex+1,R25
04BA 80930500 sts _I2cReceiveDataIndex,R24
04BE L65:
04BE .dbline 356
04BE ; // 检查是否接收完
04BE ; case TW_MR_SLA_ACK: // 0x40: SLA+R 已发送,接收到ACK
04BE ;
04BE ; if(I2cReceiveDataIndex < I2cReceiveDataLength )
04BE 20900300 lds R2,_I2cReceiveDataLength
04C2 30900400 lds R3,_I2cReceiveDataLength+1
04C6 40900500 lds R4,_I2cReceiveDataIndex
04CA 50900600 lds R5,_I2cReceiveDataIndex+1
04CE 4214 cp R4,R2
04D0 5304 cpc R5,R3
04D2 18F4 brsh L66
04D4 .dbline 357
04D4 ; {
04D4 .dbline 358
04D4 ; i2cReceiveByte(TRUE);
04D4 01E0 ldi R16,1
04D6 E7DD xcall _i2cReceiveByte
04D8 .dbline 359
04D8 ; }
04D8 A5C0 xjmp L55
04DA L66:
04DA .dbline 360
04DA ; else if(I2cReceiveDataIndex < 3 && EnFlex) //仅限于数据帧前两个字节是长度的情况
04DA 80910500 lds R24,_I2cReceiveDataIndex
04DE 90910600 lds R25,_I2cReceiveDataIndex+1
04E2 8330 cpi R24,3
04E4 E0E0 ldi R30,0
04E6 9E07 cpc R25,R30
04E8 A8F4 brsh L68
04EA 20900400 lds R2,_EnFlex
04EE 2220 tst R2
04F0 89F0 breq L68
04F2 .dbline 361
04F2 ; {
04F2 .dbline 362
04F2 ; if(I2cReceiveDataIndex == 2)
04F2 8230 cpi R24,2
04F4 E0E0 ldi R30,0
04F6 9E07 cpc R25,R30
04F8 51F4 brne L70
04FA .dbline 363
04FA ; {
04FA .dbline 364
04FA ; I2cReceiveDataLength = *((unsigned int*)I2cReceiveData);
04FA E0910700 lds R30,_I2cReceiveData
04FE F0910800 lds R31,_I2cReceiveData+1
0502 2080 ldd R2,z+0
0504 3180 ldd R3,z+1
0506 30920400 sts _I2cReceiveDataLength+1,R3
050A 20920300 sts _I2cReceiveDataLength,R2
050E .dbline 365
050E ; }
050E L70:
050E .dbline 367
050E ; // 数据位将接收 , 回复 ACK (传送更多字节)
050E ; i2cReceiveByte(TRUE);
050E 01E0 ldi R16,1
0510 CADD xcall _i2cReceiveByte
0512 .dbline 368
0512 ; }
0512 88C0 xjmp L55
0514 L68:
0514 .dbline 370
0514 ; else
0514 ; {
0514 .dbline 372
0514 ; // 数据位将接收 , 回复 NACK (传送最后字节)
0514 ; i2cReceiveByte(FALSE);
0514 0027 clr R16
0516 C7DD xcall _i2cReceiveByte
0518 .dbline 373
0518 ; }
0518 .dbline 374
0518 ; break;
0518 85C0 xjmp L55
051A L72:
051A .dbline 384
051A ;
051A ; // 从接收状态码
051A ; case TW_SR_SLA_ACK: // 0x60: 自己的SLA+W 已经被接收,ACK 已返回
051A ; case TW_SR_ARB_LOST_SLA_ACK:// 0x68: SLA+R/W 作为主机的仲裁失败;自己的SLA+W 已经被接收,ACK 已返回
051A ; case TW_SR_GCALL_ACK: // 0x70: 接收到广播地址,ACK 已返回
051A ; case TW_SR_ARB_LOST_GCALL_ACK: // 0x78: SLA+R/W 作为主机的仲裁失败;接收到广播地址,ACK 已返回
051A ;
051A ; // 被选中为从写入 (数据将从主机接收)
051A ; // 设置状态
051A ; I2cState = I2C_SLAVE_RX;
051A 85E0 ldi R24,5
051C 80931000 sts _I2cState,R24
0520 .dbline 386
0520 ; // 缓冲准备
0520 ; I2cReceiveDataIndex = 0;
0520 2224 clr R2
0522 3324 clr R3
0524 30920600 sts _I2cReceiveDataIndex+1,R3
0528 20920500 sts _I2cReceiveDataIndex,R2
052C .dbline 388
052C ; // 接收数据,回应 ACK
052C ; TWCR=TWCR&TWCR_CMD_MASK|(1<<TWINT)|(1<<TWEA);
052C 86B7 in R24,0x36
052E 8F70 andi R24,15
0530 806C ori R24,192
0532 86BF out 0x36,R24
0534 .dbline 389
0534 ; break;
0534 77C0 xjmp L55
0536 L73:
0536 .dbline 394
0536 ; case TW_SR_DATA_ACK: // 0x80: 以前以自己的 SLA+W 被寻址;数据已经被接收,ACK 已返回
0536 ; case TW_SR_GCALL_DATA_ACK: // 0x90: 以前以广播方式被寻址;数据已经被接收,ACK 已返回
0536 ;
0536 ;
0536 ; *(I2cReceiveData+I2cReceiveDataIndex) = TWDR;
0536 20900700 lds R2,_I2cReceiveData
053A 30900800 lds R3,_I2cReceiveData+1
053E E0910500 lds R30,_I2cReceiveDataIndex
0542 F0910600 lds R31,_I2cReceiveDataIndex+1
0546 E20D add R30,R2
0548 F31D adc R31,R3
054A 23B0 in R2,0x3
054C 2082 std z+0,R2
054E .dbline 395
054E ; I2cReceiveDataIndex++;
054E 80910500 lds R24,_I2cReceiveDataIndex
0552 90910600 lds R25,_I2cReceiveDataIndex+1
0556 0196 adiw R24,1
0558 90930600 sts _I2cReceiveDataIndex+1,R25
055C 80930500 sts _I2cReceiveDataIndex,R24
0560 .dbline 397
0560 ; //检查接收缓冲区状态
0560 ; if(I2cReceiveDataIndex < SR_DATA_LENGTH_MAX)
0560 8530 cpi R24,5
0562 E2E0 ldi R30,2
0564 9E07 cpc R25,R30
0566 18F4 brsh L74
0568 .dbline 398
0568 ; {
0568 .dbline 400
0568 ; // 接收数据,回应 ACK
0568 ; i2cReceiveByte(TRUE);
0568 01E0 ldi R16,1
056A 9DDD xcall _i2cReceiveByte
056C .dbline 401
056C ; }
056C 5BC0 xjmp L55
056E L74:
056E .dbline 403
056E ; else
056E ; {
056E .dbline 405
056E ; // 接收数据,回应 NACK
056E ; i2cReceiveByte(FALSE);
056E 0027 clr R16
0570 9ADD xcall _i2cReceiveByte
0572 .dbline 406
0572 ; }
0572 .dbline 407
0572 ; break;
0572 58C0 xjmp L55
0574 L76:
0574 .dbline 412
0574 ; case TW_SR_DATA_NACK: // 0x88: 以前以自己的 SLA+W 被寻址;数据已经被接收,NOT ACK 已返回
0574 ; case TW_SR_GCALL_DATA_NACK: // 0x98: 以前以广播方式被寻址;数据已经被接收,NOT ACK 已返回
0574 ;
0574 ; // 接收数据,回应 NACK
0574 ; i2cReceiveByte(FALSE);
0574 0027 clr R16
0576 97DD xcall _i2cReceiveByte
0578 .dbline 413
0578 ; break;
0578 55C0 xjmp L55
057A L77:
057A .dbline 415
057A ; case TW_SR_STOP: // 0xA0: 在以从机工作时接收到STOP或重复START
057A ; TWCR=TWCR&TWCR_CMD_MASK|(1<<TWINT)|(1<<TWEA);
057A 86B7 in R24,0x36
057C 8F70 andi R24,15
057E 806C ori R24,192
0580 86BF out 0x36,R24
0582 .dbline 417
0582 ; // 设置状态
0582 ; I2cState = I2C_IDLE;
0582 2224 clr R2
0584 20921000 sts _I2cState,R2
0588 .dbline 418
0588 ; SET_REC_COM;
0588 80910200 lds R24,_I2cComStatus
058C 8068 ori R24,128
058E 80930200 sts _I2cComStatus,R24
0592 .dbline 419
0592 ; break;
0592 48C0 xjmp L55
0594 L78:
0594 .dbline 427
0594 ;
0594 ; // 从发送
0594 ; case TW_ST_SLA_ACK: // 0xA8: 自己的SLA+R 已经被接收,ACK 已返回
0594 ; case TW_ST_ARB_LOST_SLA_ACK:// 0xB0: SLA+R/W 作为主机的仲裁失败;自己的SLA+R 已经被接收,ACK 已返回
0594 ;
0594 ; // 被选中为从读出 (数据将从传回主机)
0594 ; // 设置状态
0594 ; I2cState = I2C_SLAVE_TX;
0594 84E0 ldi R24,4
0596 80931000 sts _I2cState,R24
059A .dbline 429
059A ; // 数据请求
059A ; I2cSendDataLength = *SlaveSendLength;
059A E0910000 lds R30,_SlaveSendLength
059E F0910100 lds R31,_SlaveSendLength+1
05A2 2080 ldd R2,z+0
05A4 3180 ldd R3,z+1
05A6 30920A00 sts _I2cSendDataLength+1,R3
05AA 20920900 sts _I2cSendDataLength,R2
05AE .dbline 430
05AE ; I2cSendDataIndex = 0;
05AE 2224 clr R2
05B0 3324 clr R3
05B2 30920C00 sts _I2cSendDataIndex+1,R3
05B6 20920B00 sts _I2cSendDataIndex,R2
05BA L79:
05BA .dbline 435
05BA ; //
05BA ; case TW_ST_DATA_ACK: // 0xB8: TWDR 里数据已经发送,接收到ACK
05BA ;
05BA ; // 发送数据位
05BA ; TWDR = *(I2cSendData+I2cSendDataIndex);
05BA 20900D00 lds R2,_I2cSendData
05BE 30900E00 lds R3,_I2cSendData+1
05C2 E0910B00 lds R30,_I2cSendDataIndex
05C6 F0910C00 lds R31,_I2cSendDataIndex+1
05CA E20D add R30,R2
05CC F31D adc R31,R3
05CE 2080 ldd R2,z+0
05D0 23B8 out 0x3,R2
05D2 .dbline 436
05D2 ; I2cSendDataIndex++;
05D2 80910B00 lds R24,_I2cSendDataIndex
05D6 90910C00 lds R25,_I2cSendDataIndex+1
05DA 0196 adiw R24,1
05DC 90930C00 sts _I2cSendDataIndex+1,R25
05E0 80930B00 sts _I2cSendDataIndex,R24
05E4 .dbline 437
05E4 ; if(I2cSendDataIndex < I2cSendDataLength)
05E4 20900900 lds R2,_I2cSendDataLength
05E8 30900A00 lds R3,_I2cSendDataLength+1
05EC 8215 cp R24,R2
05EE 9305 cpc R25,R3
05F0 28F4 brsh L80
05F2 .dbline 439
05F2 ; // 回应 ACK
05F2 ; TWCR=TWCR&TWCR_CMD_MASK|(1<<TWINT)|(1<<TWEA);
05F2 86B7 in R24,0x36
05F4 8F70 andi R24,15
05F6 806C ori R24,192
05F8 86BF out 0x36,R24
05FA 14C0 xjmp L55
05FC L80:
05FC .dbline 442
05FC ; else
05FC ; // 回应 NACK
05FC ; TWCR=TWCR&TWCR_CMD_MASK|(1<<TWINT);
05FC 86B7 in R24,0x36
05FE 8F70 andi R24,15
0600 8068 ori R24,128
0602 86BF out 0x36,R24
0604 .dbline 443
0604 ; break;
0604 0FC0 xjmp L55
0606 L82:
0606 .dbline 449
0606 ; case TW_ST_DATA_NACK: // 0xC0: TWDR 里数据已经发送接收到NOT ACK
0606 ; case TW_ST_LAST_DATA: // 0xC8: TWDR 的一字节数据已经发送(TWAE = “0”);接收到ACK
0606 ;
0606 ; // 全部完成
0606 ; // 从方式开放
0606 ; TWCR=TWCR&TWCR_CMD_MASK|(1<<TWINT)|(1<<TWEA);
0606 86B7 in R24,0x36
0608 8F70 andi R24,15
060A 806C ori R24,192
060C 86BF out 0x36,R24
060E .dbline 451
060E ; // 设置状态
060E ; I2cState = I2C_IDLE;
060E 2224 clr R2
0610 20921000 sts _I2cState,R2
0614 .dbline 452
0614 ; break;
06
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -