⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 twi_1.lis

📁 AVR单片机平台Atmega32+CH375A芯片读写U盘代码
💻 LIS
📖 第 1 页 / 共 5 页
字号:
 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 + -