📄 mp3.lst
字号:
0AA0 918001EB LDS R24,TwiErrorCode
0AA2 3380 CPI R24,0x30
0AA3 F429 BNE 0x0AA9
0AA4 902000C1 LDS R2,Twi_SendBuffer+2
0AA6 2022 TST R2
0AA7 F409 BNE 0x0AA9
(0171) {
(0172) break;
0AA8 C01D RJMP 0x0AC6
(0173) }
(0174) Delay(255);
0AA9 EF0F LDI R16,0xFF
0AAA DF89 RCALL _Delay
(0175) Twi_State = TWI_MASTER_TX;
0AAB E082 LDI R24,2
0AAC 938001FC STS Twi_State,R24
(0176) Twi_Start();
0AAE B786 IN R24,0x36
0AAF 708F ANDI R24,0xF
0AB0 6A80 ORI R24,0xA0
0AB1 BF86 OUT 0x36,R24
(0177) WDR(); //喂狗;
0AB2 95A8 WDR
(0178) while(Twi_State);
0AB3 902001FC LDS R2,Twi_State
0AB5 2022 TST R2
0AB6 F7E1 BNE 0x0AB3
(0179) WDR(); //喂狗;
0AB7 95A8 WDR
0AB8 918001EB LDS R24,TwiErrorCode
0ABA 3280 CPI R24,0x20
0ABB F041 BEQ 0x0AC4
0ABC 918001EB LDS R24,TwiErrorCode
0ABE 3388 CPI R24,0x38
0ABF F021 BEQ 0x0AC4
0AC0 918001EB LDS R24,TwiErrorCode
0AC2 3380 CPI R24,0x30
0AC3 F411 BNE 0x0AC6
0AC4 3164 CPI R22,0x14
0AC5 F2C8 BCS 0x0A9F
(0180) }
(0181) Twi_SendBuffer.status=TWI_DATA_FREE;
0AC6 2422 CLR R2
0AC7 922000C6 STS 0xC6,R2
(0182) if(i>=TWI_FAIL_MAX)
0AC9 3164 CPI R22,0x14
0ACA F010 BCS 0x0ACD
(0183) {
(0184) return (FALSE);
0ACB 2700 CLR R16
0ACC C004 RJMP 0x0AD1
(0185) }
(0186) else
(0187) {
(0188) return (result-Twi_SendBuffer.count);
0ACD 902000C1 LDS R2,Twi_SendBuffer+2
0ACF 2F04 MOV R16,R20
0AD0 1902 SUB R16,R2
0AD1 940E1918 CALL pop_gset5
0AD3 9508 RET
_Twi_MasterReceive:
result --> R20
i --> R22
data --> R10
length --> R12
deviceAddr --> R20
0AD4 940E191D CALL push_gset4
0AD6 2EC2 MOV R12,R18
0AD7 2F40 MOV R20,R16
0AD8 84A8 LDD R10,Y+8
0AD9 84B9 LDD R11,Y+9
(0189) }
(0190) }
(0191) /*********************************************************************************************************
(0192) ** 函数名称:Twi_MasterReceive
(0193) ** 功能描述:主模式接收
(0194) ** 输 入: deviceAddr:从机地址
(0195) ** length:数据长度
(0196) ** * data 缓冲区指针
(0197) **
(0198) ** 输 出: 返回接收到的字节数
(0199) ** 全局变量:
(0200) ** 调用模块:
(0201) ** 说明:
(0202) ** 注意:
(0203) ** 日 期: 2006年8月29日
(0204) ********************************************************************************************************/
(0205)
(0206) uint8 Twi_MasterReceive(uint8 deviceAddr, uint8 length, uint8* data)
(0207) {
(0208) uint8 i,result;
(0209) WDR(); //喂狗;
0ADA 95A8 WDR
(0210) // 等待总线准备完成
(0211) while(Twi_State);
0ADB 902001FC LDS R2,Twi_State
0ADD 2022 TST R2
0ADE F7E1 BNE 0x0ADB
(0212) // 设置状态
(0213) Twi_State = TWI_MASTER_RX;
0ADF E083 LDI R24,3
0AE0 938001FC STS Twi_State,R24
(0214) // 保存数据
(0215) Twi_DeviceAddrRW = (deviceAddr|0x01); // RW 为1 : 读操作
0AE2 2F84 MOV R24,R20
0AE3 6081 ORI R24,1
0AE4 938001FB STS Twi_DeviceAddrRW,R24
(0216)
(0217) if(Twi_ReceiveBuffer.status==TWI_DATA_FREE)
0AE6 902000CF LDS R2,0xCF
0AE8 2022 TST R2
0AE9 F449 BNE 0x0AF3
(0218) {
(0219) InitQueue(&Twi_ReceiveBuffer); //清空上次发送的信息
0AEA EC08 LDI R16,0xC8
0AEB E010 LDI R17,0
0AEC 940E08FE CALL _InitQueue
(0220) Twi_ReceiveBuffer.status=TWI_DATA_RECEIVE;
0AEE E081 LDI R24,1
0AEF 938000CF STS 0xCF,R24
(0221) Twi_ReceiveBuffer.memo=length;
0AF1 92C000D0 STS 0xD0,R12
(0222) }
(0223)
(0224) // 发送开始条件
(0225) Twi_Start();
0AF3 B786 IN R24,0x36
0AF4 708F ANDI R24,0xF
0AF5 6A80 ORI R24,0xA0
0AF6 BF86 OUT 0x36,R24
(0226) WDR(); //喂狗;
0AF7 95A8 WDR
(0227) //等待数据准备好
(0228) while(Twi_State); //注意有可能引起死循环
0AF8 902001FC LDS R2,Twi_State
0AFA 2022 TST R2
0AFB F7E1 BNE 0x0AF8
(0229) WDR(); //喂狗;
0AFC 95A8 WDR
(0230) i=0;
0AFD 2766 CLR R22
0AFE C019 RJMP 0x0B18
(0231) while(((TwiErrorCode==TW_MR_SLA_NACK)||(TwiErrorCode==TW_MR_ARB_LOST)||(TwiErrorCode==TW_MR_DATA_NACK))&&i<TWI_FAIL_MAX) //器件不响应或总线仲裁失败
(0232) {
(0233) i++;
0AFF 9563 INC R22
(0234) if((TwiErrorCode==TW_MR_DATA_NACK)&&(Twi_ReceiveBuffer.count>=length))
0B00 918001EB LDS R24,TwiErrorCode
0B02 3588 CPI R24,0x58
0B03 F429 BNE 0x0B09
0B04 902000CA LDS R2,Twi_ReceiveBuffer+2
0B06 142C CP R2,R12
0B07 F008 BCS 0x0B09
(0235) {
(0236) break;
0B08 C01D RJMP 0x0B26
(0237) }
(0238) //Twi_Stop();
(0239) Delay(255);
0B09 EF0F LDI R16,0xFF
0B0A DF29 RCALL _Delay
(0240) Twi_State = TWI_MASTER_RX;
0B0B E083 LDI R24,3
0B0C 938001FC STS Twi_State,R24
(0241) Twi_Start();
0B0E B786 IN R24,0x36
0B0F 708F ANDI R24,0xF
0B10 6A80 ORI R24,0xA0
0B11 BF86 OUT 0x36,R24
(0242) WDR(); //喂狗;
0B12 95A8 WDR
(0243) while(Twi_State);
0B13 902001FC LDS R2,Twi_State
0B15 2022 TST R2
0B16 F7E1 BNE 0x0B13
(0244) WDR(); //喂狗;
0B17 95A8 WDR
0B18 918001EB LDS R24,TwiErrorCode
0B1A 3488 CPI R24,0x48
0B1B F041 BEQ 0x0B24
0B1C 918001EB LDS R24,TwiErrorCode
0B1E 3388 CPI R24,0x38
0B1F F021 BEQ 0x0B24
0B20 918001EB LDS R24,TwiErrorCode
0B22 3588 CPI R24,0x58
0B23 F411 BNE 0x0B26
0B24 3164 CPI R22,0x14
0B25 F2C8 BCS 0x0AFF
(0245) }
(0246) // 取数据
(0247) for(result=0; (result<length)&&(Twi_ReceiveBuffer.count>0); result++)
0B26 2744 CLR R20
0B27 C008 RJMP 0x0B30
(0248) *data++ = DeQueue(&Twi_ReceiveBuffer);
0B28 EC08 LDI R16,0xC8
0B29 E010 LDI R17,0
0B2A 940E093E CALL _DeQueue
0B2C 01F5 MOVW R30,R10
0B2D 9301 ST R16,Z+
0B2E 015F MOVW R10,R30
0B2F 9543 INC R20
0B30 154C CP R20,R12
0B31 F428 BCC 0x0B37
0B32 2422 CLR R2
0B33 903000CA LDS R3,Twi_ReceiveBuffer+2
0B35 1423 CP R2,R3
0B36 F388 BCS 0x0B28
(0249) Twi_ReceiveBuffer.status=TWI_DATA_FREE;
0B37 2422 CLR R2
0B38 922000CF STS 0xCF,R2
(0250) if(i>=TWI_FAIL_MAX)
0B3A 3164 CPI R22,0x14
0B3B F010 BCS 0x0B3E
(0251) {
(0252) return (FALSE);
0B3C 2700 CLR R16
0B3D C001 RJMP 0x0B3F
(0253) }
(0254) else
(0255) {
(0256) return (result); //返回接收到的字节数;
0B3E 2F04 MOV R16,R20
0B3F 940E1915 CALL pop_gset4
0B41 9508 RET
_Twi_MasterSendNI:
retval --> R20
data --> R22
length --> R18
deviceAddr --> R16
0B42 940E1921 CALL push_gset2
0B44 816C LDD R22,Y+4
0B45 817D LDD R23,Y+5
(0257) }
(0258) }
(0259) /*********************************************************************************************************
(0260) ** 函数名称:Twi_MasterSendNI
(0261) ** 功能描述:主模式非中断发送
(0262) ** 输 入: deviceAddr:从机地址
(0263) ** length:数据长度
(0264) ** * data 缓冲区指针
(0265) ** 输 出:
(0266) ** 全局变量:
(0267) ** 调用模块:
(0268) ** 说明:
(0269) ** 注意:
(0270) ** 日 期: 2006年8月29日
(0271) ********************************************************************************************************/
(0272) uint8 Twi_MasterSendNI(uint8 deviceAddr, uint8 length, uint8* data)
(0273) {
(0274) uint8 retval = TWI_OK;
0B46 2744 CLR R20
(0275) WDR(); //喂狗;
0B47 95A8 WDR
(0276) // 关Twi_中断
(0277) TWCR&=~(1<<TWIE);
0B48 B786 IN R24,0x36
0B49 7F8E ANDI R24,0xFE
0B4A BF86 OUT 0x36,R24
(0278) WDR(); //喂狗;
0B4B 95A8 WDR
(0279) // 发送开始条件
(0280) Twi_Start();
0B4C B786 IN R24,0x36
0B4D 708F ANDI R24,0xF
0B4E 6A80 ORI R24,0xA0
0B4F BF86 OUT 0x36,R24
(0281) WDR(); //喂狗;
0B50 95A8 WDR
(0282) Twi_WaitForComplete();
0B51 B626 IN R2,0x36
0B52 FE27 SBRS R2,7
0B53 CFFD RJMP 0x0B51
(0283) // 发送器件写地址
(0284) Twi_SendByte( deviceAddr & 0xFE );
0B54 2F80 MOV R24,R16
0B55 7F8E ANDI R24,0xFE
0B56 B983 OUT 0x03,R24
0B57 B786 IN R24,0x36
0B58 708F ANDI R24,0xF
0B59 6880 ORI R24,0x80
0B5A BF86 OUT 0x36,R24
(0285) Twi_WaitForComplete();
0B5B B626 IN R2,0x36
0B5C FE27 SBRS R2,7
0B5D CFFD RJMP 0x0B5B
(0286) // 检查器件是否可用
(0287) if( TWSR == TW_MT_SLA_ACK)
0B5E B181 IN R24,0x01
0B5F 3188 CPI R24,0x18
0B60 F489 BNE 0x0B72
(0288) {
0B61 C00D RJMP 0x0B6F
(0289) // 发送数据
(0290) while(length)
(0291) {
(0292) Twi_SendByte( *data++ );
0B62 01FB MOVW R30,R22
0B63 9021 LD R2,Z+
0B64 01BF MOVW R22,R30
0B65 B823 OUT 0x03,R2
0B66 B786 IN R24,0x36
0B67 708F ANDI R24,0xF
0B68 6880 ORI R24,0x80
0B69 BF86 OUT 0x36,R24
(0293) Twi_WaitForComplete();
0B6A B626 IN R2,0x36
0B6B FE27 SBRS R2,7
0B6C CFFD RJMP 0x0B6A
(0294) length--;
0B6D 952A DEC R18
(0295) WDR(); //喂狗;
0B6E 95A8 WDR
0B6F 2322 TST R18
0B70 F789 BNE 0x0B62
(0296) }
(0297) }
0B71 C001 RJMP 0x0B73
(0298) else
(0299) {
(0300) // 如未回应器件地址,停止发送,返回错误
(0301) retval = TWI_ERROR_NODEV;
0B72 E041 LDI R20,1
(0302) }
(0303)
(0304) // 发送停止条件,保持TWEA以便从接收
(0305) Twi_Stop();
0B73 B786 IN R24,0x36
0B74 708F ANDI R24,0xF
0B75 6D80 ORI R24,0xD0
0B76 BF86 OUT 0x36,R24
(0306) while( !(TWCR&(1<<TWSTO)) );
0B77 B626 IN R2,0x36
0B78 FE24 SBRS R2,4
0B79 CFFD RJMP 0x0B77
(0307) // 开Twi_中断
(0308) TWCR|=(1<<TWIE);
0B7A B786 IN R24,0x36
0B7B 6081 ORI R24,1
0B7C BF86 OUT 0x36,R24
(0309) return retval;
0B7D 2F04 MOV R16,R20
0B7E 940E190F CALL pop_gset2
0B80 9508 RET
_Twi_MasterReceiveNI:
retval --> R20
data --> R22
length --> R18
deviceAddr --> R16
0B81 940E1921 CALL push_gset2
0B83 816C LDD R22,Y+4
0B84 817D LDD R23,Y+5
(0310) }
(0311) /*********************************************************************************************************
(0312) ** 函数名称:主模式非中断接收
(0313) ** 功能描述:
(0314) ** 输 入: deviceAddr:从机地址
(0315) ** length:数据长度
(0316) ** * data 缓冲区指针
(0317) ** 输 出:
(0318) ** 全局变量:
(0319) ** 调用模块:
(0320) ** 说明:
(0321) ** 注意:
(0322) ** 日 期: 2006年8月29日
(0323) ********************************************************************************************************/
(0324)
(0325) uint8 Twi_MasterReceiveNI(uint8 deviceAddr, uint8 length, uint8 *data)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -