赞
踩
目录
STM32的SDIO(Secure Digital Input/Output,安全数字输入输出)接口是一种用于连接外部设备(如SD卡、蓝牙模块、Wi-Fi模块等)的接口标准。以下是对STM32的SDIO接口的详细解析:
SDIO_CK = SDIOCLK / (2 + CLKDIV)
。在SD卡初始化时,SDIO_CK不可以超过400Khz,初始化完成后可以设置为最大频率(但不可以超过SD卡最大操作频率)。STM32控制器的SDIO由SDIO适配器和APB2接口两部分组成:
- //SD卡初始化
- //返回值:0 初始化正确;其他值,初始化错误
- u8 SD_Init(void)
- {
- u8 SD_Error;
-
- //初始化时的时钟不能大于400KHZ
- SDCARD_Handler.Instance=SDIO;
- SDCARD_Handler.Init.ClockEdge=SDIO_CLOCK_EDGE_RISING; //上升沿
- SDCARD_Handler.Init.ClockBypass=SDIO_CLOCK_BYPASS_DISABLE; //不使用bypass模式,直接用HCLK进行分频得到SDIO_CK
- SDCARD_Handler.Init.ClockPowerSave=SDIO_CLOCK_POWER_SAVE_DISABLE; //空闲时不关闭时钟电源
- SDCARD_Handler.Init.BusWide=SDIO_BUS_WIDE_1B; //1位数据线
- SDCARD_Handler.Init.HardwareFlowControl=SDIO_HARDWARE_FLOW_CONTROL_DISABLE;//关闭硬件流控
- SDCARD_Handler.Init.ClockDiv=SDIO_TRANSFER_CLK_DIV; //SD传输时钟频率最大25MHZ
-
- SD_Error=HAL_SD_Init(&SDCARD_Handler,&SDCardInfo);
- if(SD_Error!=SD_OK) return 1;
-
- SD_Error=HAL_SD_WideBusOperation_Config(&SDCARD_Handler,SDIO_BUS_WIDE_4B);//使能宽总线模式
- if(SD_Error!=SD_OK) return 2;
- return 0;
- }
- //测试SD卡的读取
- //从secaddr地址开始,读取seccnt个扇区的数据
- //secaddr:扇区地址
- //seccnt:扇区数
- void sd_test_read(u32 secaddr,u32 seccnt)
- {
- u32 i; u8 *buf; u8 sta=0;
- buf=mymalloc(SRAMEX,seccnt*512); //申请内存
- sta=SD_ReadDisk(buf,secaddr,seccnt);//读取secaddr扇区开始的内容
- if(sta==0)
- {
- printf("SECTOR %d DATA:\r\n",secaddr);
- for(i=0;i<seccnt*512;i++)printf("%x ",buf[i]);//打印secaddr开始的扇区数据
- printf("\r\nDATA ENDED\r\n");
- }else printf("err:%d\r\n",sta);
- myfree(SRAMEX,buf); //释放内存
- }
- //测试SD卡的写入(慎用,最好写全是0XFF的扇区,否则可能损坏SD卡.)
- //从secaddr地址开始,写入seccnt个扇区的数据
- //secaddr:扇区地址
- //seccnt:扇区数
- void sd_test_write(u32 secaddr,u32 seccnt)
- {
- u32 i;
- u8 *buf; u8 sta=0;
- buf=mymalloc(SRAMEX,seccnt*512); //从SDRAM申请内存
- for(i=0;i<seccnt*512;i++) buf[i]=i*3; //初始化写入的数据,是3的倍数.
- sta=SD_WriteDisk(buf,secaddr,seccnt); //从secaddr扇区开始写入seccnt个扇区内容
- if(sta==0) printf("Write over!\r\n");
- else printf("err:%d\r\n",sta);
- myfree(SRAMEX,buf); //释放内存
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。