贴上仿真时的汇编源程序,简单的移位变换处理,为什么要用到NOP指令,没整明白,哈哈,会ARM汇编的不妨指点指点. 36: 0x0010020C E1A00C84 MOV R0,R4,LSL #25 0x00100210 E1A04C20 MOV R4,R0,LSR #24 37: Macro_Set_CLK_Low(); 0x00100214 E1A00000 NOP 620: pPio->PIO_CODR = flag; 0x00100218 E3A00901 MOV R0,#0x00004000 0x0010021C E2401B13 SUB R1,R0,#0x00004C00 0x00100220 E5810034 STR R0,[R1,#0x0034] 621: } 0x00100224 E1A00000 NOP 38: Macro_Set_CLK_High(); 39: 40: // if(GetSDCard_SO_Value()) 0x00100228 E3A01901 MOV R1,#0x00004000 0x0010022C E2400B13 SUB R0,R0,#0x00004C00 0x00100230 EB0000D5 BL AT91F_PIO_SetOutput(0x0010058C) 41: if(AT91F_PIO_GetInput( AT91C_BASE_PIOA) & SD_SO) //内联函数,无调用开销 42: { 43: // ucReadData |= 0x01; 0x00100234 E1A00000 NOP 586: return pPio->PIO_PDSR; 0x00100238 E59F00C8 LDR R0,[PC,#0x00C8] 0x0010023C E590003C LDR R0,[R0,#0x003C] 0x00100240 E3100A01 TST R0,#0x00001000 0x00100244 0A000001 BEQ 0x00100250 44: ucReadData++; 45: } 46: } 0x00100248 E2840001 ADD R0,R4,#0x00000001 0x0010024C E20040FF AND R4,R0,#0x000000FF 33: for(ucCount=8; ucCount; --ucCount) 34: { 35: ucReadData <<= 1; 36: 37: Macro_Set_CLK_Low(); 38: Macro_Set_CLK_High(); 39: 40: // if(GetSDCard_SO_Value()) 41: if(AT91F_PIO_GetInput( AT91C_BASE_PIOA) & SD_SO) //内联函数,无调用开销 42: { 43: // ucReadData |= 0x01; 44: ucReadData++; 45: } 46: } 0x00100250 E2450001 SUB R0,R5,#0x00000001 0x00100254 E20050FF AND R5,R0,#0x000000FF 0x00100258 E3550000 CMP R5,#0x00000000 0x0010025C 1AFFFFEA BNE 0x0010020C 47: return(ucReadData); 0x00100260 E1A00004 MOV R0,R4 0x00100264 E8BD4070 LDMIA R13!,{R4-R6,R14} 48: } 49: 50: void VS1003B_SPIPutChar(unsigned char ucSendData) 0x00100268 E12FFF1E BX R14 51: { 52: // S0SPDR = c; 53: // while((S0SPSR & 0x80) == 0); //等待SPI将数据发送完毕 54: uchar ucCount; 55: uchar ucMaskCode; 56: 0x0010026C E92D4070 STMDB R13!,{R4-R6,R14} 0x00100270 E1A04000 MOV R4,R0 57: ucMaskCode = 0x80; 0x00100274 E3A05080 MOV R5,#0x00000080 58: for(ucCount=8; ucCount; --ucCount) 59: { 0x00100278 E3A06008 MOV R6,#0x00000008 0x0010027C EA000016 B 0x001002DC 60: Macro_Set_CLK_Low(); 61: 0x00100280 E1A00000 NOP 620: pPio->PIO_CODR = flag; 0x00100284 E3A00901 MOV R0,#0x00004000 0x00100288 E2401B13 SUB R1,R0,#0x00004C00 0x0010028C E5810034 STR R0,[R1,#0x0034] 621: } 0x00100290 E1A00000 NOP 62: if(ucMaskCode & ucSendData) 63: { 0x00100294 E1150004 TST R5,R4 0x00100298 0A000003 BEQ 0x001002AC 64: Macro_Set_SI_High(); 65: } 66: else 67: { 0x0010029C E3A01A02 MOV R1,#0x00002000 0x001002A0 E2410B0B SUB R0,R1,#0x00002C00 0x001002A4 EB0000B8 BL AT91F_PIO_SetOutput(0x0010058C) 0x001002A8 EA000005 B 0x001002C4 68: Macro_Set_SI_Low(); 69: } 70: 0x001002AC E1A00000 NOP 0x001002B0 E3A00A02 MOV R0,#0x00002000 0x001002B4 E2401B0B SUB R1,R0,#0x00002C00 0x001002B8 E5810034 STR R0,[R1,#0x0034] 0x001002BC E1A00000 NOP 0x001002C0 E1A00000 NOP 71: Macro_Set_CLK_High(); 0x001002C4 E3A01901 MOV R1,#0x00004000 0x001002C8 E2410B13 SUB R0,R1,#0x00004C00 0x001002CC EB0000AE BL AT91F_PIO_SetOutput(0x0010058C) 72: ucMaskCode >>= 1; 73: 74: } 0x001002D0 E1A050C5 MOV R5,R5,ASR #1 58: for(ucCount=8; ucCount; --ucCount) 59: { 60: Macro_Set_CLK_Low(); 61: 62: if(ucMaskCode & ucSendData) 63: { 64: Macro_Set_SI_High(); 65: } 66: else 67: { 68: Macro_Set_SI_Low(); 69: } 70: 71: Macro_Set_CLK_High(); 72: ucMaskCode >>= 1; 73: 74: } 0x001002D4 E2460001 SUB R0,R6,#0x00000001 0x001002D8 E20060FF AND R6,R0,#0x000000FF 0x001002DC E3560000 CMP R6,#0x00000000 0x001002E0 1AFFFFE6 BNE 0x00100280 75: } |