📄 sdhal.lst
字号:
68
69 SPI_SCK_GPIO();
70 SPI_SCK_OUT();
71 SPI_SCK_CLR(); // SCK 引脚置低 set SCK to zero
72
73 SPI_MISO_GPIO();
74 SPI_MISO_OUT();
75 SPI_MISO_CLR(); // MISO 引脚置低 set MISO to zero
76
77 SPI_MOSI_GPIO();
78 SPI_MOSI_OUT();
79 SPI_MOSI_CLR(); // MOSI 引脚置低 set MOSI to zero
80
81 SPI_CS_GPIO();
82 SPI_CS_OUT();
83 SPI_CS_CLR(); // CS 引脚置低 set CS to zero
84
85 for(i = 0; i < 0x9000; i++); // 关闭电源延时 delay after turn off power of sd card
86 SD_POWER_ON(); // 打开 SD 卡电源 turn on power of sd card
87 }
88 */
89 /*******************************************************************************************************************
90 ** 函数名称: void SD_HardWareInit() Name: void SD_HardWareInit()
91 ** 功能描述: 初始化访问SD卡的硬件条件 Function: initialize the hardware condiction that access sd card
92 ** 输 入: 无 Input: NULL
93 ** 输 出: 无 Output: NULL
94 ********************************************************************************************************************/
\ In segment CODE, align 4, keep-with-next
95 void SD_HardWareInit(void)
96 {
\ SD_HardWareInit:
\ 00000000 00B5 PUSH {LR}
97 //SD_Power() 对卡先下电,再上电 控制卡的第4脚 ,在7A3_Ek板上,此脚恒定为高,不能下电
98 // AT91F_PIO_ClearOutput(AT91C_BASE_PIOA ,XXXXXX) ; 无此脚
99 /* SPI_INIT(); 初始化SPI接口 initialize SPI interface */
100 /*AT91F_PIO_CfgPeriph(AT91C_BASE_PIOA,AT91C_PA16_SPI0_MOSI|AT91C_PA15_SPI0_MISO \
101 | AT91C_PA17_SPI0_SPCK |AT91C_PA14_SPI0_NPCS3 ,0) ;
102 AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC,1<<AT91C_ID_SPI0) ;
103 AT91F_PIO_OutputEnable(AT91C_BASE_PIOA,AT91C_PA16_SPI0_MOSI|AT91C_PA17_SPI0_SPCK|AT91C_PA14_SPI0_NPCS3) ;
104 AT91F_PIO_CfgOutput (AT91C_BASE_PIOA,AT91C_PA16_SPI0_MOSI|AT91C_PA17_SPI0_SPCK|AT91C_PA14_SPI0_NPCS3) ;
105 */
106 AT91F_SPI0_CfgPIO() ;
\ 00000002 ........ _BLF AT91F_SPI0_CfgPIO,AT91F_SPI0_CfgPIO??rT
107 AT91F_SPI0_CfgPMC() ;
\ 00000006 ........ _BLF AT91F_SPI0_CfgPMC,AT91F_SPI0_CfgPMC??rT
108 AT91F_PIO_OutputEnable(AT91C_BASE_PIOA,AT91C_PA16_SPI0_MOSI|AT91C_PA17_SPI0_SPCK|AT91C_PA14_SPI0_NPCS3) ;
\ 0000000A D021 MOV R1,#+0xD0
\ 0000000C 8902 LSL R1,R1,#+0xA ;; #+0x34000
\ 0000000E .... LDR R0,??DataTable11 ;; 0xfffff400
\ 00000010 ........ _BLF AT91F_PIO_OutputEnable,AT91F_PIO_OutputEnable??rT
109 AT91F_PIO_CfgOutput (AT91C_BASE_PIOA,AT91C_PA16_SPI0_MOSI|AT91C_PA17_SPI0_SPCK|AT91C_PA14_SPI0_NPCS3) ;
\ 00000014 D021 MOV R1,#+0xD0
\ 00000016 8902 LSL R1,R1,#+0xA ;; #+0x34000
\ 00000018 .... LDR R0,??DataTable11 ;; 0xfffff400
\ 0000001A ........ _BLF AT91F_PIO_CfgOutput,AT91F_PIO_CfgOutput??rT
110
111 //SD_INSERT_GPIO();
112 //SD_INSERT_IN(); /* 检测卡完全插入口为输入口 the port checking card is input */
113
114 //SD_WP_GPIO();
115 //SD_WP_IN(); /* 写保护检测口为输入口 the port written protect is input */
116
117 /* SPI_CS_SET(); CS置高 */
118 AT91F_PIO_SetOutput(AT91C_BASE_PIOA,AT91C_PA14_SPI0_NPCS3) ;
\ 0000001E 8021 MOV R1,#+0x80
\ 00000020 C901 LSL R1,R1,#+0x7 ;; #+0x4000
\ 00000022 .... LDR R0,??DataTable11 ;; 0xfffff400
\ 00000024 ........ _BLF AT91F_PIO_SetOutput,AT91F_PIO_SetOutput??rT
119
120 /* 设置SPI频率小于等于400kHZ set frequency of SPI below 400kHZ */
121 SPI_Clk400k();
\ 00000028 ........ BL SPI_Clk400k
122 /* 设置SPI接口模式,MSTR = 1,CPOL = 1,CPHA = 0,LSBF=0 */
123 AT91C_BASE_SPI0->SPI_CR |=(AT91C_SPI_SWRST |AT91C_SPI_SPIEN) ;
\ 0000002C 0348 LDR R0,??SD_HardWareInit_0 ;; 0xfffe0000
\ 0000002E 0349 LDR R1,??SD_HardWareInit_0 ;; 0xfffe0000
\ 00000030 0968 LDR R1,[R1, #+0]
\ 00000032 8122 MOV R2,#+0x81
\ 00000034 0A43 ORR R2,R1
\ 00000036 0260 STR R2,[R0, #+0]
124 } /* configure SPI interface */
\ 00000038 01BC POP {R0}
\ 0000003A 0047 BX R0 ;; return
\ ??SD_HardWareInit_0:
\ 0000003C 0000FEFF DC32 0xfffe0000
125
126
127 /*******************************************************************************************************************
128 ** 函数名称: void SPI_Clk400k() Name: void SPI_Clk400k()
129 ** 功能描述: 设置SPI的时钟小于400kHZ Function: set the clock of SPI less than 400kHZ
130 ** 输 入: 无 Input: NULL
131 ** 输 出: 无 Output: NULL
132 ********************************************************************************************************************/
\ In segment CODE, align 4, keep-with-next
133 void SPI_Clk400k(void)
134 {
135 // 若DIV32 为0:SPCK Baudrate =MCK/ (2 *SCBR ) now Fosc=48 mhz
136 AT91C_BASE_SPI0->SPI_CSR[3] = 60; /* 设置SPI时钟分频值为60 */
\ SPI_Clk400k:
\ 00000000 .... LDR R0,??DataTable4 ;; 0xfffe003c
\ 00000002 3C21 MOV R1,#+0x3C
\ 00000004 0160 STR R1,[R0, #+0]
137 }
\ 00000006 7047 BX LR ;; return
138
139
140 /*******************************************************************************************************************
141 ** 函数名称: void SPI_ClkToMax() Name: void SPI_ClkToMax()
142 ** 功能描述: 设置SPI的clock到最大值 Function: set the clock of SPI to maximum
143 ** 输 入: 无 Input: NULL
144 ** 输 出: 无 Output: NULL
145 ********************************************************************************************************************/
\ In segment CODE, align 4, keep-with-next
146 void SPI_ClkToMax(void)
147 { /* 将SPI时钟设置为高(最高可以到20mhz),设置分频值=48/(2*Baud )*/
148 AT91C_BASE_SPI0->SPI_CSR[3] = 4;
\ SPI_ClkToMax:
\ 00000000 .... LDR R0,??DataTable4 ;; 0xfffe003c
\ 00000002 0421 MOV R1,#+0x4
\ 00000004 0160 STR R1,[R0, #+0]
149 }
\ 00000006 7047 BX LR ;; return
150 /*******************************************************************************************************************
151 ** 函数名称: void SPI_SendByte()
152 ** 功能描述: 通过SPI接口发送一个字节
153 ********************************************************************************************************************/
\ In segment CODE, align 4, keep-with-next
154 void SPI_SendByte(INT8U byte)
155 {
156 INT8U temp;
157
158 AT91C_BASE_SPI0->SPI_TDR = byte; /* 发送数据放入SPI数据寄存器 */
\ SPI_SendByte:
\ 00000000 054A LDR R2,??SPI_SendByte_0 ;; 0xfffe000c
\ 00000002 0006 LSL R0,R0,#+0x18 ;; ZeroExt R0,R0,#+0x18,#+0x18
\ 00000004 000E LSR R0,R0,#+0x18
\ 00000006 1060 STR R0,[R2, #+0]
159
160 while((AT91C_BASE_SPI0->SPI_SR & AT91C_SPI_ENDTX)==0); /* 等待ENDTX置位,即等待数据发送完毕 */
\ ??SPI_SendByte_1:
\ 00000008 .... LDR R2,??DataTable7 ;; 0xfffe0010
\ 0000000A 1268 LDR R2,[R2, #+0]
\ 0000000C 9206 LSL R2,R2,#+0x1A
\ 0000000E FBD5 BPL ??SPI_SendByte_1
161
162 temp =AT91C_BASE_SPI0->SPI_RDR;
\ 00000010 .... LDR R2,??DataTable8 ;; 0xfffe0008
\ 00000012 1268 LDR R2,[R2, #+0]
\ 00000014 111C MOV R1,R2
163 temp=temp ;
164 }
\ 00000016 7047 BX LR ;; return
\ ??SPI_SendByte_0:
\ 00000018 0C00FEFF DC32 0xfffe000c
165
166
167 /*******************************************************************************************************************
168 ** 函数名称: INT8U SPI_RecByte() Name: INT8U SPI_RecByte()
169 ** 功能描述: 从SPI接口接收一个字节 Function: receive a byte from SPI interface
170 ** 输 入: 无 Input: NULL
171 ** 输 出: 收到的字节 Output: the byte that be received
172 ********************************************************************************************************************/
\ In segment CODE, align 4, keep-with-next
173 INT8U SPI_RecByte(void)
174 {
175 while((AT91C_BASE_SPI0->SPI_SR & AT91C_SPI_ENDRX)==0); /* 等待SPIF置位,即等待收到数据 */
\ SPI_RecByte:
\ ??SPI_RecByte_0:
\ 00000000 .... LDR R0,??DataTable7 ;; 0xfffe0010
\ 00000002 0068 LDR R0,[R0, #+0]
\ 00000004 C006 LSL R0,R0,#+0x1B
\ 00000006 FBD5 BPL ??SPI_RecByte_0
176 return(AT91C_BASE_SPI0->SPI_RDR); /* 读取收到的字节 read the byte received */
\ 00000008 .... LDR R0,??DataTable8 ;; 0xfffe0008
\ 0000000A 0068 LDR R0,[R0, #+0]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -