标题: 单片机软件SPI和硬件SPI读写SD卡,TF卡测试程序 [打印本页]

作者: pengxxx    时间: 2020-4-26 23:24
标题: 单片机软件SPI和硬件SPI读写SD卡,TF卡测试程序
软件SPI和硬件SPI读写SD卡,TF卡测试程序
SD卡模块和SD卡



软件SPI读写SD卡程序
测试平台:STC89C516和STC12C5A60S2
内存卡大小:128MB和2GB
晶振:均为12MHz

硬件SPI读写SD卡程序
测试平台:STC12C5A60S2
内存卡大小:128MB和2GB
晶振:12MHz
(89C52没有硬件SPI)


为了尽可能的不给后来者留坑,这些代码我在发出来之前反复测试过,确保无误,
还有就是关于SD卡程序的读写我在程序中写的很清楚,这里不再赘述

单片机源程序如下:
  1. #include "public.h"
  2. #include "SD.h"

  3. //测试平台:STC89C516和STC12C5A60S2
  4. //内存卡大小:128MB和2GB
  5. //晶振:均为12MHz

  6. void main()
  7. {
  8.         unsigned int i;

  9.         SD_init();//SD卡初始化
  10.        
  11.         for(i=0;i<512;++i) BUFFER_DATA[i]=0x7F;
  12.         MCU_write_SD_512Byte(960,512);//MCU向SD卡写入数据,一次最多512字节(扇区,数据长度(最大为512,建议填512))
  13.        
  14.         MCU_read_SD_512Byte(960,512);//MCU向SD卡读取数据,一次最多512字节(扇区,数据长度(最大为512,建议填512))
  15.         P0=BUFFER_DATA[0];
  16.        
  17.         while(1);
  18. }

  19. /*
  20.         unsigned int i;
  21.        
  22.         SD_init();//SD卡初始化
  23.        
  24.         {
  25.                 在使用SD卡模块前,先初始化SD卡
  26.         }
  27.        
  28.         for(i=0;i<512;++i) BUFFER_DATA[i]=0x7F;
  29.         MCU_write_SD_512Byte(960,512);//MCU向SD卡写入数据,一次最多512字节(扇区,数据长度(最大为512,建议填512))
  30.        
  31.         {
  32.                 将数据写入到SD卡:
  33.                 先将数据写入到数据缓冲数组BUFFER_DATA中(这里的数据我全部都写0x7F),
  34.                 然后运行MCU_write_SD_512Byte(960,512);
  35.                 960为SD卡的扇区,表示将数据写入到SD卡的960扇区,512为一次性写入的数据大小,为512字节,建议填512字节,
  36.                 因为1个扇区的大小为512字节
  37.         }
  38.        
  39.         MCU_read_SD_512Byte(960,512);//MCU向SD卡读取数据,一次最多512字节(扇区,数据长度(最大为512,建议填512))
  40.         P0=BUFFER_DATA[0];
  41.        
  42.         {
  43.                 从SD卡读取数据:
  44.                 先运行MCU_read_SD_512Byte(960,512);
  45.                 这里的960为你要读的SD扇区,512位一次性读取的数据大小,为512字节,建议填512字节,因为1个扇区的大小为512字节
  46.                 完成后数据存放在数据缓冲数组BUFFER_DATA中
  47.                
  48.                 因为没有现象的话不好判断SD卡读写是否成功,所以把P0BUFFER_DATA[0]赋给P0,P0接LED灯,就可以看见现象了
  49.         }

  50.         {
  51.                 注意:将程序下载到开发板后可能会出现P0口显示的数据和SD卡写入数据不一致的情况
  52.                 这时,
  53.                         要将开发板和SD卡模块断电
  54.                         要将开发板和SD卡模块断电
  55.                         要将开发板和SD卡模块断电
  56.                         不是复位
  57.                         不是复位
  58.                         不是复位
  59.                 将开发板断电后再上电,就可以看见现象了
  60.                 如果还不成功,
  61.                         检查连线是否正确
  62.                         检查连线是否正确
  63.                         检查连线是否正确
  64.                 或尝试插拔SD卡
  65.                
  66.                 SD卡读写成功后,可以修改扇区和SD的写入数据多实验几次,确保万无一失
  67.         }
  68. */
复制代码

所有资料51hei提供下载:
单片机读写SD卡.rar (78.27 KB, 下载次数: 464)

没有积分的可从这里下载
链接:



作者: IdeaMing    时间: 2020-4-27 08:57
多谢分享,这些都是对新手最大的帮助。
作者: swj88ii    时间: 2020-5-4 11:02
标记一个,有时间再来详细拜读。谢谢楼主分享
作者: yechuan220    时间: 2020-10-14 12:21
多谢分享,这些都是对新手很好的。。赞
作者: 维修厮    时间: 2020-10-25 14:11
感谢分享,正在研究SD卡
作者: 分立元件    时间: 2020-11-14 11:40
非常感谢,终于找到一个可以用的程序了
作者: biren    时间: 2020-11-17 21:55
正用上,参考了。谢谢。
作者: SJ-123    时间: 2021-2-22 22:49
楼主: "SD.h"头文件可以下载还是需要自己制作呢?
作者: pengxxx    时间: 2021-2-23 09:51
SJ-123 发表于 2021-2-22 22:49
楼主: "SD.h"头文件可以下载还是需要自己制作呢?

单片机读写SD卡.rar

78.27 KB, 下载次数: 16, 下载积分: 黑币 -5


作者: suqianfu    时间: 2021-6-22 13:10
感谢大佬的无私分享。感谢!爱你喔
作者: 13205495918    时间: 2021-9-5 10:17
我有一点 想问一下,比如这个扇区写满512,再写下一个的时候时候自动进入下一个扇区还是覆盖本扇区呢?
作者: saint_lee1986    时间: 2021-11-21 23:21
13205495918 发表于 2021-9-5 10:17
我有一点 想问一下,比如这个扇区写满512,再写下一个的时候时候自动进入下一个扇区还是覆盖本扇区呢?

你搞定TF卡操作了吗?
作者: saint_lee1986    时间: 2021-11-22 00:09
        while(response)
        {
                SD_CS=1;
                SPI_write_Byte(0xFF);
                SD_CS=0;
                MCU_write_SD_command(0x01,0x00FFC000,0xFF);
                response=SD_response();
        }
我测试了新买的8G,32G内存卡,都卡在了这个地方,无法初始化,但是用之前的32g的,1g,2g的都正常,不知道是哪里问题,新的卡不支持SPI模式吗?
作者: lsh04    时间: 2021-11-22 14:06
saint_lee1986 发表于 2021-11-22 00:09
while(response)
        {
                SD_CS=1;

时格式化的格式不一样吗?
作者: saint_lee1986    时间: 2021-11-24 07:21
lsh04 发表于 2021-11-22 14:06
时格式化的格式不一样吗?

还有个问题请教你一下,关于读写时,切换block问题,0x58,0x00,0x00,0x00,0x00,0xff,这是写第一个block地址,如果要读下一个,是要将地址改为:0x58,0x00,0x00,0x02,0x00,0xff?是这样吗
作者: CXGXGG    时间: 2021-11-24 15:45
太棒了!找了好久终于找到了!
作者: xiaoxiaoguai    时间: 2022-2-25 17:19
你好,感谢分享。你那个“检测SD卡响应”的函数不怎么管用,改成如下好多了。
//检测SD卡的响应————返回0xFF,没检测到;反之检测到
u8 SD_response()
{
        u8 i;
        u8 response = 0xFF;

        for(i=0;i<9;++i)
        {
                response=SPI_read_Byte();
                if((response==0x00)||(response==0x01))
                        return response;
        }
        return response;
}
作者: 8800    时间: 2022-6-3 23:16
谢谢楼主,很有帮助
作者: 丽江春水    时间: 2023-2-28 10:20
我使用了stc32g12k128,修改了头文件包涵和相应的管脚定义,用软件模拟spi方式一次成功读写。用硬件spi方式反复试都不成功,不知是什么问题。
作者: 丽江春水    时间: 2023-2-28 10:40
使用了spi管脚选择,试过各种频率,都不行。读出来都是0.
作者: 丽江春水    时间: 2023-2-28 11:08
有没有人试过在程序中加一个清零语句?
void main()
{
        unsigned int i;

        SD_init();//SD卡初始化
        
        for(i=0;i<512;++i) BUFFER_DATA[i ]=0x7F;
        MCU_write_SD_512Byte(960,512);//MCU向SD卡写入数据,一次最多512字节(扇区,数据长度(最大为512,建议填512))
                for(i=0;i<512;++i) BUFFER_DATA[i ]=0x00;//缓冲区数据清零

        MCU_read_SD_512Byte(960,512);//MCU向SD卡读取数据,一次最多512字节(扇区,数据长度(最大为512,建议填512))
        P0=BUFFER_DATA[0];
        
        while(1);
}
我加了清零语句后发现我的读语句没起作用。用winhex打开tf卡看内存,960扇区是空白的,没有被写入内容,全是0

内存图.png (103.79 KB, 下载次数: 128)

内存图.png

作者: 河边洗脚人    时间: 2023-6-3 11:53
感谢楼主分享!
今天试了用 硬件SPI移植到STC8F2K16S2上 ,试了128M和2G的内存卡,可以正常写入,4G则失败了


作者: liucan2020    时间: 2023-8-18 17:49
非常感谢,TF卡    正是我想学的
作者: men007    时间: 2023-8-22 08:58
非常感谢, 正是想学的
作者: rz12345    时间: 2023-8-31 18:21
标记一个,有时间再来详细拜读。谢谢楼主分享
作者: npn    时间: 2023-8-31 21:19
丽江春水 发表于 2023-2-28 10:20
我使用了stc32g12k128,修改了头文件包涵和相应的管脚定义,用软件模拟spi方式一次成功读写。用硬件spi方式 ...

具有硬件SPI功能的IO口是固定的,不同型号都可能不一样。
有问题是寄存器配置有误或中断问题,使用逻辑分析仪检查时序。
作者: KFLIUYUE    时间: 2023-9-20 20:08
感谢大佬的无私分享。感谢!爱你喔
作者: a399288395    时间: 2023-10-1 18:59
值得学习! Mark一下!
作者: jjy1039    时间: 2023-11-19 08:20
你就是我的神,多谢无私奉献
作者: l630034911    时间: 2024-4-1 11:12
谢谢大神分享代码
作者: gzgy    时间: 2024-4-7 09:48
谢谢分享!新手学习很需要这样的帖子。
作者: xiaoyao166ny    时间: 2024-5-5 21:35
//SD卡初始化
u8 SD_init()
{
        u8 i;
        u8 response=0x01;
       
        SD_CS=1;
        for(i=0;i<10;++i) SPI_write_Byte(0xFF);
        SD_CS=0;
       
        MCU_write_SD_command(0x00,0x00000000,0x95);//发送命令0将MMC置于SPI模式

        response=SD_response();

        if(response!=0x01) return 0;
        while(response)
        {
                SD_CS=1;
                SPI_write_Byte(0xFF);
                SD_CS=0;
                MCU_write_SD_command(0x01,0x00FFC000,0xFF);
                response=SD_response();
        }
        SD_CS=1;
        SPI_write_Byte(0xFF);
        楼主 cmd1 是mmc 初始化  我用sd 卡cmd1 命令回应不正确  好坑啊  有sd 的没 给新人学习下把 搞了一个多星期啊  我好想哭啊




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1