stc单片机吧 关注:1,831贴子:2,420

最近在做stc单片机读mirco sd卡的实验,在这里先打个

取消只看楼主收藏回复

最近在做stc单片机读mirco sd卡的实验,在这里先打个地基。稍后记录进度。


IP属地:辽宁来自Android客户端1楼2018-02-26 14:05回复
    自己坐沙发


    IP属地:辽宁来自Android客户端2楼2018-02-26 14:05
    回复
      先晒一下新到手的玩具 树莓派 据说是比单片机更好一级的东西,先留着 有空再玩!下面是正题。




      IP属地:辽宁来自Android客户端4楼2018-02-27 00:35
      回复
        这是基本的电路,用了一根杜邦线和两个模块 sd卡模块和一个stc15系列的仿真器。时间太晚了 稍后再给出电路图和选型思路。



        IP属地:辽宁来自Android客户端5楼2018-02-27 00:38
        回复
          用过读卡器没 就是手机上小的内存卡 读这个用的


          IP属地:辽宁来自Android客户端7楼2018-02-27 07:39
          回复
            为了大家看的清楚不至于把脖子扭到,我把图片做了标注。这里MISO 和MOSI要和单片机的MISO MOIS的引脚同名对应上,这点与TXD RXD的串口通信接法不同 要注意一下。SS接sd卡模块的cs因为叫法的不同或许会有所区别




            IP属地:辽宁来自Android客户端9楼2018-02-27 10:27
            回复
              选型和接线先到这里 晚上开始写程序


              IP属地:辽宁来自Android客户端10楼2018-02-27 10:28
              回复
                https://pan.baidu.com/s/1jIVj1iu 这个是写出的程序,分为MMC卡和SD卡两个版本的。时间太晚了,这几天会写出详细的教程,大家不要着急。


                IP属地:辽宁13楼2018-02-28 23:28
                回复
                  好了,我来兑现承诺了。
                  接下来我将从已知的信息开始告诉大家这个程序该如何去写,想直接要结果的TX可以在上面的楼层下载已经写好的程序,有兴趣的TX请端个小板凳在这里慢慢听我讲来。


                  IP属地:辽宁15楼2018-03-01 19:10
                  回复
                    已知情报1:与SD卡通信有两种方式SD和SPI,各引脚的作用如下图所示。其中DO和DI引脚的全程为DATAOU和DATAIN,分别对应了SPI总线的MISO和MOIS。这一点是网上诸多资料中容易混淆的部分。
                    已知情报2:SD卡的SPI通信中时钟空闲为高电平,前沿采集后沿输出。初始化阶段要求较低的时钟频率,正式通信时要求较高的时钟频率。


                    IP属地:辽宁16楼2018-03-01 19:31
                    回复(1)
                      从上述的情报中我们可以得出要想使用单片机读取SD卡中的数据,就要使用SPI与SD卡进行通信。既然是通信,就涉及到反馈。我们需要在SPI通信的基础上另外增加一种已知的通信方式,将SD卡所发出的信息发送出来,用来调试我们的程序。这里我选择使用串口通信作为程序中回传SPI通信信息,整个程序是按照下面的模式进行。


                      IP属地:辽宁17楼2018-03-01 19:43
                      回复
                        下面显示的是我程序中所用到的库函数和头文件。
                        USART1.C是STC所提供的STC15系列单片机的串口通信函数库,用于初始化串口。
                        SPI.C是SPI通信函数库,我在原版的基础上进行了修改。
                        STC15Fxxxx.H是STC15系列的头文件,使用STC15系列的单片机一般都要用到这个文件。
                        SD_SPI.C里面是我写的关于读取SD卡的函数,这个版本看起来比较杂乱,稍后有时间我会整理出一个简洁的版本。


                        IP属地:辽宁18楼2018-03-01 19:52
                        回复
                          首先我们初始化串口。这里我采用的是11.0592MHZ的内置晶振,波特率9600,选择P36 P37作为通信端口(因为我要使用P30P31作为仿真器的通信口,只好移开原有的通信口。)

                          然后在主函数中调用上面的函数并打开中断,这样我们将在串口助手中接收到"STC15F2K60S2 SPI Test Prgramme!“这样的字符串,这里我就不给大家贴图了。


                          IP属地:辽宁19楼2018-03-01 19:59
                          回复
                            当我们验证串口通信程序没有问题后,开始编写SPI通信初始化程序。

                            感谢STC为我们所提供的样例,省去了很多查询寄存器的时间。当然如果你对程序的大小有着苛刻的要求,或者是对程序的运行速度有要求当然也可以选择直接使用寄存器。这里为了方便选择了库函数。
                            根据之前所得到的情报。我们将SPI设置完成。SPI_CPOL_High对应着空闲状态下时钟为高电平,SPI_CPHA_1Edge对应着前沿采集后沿输出,SPI_Speed_128对应着初始化状态低频率,SPI_MSB是说的字符位移的方式,前面的情报没有提到,SD卡通信中先发高位后发低位,也就是选择MSB。
                            这样一来我们基本上把SPI初始化完成。


                            IP属地:辽宁20楼2018-03-01 20:18
                            回复
                              接下来我要讲一下SD卡的初始化流程。
                              这样的资料网上有很多,当然我不是说我这里不准备介绍了。相反由于SD卡的通讯协议从最开始的V1.0到现在的V4.0,网上充斥着大量的相互矛盾的材料,为了让大家少走弯路。我为大家简单的讲解一下这个初始化的流程,等大家有一个基础的认识以后在去网上搜索一下相关的资料作为佐证。我这里仅仅是让你用最短的时间让你使用STC15系列的单片机读取SD卡。
                              在介绍流程之前,先给大家普及一下SD卡中的命令。SD卡中的命令长度为6个字节 也就是说要对SD卡连续发送6个字节。
                              以复位为例,需要在给SD卡发送75个时钟信号之后发送一个CMD0命令,这个命令用二进制表示为
                              0100 0000 0000 0000 0000 0000 0000 0000 0000 0000 1001 0101
                              这样写或许看着比较麻烦换成16进制为0x40,0x00,0x00,0x00,0x00,0x95,
                              从二进制中可以看出最高的两位为0 1,这个是所有命令中约定的起始方式,低位的字节为校验位,中间的为参数或者是地址位。

                              为了大家更快的调试出自己的程序,我在下面的楼层中将大家所要使用的所有基础命令都贴出来。大家直接调用就好,而不是反复的查阅说明文件找到所需要的指令。


                              IP属地:辽宁21楼2018-03-01 20:43
                              回复