
eadOperation函数用于等待数据读取操作完成. 只有确保完成数据读取后,我们才能放心使用数据. eadOperation功能还适用于单块读取功能和多块读取功能.
代码列表3614 SD_WaitReadOperation函数
1 SD_Error SD_WaitReadOperation(无效)
2 {
3 SD_Error错误状态= SD_OK;
4 uint32_t超时;
5
6个超时= SD_DATATIMEOUT;
7则(((DMAEndOfTransfer == 0x00)&&(TransferEnd == 0)&&
8(TransferError == SD_OK)&&(超时> 0)){
9超时-;
10}
11
12 DMAEndOfTransfer = 0x00;
13超时= SD_DATATIMEOUT;
14 while(((((SDIO-> STA&SDIO_FLAG_RXACT)))&&(timeout> 0)){
15超时-;
16}
17 if(StopCondition == 1){
18 errorstatus = SD_StopTransfer();
19 StopCondition = 0;
20}
21 if(((timeout == 0)&&(errorstatus == SD_OK)){
22错误状态= SD_DATA_TIMEOUT;
23}
24 / *!
25 SDIO_ClearFlag(SDIO_STATIC_FLAGS);
26 if(TransferError!= SD_OK){
27 return(TransferError);
28}其他{
29 return(errorstatus);
30}
31}
此功能开始等待当前块数据的正确传输,并添加了超时检测功能. 然后不断监视SDIO_STA寄存器的RXACT位,以等待数据读取完成. 对于多块数据读取操作,需要调用SD_StopTransfer函数来停止数据传输,而无需单块写入. 该函数最后清除相关标志并返回错误.
5. SDIO中断服务功能
相关标志中断将在数据传输操作期间启用,该跟踪用于跟踪传输进度和错误检测. 如果使用DMA传输,与DMA相关的中断也将被使能. 为了简化代码,并且通常不修改SDIO中断服务功能的内容,请将中断服务功能放置在bsp_sdio_sd.c文件中,而不是通常用于存储中断服务功能的stm32f4xx_it.c文件中.
代码列表3615 SDIO中断服务功能
1个无效的SDIO_IRQHandler(无效)
2 {
3 / *处理所有SDIO中断源* /
4 SD_ProcessIRQSrc();
5}
6

7 SD_Error SD_ProcessIRQSrc(无效)
8 {
9 if(SDIO_GetITStatus(SDIO_IT_DATAEND)!= RESET){
10 TransferError = SD_OK;
11 SDIO_ClearITPendingBit(SDIO_IT_DATAEND);
12 TransferEnd = 1;
13}否则,如果(SDIO_GetITStatus(SDIO_IT_DCRCFAIL)!= RESET){
14 SDIO_ClearITPendingBit(SDIO_IT_DCRCFAIL);
15 TransferError = SD_DATA_CRC_FAIL;
16}否则,如果(SDIO_GetITStatus(SDIO_IT_DTIMEOUT)!= RESET){
17 SDIO_ClearITPendingBit(SDIO_IT_DTIMEOUT);
18 TransferError = SD_DATA_TIMEOUT;
19}否则,如果(SDIO_GetITStatus(SDIO_IT_RXOVERR)!= RESET){
20 SDIO_ClearITPendingBit(SDIO_IT_RXOVERR);
21 TransferError = SD_RX_OVERRUN;
22}否则,如果(SDIO_GetITStatus(SDIO_IT_TXUNDERR)!= RESET){
23 SDIO_ClearITPendingBit(SDIO_IT_TXUNDERR);
24 TransferError = SD_TX_UNDERRUN;
25}否则,如果(SDIO_GetITStatus(SDIO_IT_STBITERR)!= RESET){
26 SDIO_ClearITPendingBit(SDIO_IT_STBITERR);
27 TransferError = SD_START_BIT_ERR;
28}
29
30 SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND |
31 SDIO_IT_TXFIFOHE | SDIO_IT_RXFIFOHF | SDIO_IT_TXUNDERR |
32 SDIO_IT_RXOVERR | SDIO_IT_STBITERR,DISABLE);
33 return(TransferError);
34}
SDIO中断服务函数SDIO_IRQHandler将直接调用SD_ProcessIRQSrc函数来执行. SD_ProcessIRQSrc函数通过多个if判断语句来区分中断源,并为传输错误标志变量TransferError分配一个值,以指示当前的传输状态. 最后,禁用SDIO中断.
代码列表3616 DMA请求中断
1个无效SD_SDIO_DMA_IRQHANDLER(无效)
2 {
3 / *处理DMA2 Stream3或DMA2 Stream6中断源* /
4 SD_ProcessDMAIRQ();
5}
6
7个无效的SD_ProcessDMAIRQ(无效)
8 {
9 if(DMA2-> LISR&SD_SDIO_DMA_FLAG_TCIF){
10 DMAEndOfTransfer = 0x01;
11 DMA_ClearFlag(SD_SDIO_DMA_STREAM,
12 SD_SDIO_DMA_FLAG_TCIF | SD_SDIO_DMA_FLAG_FEIF);
13}

14}
SD_SDIO_DMA_IRQHANDLER函数是DMA传输中断服务函数,它直接调用SD_ProcessDMAIRQ函数来执行. SD_ProcessDMAIRQ函数主要用于确定DMA传输完成标志.
到目前为止,我们已经介绍了SD卡初始化,SD卡数据操作以及与SDIO相关的中断服务功能的基本功能. 这些功能很多时候足以供我们使用. 接下来,我们将编写一些简单的测试程序来验证移植的正确性.
6. 测试功能
用于测试SD卡部件的功能由我们自己编写,并存储在sdio_test.c文件中.
SD卡测试功能
代码列表3617 SD_Test
1个无效的SD_Test(无效)
2 {
3 LED_BLUE;
4 / * ---------------------------- SD初始化-------------- ------------ * /
5 / * SD卡使用SDIO中断和DMA中断接收数据,该中断服务程序位于bsp_sdio_sd.c文件的末尾
6 if((状态= SD_Init())!= SD_OK){
7个LED_RED;
8 printf(“ SD卡初始化失败,请确保SD卡已正确连接到开发板上,或更换另一张SD卡进行测试!”“;
9}其他{
10 printf(“ SD卡初始化成功!n”);
11}
12 if(状态== SD_OK){
13 LED_BLUE;
14 / *擦除测试* /
15 SD_EraseTest();
16
17个LED_BLUE;
18 / *单个块的读写测试* /
19 SD_SingleBlockTest();
20
21 //目前不支持临时多块读写. 多块读写可以被多个单块读写过程取代
22个LED_BLUE;
23 / *多块读写测试* /
24 SD_MultiBlockTest();
25}
26}
测试程序在开发板上用LED灯指示测试结果,并同时将相关的测试结果打印到串行调试助手中. 测试程序首先调用SD_Init函数以完成SD卡初始化. 该功能的具体代码请参见代码列表367. 如果初始化成功,则可以执行数据操作测试.
SD卡擦除测试
代码列表3618 SD_EraseTest
1个无效的SD_EraseTest(无效)
2 {
3 / * -------------------块擦除----------------------- -------- * /
4 if(状态== SD_OK){
5 / *擦除WRITE_BL_LEN的NumberOfBlocks块(512字节)* /
6状态= SD_Erase(0x00,(BLOCK_SIZE * NUMBER_OF_BLOCKS));
7}

8
9 if(状态== SD_OK){
10状态= SD_ReadMultiBlocks(Buffer_MultiBlock_Rx,0x00,
11个BLOCK_SIZE,NUMBER_OF_BLOCKS个);
12
13 / *检查传输是否完成* /
14状态= SD_WaitReadOperation();
15
16 / *等待DMA传输结束* /
17 while(SD_GetStatus()!= SD_TRANSFER_OK);
18}
19
20 / *检查已删除块的正确性* /
21 if(状态== SD_OK){
22 EraseStatus = eBuffercmp(Buffer_MultiBlock_Rx,MULTI_BUFFER_SIZE);
23}
24
25 if(EraseStatus == PASSED){
26 LED_GREEN;
27 printf(“ SD卡擦除测试成功!n”);
28}其他{
29 LED_BLUE;
30 printf(“ SD卡擦除测试失败!n”);
31 printf(“提醒: 如果SD卡可以通过以下单次测试,则某些SD卡不支持擦除测试
32读写测试,这意味着SD卡可以正常使用. n“);
33}
34}
SD_EraseTest函数的主要编程思想是擦除一定数量的数据块,然后读取已擦除块的数据,并将读取的数据与0xff或0x00进行比较以获得擦除结果.
SD_Erase函数用于擦除指定的地址空间. 源代码参考代码列表3610. 它接收两个参数以指定擦除空间的开始地址和结束地址. 如果SD_Erase函数返回正确,表明擦除成功,则读取数据块;如果SD_Erase函数返回错误,表明SD卡无法擦除,尽管有些卡无法擦除,但并非所有卡都可以成功擦除,但是数据读写操作也可以正常执行. 此处使用多块读取功能SD_ReadMultiBlocks. 它具有四个形式参数,即读数据存储器,读数据目标地址,块大小和块号. 该功能将遵循相关的处理代码,等待数据传输完成. 接下来,将调用eBuffercmp函数以确定擦除结果. 它具有两个形式参数,即数据指针和数据字节长度. 它实际上将数据存储器中的所有数据与0xff或0x00进行比较. 如果超过该数量,将报告错误.
单块读写测试
代码列表3619 SD_SingleBlockTest函数
1个无效的SD_SingleBlockTest(无效)
2 {
3 / * -------------------阻止读/写--------------------- ----- * /
4 / *填充缓冲区以发送* /
5 Fill_Buffer(Buffer_Block_Tx,BLOCK_SIZE,0x320F);
6
7 if(状态== SD_OK){
8 / *在地址0上写入512字节的块* /
9状态= SD_WriteBlock(Buffer_Block_Tx,0x00,BLOCK_SIZE);
10 / *检查传输是否完成* /
11状态= SD_WaitWriteOperation();
12秒钟(SD_GetStatus()!= SD_TRANSFER_OK);

13}
14 if(状态== SD_OK){
15 / *从地址0读取512字节的块* /
16状态= SD_ReadBlock(Buffer_Block_Rx,0x00,BLOCK_SIZE);
17 / *检查传输是否完成* /
18状态= SD_WaitReadOperation();
19 while(SD_GetStatus()!= SD_TRANSFER_OK);
20}
21 / *检查写入数据的正确性* /
22 if(状态== SD_OK){
23 TransferStatus1 = Buffercmp(Buffer_Block_Tx,
24 Buffer_Block_Rx,BLOCK_SIZE);
25}
26 if(TransferStatus1 == PASSED){
27 LED_GREEN;
28 printf(“单块测试成功!n”);
29}其他{
30个LED_RED;
31 printf(“单块测试失败,请确保SD卡已正确连接到开发板上,或更换另一张SD卡进行测试!n”);
32}
33}
SD_SingleBlockTest函数的主要编程思想是先填充一块块大小的内存,然后通过写操作将数据写入SD卡,然后通过读操作将数据读取到另一个内存,然后比较内存内容读写操作是否正确.
SD_SingleBlockTest函数开始调用Fill_Buffer函数以填充内存内容. 循环分配方法用数据填充存储区只是一种简单而实用的方法. 它具有三个形式参数,分别是存储区指针,填充字节数和起始位置. 号码选择,此处的起始号码选择参数对该测试没有实际意义. SD_WriteBlock函数和SD_ReadBlock函数分别执行数据写入和读取操作. 有关详细信息sd卡函数修复软件,请参见代码列表3611和代码列表3613. Buffercmp函数用于比较两个存储区域的内容是否完全相等. 它具有三个形式参数,分别是第一个存储区指针sd卡函数修复软件,第二个存储区指针和内存长度. 该函数仅循环并比较两个存储区域的相应位置. 两种数据是否相等,只是发现不平等,然后报告错误并退出.
SD_MultiBlockTest函数类似于SD_SingleBlockTest函数,此处不再进行详细分析.
主要功能
代码列表3620主要功能
1个int主(无效)
2 {
3 / *禁用WiFi模块* /
4 BL8782_PDN_INIT();
5
6 / *初始化LED灯* /
7个LED_GPIO_Config();
8个LED_BLUE;
9 / *初始化独立密钥* /
10 Key_GPIO_Config();
11
12 / *初始化USART1 * /
13 Debug_USART_Config();
14
15 printf(“欢迎使用Binghuo STM32 F429开发板. ”);
16
17 printf(“在开始对SD卡进行基本测试之前,请将开发板插入32G之内

[1] [2] [3] [4] [5] [6] [7] [8] [9]

关键字: 编辑: 引用什么地址: 本网站上复制的所有文章,图片,音频和视频文件以及其他材料的版权归版权所有者所有. 本网站上使用的原始文章和图片并非与确认版权的人联系. 如果本网站上所选内容的文章作者和编辑认为他们的作品不适合免费和公共传播,或者不应免费使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施以避免对双方造成不必要的经济损失.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shumachanpin/article-206585-1.html
幸亏市场上很多货在卖不然小米不好找借口
为美企输送资金助其度过难关
入台湾之日