打印
[STM32]

振南ZN-X开发板【STM32M3版】高级模块实验 之 SD卡扇区读写

[复制链接]
1628|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
znmcu|  楼主 | 2014-10-10 13:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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-OBJLINK仿真器(用于仿真与程序下载)
USB转串口模块(用于串口通信与程序下载)
SD卡读写模块与SD
【注:此实验中使用的是SD2接口SD1连接的STM32IO,没有硬件SPI功能,因此SD1只能使用IO模拟SPI方式。】
电路原理图及详解:
原理图注解:上图是此实验的ZN-X基板(STM32 M3)主要原理图(与此实验无关的部分均已裁掉)ZN-X开发板上有两个SD卡模块接口,如图中①和②,它们由2x5的双排母接口与SD卡模块相插接,如下图所示。
此实验中使用SD卡模块接口1,接口2也是同样的道理,只是IO接口连线不同而已。
图中③为USB串口模块专用接口,主要用于完成供电、串口通信与程序下载,如下图。
图中④是STM32 M3芯片,型号为STM32F103RBT6128KB ROM20KB 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中,进一步完成文件层的功能。
源代码下载:






相关帖子

沙发
卢台长| | 2014-10-10 18:18 | 只看该作者
前排站位,好东西,学习了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:振南的znFAT -- 单片机上上的FAT32文件系统 www.znmcu.cn

4474

主题

5195

帖子

33

粉丝