本帖最后由 znmcu 于 2014-10-10 14:16 编辑
振南网站还在继续美化改进,暂时提供一个平台来发布振南的实验和相关资料!
http://www.znmcu.cn/znx_m3_exp_sd_driver_test.html
振南QQ:987582714 群:198521880
SD卡物理扇区读写测试【STM32 M3版】 实验说明: 此实验主要完成对SD卡物理扇区读写驱动的专门测试,它对于znFAT来说是至关重要的。SD卡物理驱动是znFAT的根本基础,只有扇区读写工作稳定正常,上层文件系统的运行才能得以保障。如果SD卡物理驱动不通或有问题,那znFAT必然失败!! 此实验中首先向SD卡的999扇区中写入512字节的数据,然后再将其读出,比较它们是否一致。如果一致则成功,否则失败。 所需硬件: 此实验中需要的硬件有: ZN-X开发板基板(STM32 M3版)【也可使用自己的开发板,需要将SD卡模块与开发板通过导线相连,还需要在IO上加10K上拉电阻】 ARM-OB或JLINK仿真器(用于仿真与程序下载) USB转串口模块(用于串口通信与程序下载) SD卡读写模块与SD卡 【注:此实验中使用的是SD卡2接口,SD卡1连接的STM32的IO,没有硬件SPI功能,因此SD卡1只能使用IO模拟SPI方式。】 电路原理图及详解: 原理图注解:上图是此实验的ZN-X基板(STM32 M3版)主要原理图(与此实验无关的部分均已裁掉)。ZN-X开发板上有两个SD卡模块接口,如图中①和②,它们由2x5的双排母接口与SD卡模块相插接,如下图所示。 此实验中使用SD卡模块接口1,接口2也是同样的道理,只是IO接口连线不同而已。 图中③为USB串口模块专用接口,主要用于完成供电、串口通信与程序下载,如下图。 图中④是STM32 M3芯片,型号为STM32F103RBT6(128KB ROM、20KB RAM、主频最高可达74MHz)。两个SD卡接口IO分配如下: SD接口1信号 |
连到STM32F103 IO
|
SD接口2信号
|
连到STM32F103 IO
|
SD1-CS
|
PB8
|
SD2-CS
|
PB9
|
SD1-SI
|
PB5
|
SD2-SI
|
PB15/SPI2-MOSI
|
SD1-SO
|
PB4
|
SD2-SO
|
PB14/SPI2-MISO
|
SD1-CLK
|
PB3
|
SD2-CLK
|
PB13/SPI2-SCLK
|
图中⑸是ARM-OB SWDP仿真调试器接口(ARM-OB其实是JLINK的简化版,它只支持SWDP接口方式,而非JTAG方式)。 上图是SD卡模块的原理图,对照模块实物图,不难理解其意义。 在此实验中可以看到我们将SD卡模块上的跳线设置为J3-J2,就是因为我们直接使用了ZN-X基板,它所使用的CPU(51)是3.3V的,而无需分压电路。 主要代码详解: 我们这里是使用SPI方式来驱动SD卡,依据SPI接口的实现方式,代码主要分为两种:IO模拟SPI与硬件SPI。前者是使用普通IO来模拟SPI时序,与后者相比其好处在于它更加通用(易于移植),更加简单,只要有IO操作则可完成对SD卡的驱动。但坏处是它的速度比较慢。这里振南提供了这两种实现方式的代码,代码具体实现细节不再赘述【可以去看《振南znFAT》一书中对SD卡物理驱动的详细讲解】 下面是此实验的主函数部分的代码,用以说明SD卡物理扇区读写测试的方法和思想。 unsigned char pbuf[512]; //数据缓冲区
int main(void) { int i=0,res=0,cnt=0; u32 tt_sec=0; delay_init(); uart_init(9600); //串口初始化为9600 printf("串口设置完毕\r\n"); while(SD2_Init()) { cnt++; printf("SD卡2初始化已尝试%d次\r\n",cnt); if(cnt>=3) printf("振南ZN-X开发板SD卡2初始化失败\r\n");while(1); } printf("振南ZN-X开发板SD卡2初始化成功\r\n"); tt_sec = SD2_GetTotalSec(); printf("SD卡2总扇区:%d\r\n",tt_sec); printf("SD卡2总容量(MB):%d\r\n",tt_sec>>11);
for(i=0;i<512;i++) pbuf=i;
res = SD2_Write_Sector(999,pbuf); printf("SD卡2写扇区完成:%d\r\n",res);
for(i=0;i<512;i++) pbuf=0; res=SD2_Read_Sector(999,pbuf); printf("SD卡2读扇区完成:%d\r\n",res); res=0; for(i=0;i<512;i++) if(pbuf!=((unsigned char)i)) res=1; if(res) printf("SD卡2测试失败☆\r\n"); else printf("SD卡2测试成功★\r\n"); while(1); } |
实验效果: 上图是此实验的最终实验效果。成功完成物理扇区读写测试之后,即可将此驱动植入到znFAT中,进一步完成文件层的功能。 源代码下载:
|