找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9393|回复: 30
收起左侧

单片机软件SPI和硬件SPI读写SD卡,TF卡测试程序

  [复制链接]
ID:658665 发表于 2020-4-26 23:24 | 显示全部楼层 |阅读模式
软件SPI和硬件SPI读写SD卡,TF卡测试程序
SD卡模块和SD卡
0.png


软件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, 下载次数: 451)

评分

参与人数 4黑币 +65 收起 理由
小当 + 5
13487086265 + 5 绝世好帖!
1679079206 + 5 赞一个!
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:276663 发表于 2020-4-27 08:57 | 显示全部楼层
多谢分享,这些都是对新手最大的帮助。
回复

使用道具 举报

ID:586074 发表于 2020-5-4 11:02 | 显示全部楼层
标记一个,有时间再来详细拜读。谢谢楼主分享
回复

使用道具 举报

ID:259035 发表于 2020-10-14 12:21 | 显示全部楼层
多谢分享,这些都是对新手很好的。。赞
回复

使用道具 举报

ID:834302 发表于 2020-10-25 14:11 | 显示全部楼层
感谢分享,正在研究SD卡
回复

使用道具 举报

ID:382699 发表于 2020-11-14 11:40 | 显示全部楼层
非常感谢,终于找到一个可以用的程序了
回复

使用道具 举报

ID:705471 发表于 2020-11-17 21:55 | 显示全部楼层
正用上,参考了。谢谢。
回复

使用道具 举报

ID:495990 发表于 2021-2-22 22:49 | 显示全部楼层
楼主: "SD.h"头文件可以下载还是需要自己制作呢?
回复

使用道具 举报

ID:658665 发表于 2021-2-23 09:51 | 显示全部楼层
SJ-123 发表于 2021-2-22 22:49
楼主: "SD.h"头文件可以下载还是需要自己制作呢?

单片机读写SD卡.rar

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

回复

使用道具 举报

ID:718536 发表于 2021-6-22 13:10 | 显示全部楼层
感谢大佬的无私分享。感谢!爱你喔
回复

使用道具 举报

ID:908826 发表于 2021-9-5 10:17 | 显示全部楼层
我有一点 想问一下,比如这个扇区写满512,再写下一个的时候时候自动进入下一个扇区还是覆盖本扇区呢?
回复

使用道具 举报

ID:983266 发表于 2021-11-21 23:21 | 显示全部楼层
13205495918 发表于 2021-9-5 10:17
我有一点 想问一下,比如这个扇区写满512,再写下一个的时候时候自动进入下一个扇区还是覆盖本扇区呢?

你搞定TF卡操作了吗?
回复

使用道具 举报

ID:983266 发表于 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模式吗?
回复

使用道具 举报

ID:513213 发表于 2021-11-22 14:06 | 显示全部楼层
saint_lee1986 发表于 2021-11-22 00:09
while(response)
        {
                SD_CS=1;

时格式化的格式不一样吗?
回复

使用道具 举报

ID:983266 发表于 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?是这样吗
回复

使用道具 举报

ID:972156 发表于 2021-11-24 15:45 | 显示全部楼层
太棒了!找了好久终于找到了!
回复

使用道具 举报

ID:830688 发表于 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;
}
回复

使用道具 举报

ID:961457 发表于 2022-6-3 23:16 | 显示全部楼层
谢谢楼主,很有帮助
回复

使用道具 举报

ID:1039438 发表于 2023-2-28 10:20 | 显示全部楼层
我使用了stc32g12k128,修改了头文件包涵和相应的管脚定义,用软件模拟spi方式一次成功读写。用硬件spi方式反复试都不成功,不知是什么问题。
回复

使用道具 举报

ID:1039438 发表于 2023-2-28 10:40 | 显示全部楼层
使用了spi管脚选择,试过各种频率,都不行。读出来都是0.
回复

使用道具 举报

ID:1039438 发表于 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
回复

使用道具 举报

ID:229375 发表于 2023-6-3 11:53 | 显示全部楼层
感谢楼主分享!
今天试了用 硬件SPI移植到STC8F2K16S2上 ,试了128M和2G的内存卡,可以正常写入,4G则失败了

回复

使用道具 举报

ID:1040201 发表于 2023-8-18 17:49 | 显示全部楼层
非常感谢,TF卡    正是我想学的
回复

使用道具 举报

ID:1063561 发表于 2023-8-22 08:58 | 显示全部楼层
非常感谢, 正是想学的
回复

使用道具 举报

ID:819198 发表于 2023-8-31 18:21 | 显示全部楼层
标记一个,有时间再来详细拜读。谢谢楼主分享
回复

使用道具 举报

ID:57657 发表于 2023-8-31 21:19 | 显示全部楼层
丽江春水 发表于 2023-2-28 10:20
我使用了stc32g12k128,修改了头文件包涵和相应的管脚定义,用软件模拟spi方式一次成功读写。用硬件spi方式 ...

具有硬件SPI功能的IO口是固定的,不同型号都可能不一样。
有问题是寄存器配置有误或中断问题,使用逻辑分析仪检查时序。
回复

使用道具 举报

ID:1030215 发表于 2023-9-20 20:08 | 显示全部楼层
感谢大佬的无私分享。感谢!爱你喔
回复

使用道具 举报

ID:230500 发表于 2023-10-1 18:59 | 显示全部楼层
值得学习! Mark一下!
回复

使用道具 举报

ID:92781 发表于 2023-11-19 08:20 来自手机 | 显示全部楼层
你就是我的神,多谢无私奉献
回复

使用道具 举报

ID:17521 发表于 2024-4-1 11:12 | 显示全部楼层
谢谢大神分享代码
回复

使用道具 举报

ID:1112603 发表于 2024-4-7 09:48 | 显示全部楼层
谢谢分享!新手学习很需要这样的帖子。
回复

使用道具 举报

ID:79094 发表于 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 的没 给新人学习下把 搞了一个多星期啊  我好想哭啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表