SD卡读卡程序 C语言 IO模拟,请问大神些,有谁用过SD模式读写SD卡?时序是用单片机IO模拟。...
大家读写SD卡怎么不用SD模式方式读取,是SPI方式读取简单?
下面贴一段代码,是在FPGA上程序,只能用SD模式进行读,没有文件系统,没有用AVR硬件实现,
电路图:
image001.jpg (23.4 KB, 下载次数: 113)
2015-4-20 17:54 上传
电路说明,SD_DAT3一直给高电平
程序:
#ifndef __SD_Card_H__
#define __SD_Card_H__
#define High 1
#define Low 0
//-------------------------------------------------------------------------
// SD Card Set I/O Direction
#define SD_CMD_IN DDRX.1 = Low
#define SD_CMD_OUT DDRX.1 = High
#define SD_DAT_IN DDRX.2 = Low
#define SD_DAT_OUT DDRX.2 = High
#define SD_CLK_OUT DDRX.3 = High
#define SD_DAT3_OUT DDRX.0 = High
// SD Card Output High/Low
#define SD_CMD_LOW PORTX.1 = Low
#define SD_CMD_HIGH PORTX.1 = High
#define SD_DAT_LOW PORTX.2 = Low
#define SD_DAT_HIGH PORTX.2 = High
#define SD_CLK_LOW PORTX.3 = Low
#define SD_CLK_HIGH PORTX.3 = High
#define SD_DAT3_HIGH PORTX.0 = High
// SD Card Input Read
#define SD_TEST_CMD PINX.1
#define SD_TEST_DAT PINX.2
//-------------------------------------------------------------------------
#define BYTE unsigned char
#define UINT16 unsigned int
#define UINT32 unsigned long
//-------------------------------------------------------------------------
void Ncr(void);
void Ncc(void);
BYTE response_R(BYTE);
BYTE send_cmd(BYTE *);
BYTE SD_read_lba(BYTE *,UINT32,UINT32);
BYTE SD_card_init(void);
//-------------------------------------------------------------------------
BYTE read_status;
BYTE response_buffer[20];
BYTE RCA[2];
BYTE cmd_buffer[5];
const BYTE cmd0[5] = {0x40,0x00,0x00,0x00,0x00};
const BYTE cmd55[5] = {0x77,0x00,0x00,0x00,0x00};
const BYTE cmd2[5] = {0x42,0x00,0x00,0x00,0x00};
const BYTE cmd3[5] = {0x43,0x00,0x00,0x00,0x00};
const BYTE cmd7[5] = {0x47,0x00,0x00,0x00,0x00};
const BYTE cmd9[5] = {0x49,0x00,0x00,0x00,0x00};
const BYTE cmd16[5] = {0x50,0x00,0x00,0x02,0x00};
const BYTE cmd17[5] = {0x51,0x00,0x00,0x00,0x00};
const BYTE acmd6[5] = {0x46,0x00,0x00,0x00,0x02};
const BYTE acmd41[5] = {0x69,0x0f,0xf0,0x00,0x00};
const BYTE acmd51[5] = {0x73,0x00,0x00,0x00,0x00};
//-------------------------------------------------------------------------
void Ncr(void)
{
SD_CMD_IN;
SD_CLK_LOW;
SD_CLK_HIGH;
SD_CLK_LOW;
SD_CLK_HIGH;
}
//-------------------------------------------------------------------------
void Ncc(void)
{
int i;
for(i=0;i<8;i++)
{
SD_CLK_LOW;
SD_CLK_HIGH;
}
}
//-------------------------------------------------------------------------
BYTE SD_card_init(void)
{
BYTE x,y;
SD_CMD_OUT;
SD_DAT_IN;
SD_CLK_HIGH;
SD_CMD_HIGH;
SD_DAT_LOW;
read_status=0;
for(x=0;x<40;x++)
Ncr();
for(x=0;x<5;x++)
cmd_buffer[x]=cmd0[x];
y = send_cmd(cmd_buffer);
do
{
for(x=0;x<40;x++);
Ncc();
for(x=0;x<5;x++)
cmd_buffer[x]=cmd55[x];
y = send_cmd(cmd_buffer);
Ncr();
if(response_R(1)>1) //response too long or crc error
return 1;
Ncc();
for(x=0;x<5;x++)
cmd_buffer[x]=acmd41[x];
y = send_cmd(cmd_buffer);
Ncr();
} while(response_R(3)==1);
Ncc();
for(x=0;x<5;x++)
cmd_buffer[x]=cmd2[x];
y = send_cmd(cmd_buffer);
Ncr();
if(response_R(2)>1)
return 1;
Ncc();
for(x=0;x<5;x++)
cmd_buffer[x]=cmd3[x];
y = send_cmd(cmd_buffer);
Ncr();
if(response_R(6)>1)
return 1;
RCA[0]=response_buffer[1];
RCA[1]=response_buffer[2];
Ncc();
for(x=0;x<5;x++)
cmd_buffer[x]=cmd9[x];
cmd_buffer[1] = RCA[0];
cmd_buffer[2] = RCA[1];
y = send_cmd(cmd_buffer);
Ncr();
if(response_R(2)>1)
return 1;
Ncc();
for(x=0;x<5;x++)
cmd_buffer[x]=cmd7[x];
cmd_buffer[1] = RCA[0];
cmd_buffer[2] = RCA[1];
y = send_cmd(cmd_buffer);
Ncr();
if(response_R(1)>1)
return 1;
Ncc();
for(x=0;x<5;x++)
cmd_buffer[x]=cmd16[x];
y = send_cmd(cmd_buffer);
Ncr();
if(response_R(1)>1)
return 1;
read_status =1; //sd card ready
return 0;
}
//-------------------------------------------------------------------------
BYTE SD_read_lba(BYTE *buff,UINT32 lba,UINT32 seccnt)
{
BYTE c=0;
UINT32 i,j;
lba+=101;
for(j=0;j
{
{
Ncc();
cmd_buffer[0] = cmd17[0];
cmd_buffer[1] = (lba>>15)&0xff;
cmd_buffer[2] = (lba>>7)&0xff;
cmd_buffer[3] = (lba<<1)&0xff;
cmd_buffer[4] = 0;
lba++;
send_cmd(cmd_buffer);
Ncr();
}
while(1)
{
SD_CLK_LOW;
SD_CLK_HIGH;
if(!(SD_TEST_DAT))
break;
}
for(i=0;i<512;i++)
{
BYTE k;
for(k=0;k<8;k++)
{
SD_CLK_LOW;
SD_CLK_HIGH;
c <<= 1;
if(SD_TEST_DAT)
c |= 0x01;
}
*buff=c;
buff++;
}
for(i=0; i<16; i++)
{
SD_CLK_LOW;
SD_CLK_HIGH;
}
}
read_status = 1; //SD data next in
return 0;
}
//-------------------------------------------------------------------------
BYTE response_R(BYTE s)
{
BYTE a=0,b=0,c=0,r=0,crc=0;
BYTE i,j=6,k;
while(1)
{
SD_CLK_LOW;
SD_CLK_HIGH;
if(!(SD_TEST_CMD))
break;
if(crc++ >100)
return 2;
}
crc =0;
if(s == 2)
j = 17;
for(k=0; k
{
c = 0;
if(k > 0) //for crc culcar
b = response_buffer[k-1];
for(i=0; i<8; i++)
{
SD_CLK_LOW;
if(a > 0)
c <<= 1;
else
i++;
a++;
SD_CLK_HIGH;
if(SD_TEST_CMD)
c |= 0x01;
if(k > 0)
{
crc <<= 1;
if((crc ^ b) & 0x80)
crc ^= 0x09;
b <<= 1;
crc &= 0x7f;
}
}
if(s==3)
{
if( k==1 &&(!(c&0x80)))
r=1;
}
response_buffer[k] = c;
}
if(s==1 || s==6)
{
if(c != ((crc<<1)+1))
r=2;
}
return r;
}
//-------------------------------------------------------------------------
BYTE send_cmd(BYTE *in)
{
int i,j;
BYTE b,crc=0;
SD_CMD_OUT;
for(i=0; i < 5; i++)
{
b = in[ i ];
for(j=0; j<8; j++)
{
SD_CLK_LOW;
if(b&0x80)
SD_CMD_HIGH;
else
SD_CMD_LOW;
crc <<= 1;
SD_CLK_HIGH;
if((crc ^ b) & 0x80)
crc ^= 0x09;
b<<=1;
}
crc &= 0x7f;
}
crc =((crc<<1)|0x01);
b = crc;
for(j=0; j<8; j++)
{
SD_CLK_LOW;
if(crc&0x80)
SD_CMD_HIGH;
else
SD_CMD_LOW;
SD_CLK_HIGH;
crc<<=1;
}
return b;
}
//-------------------------------------------------------------------------
#endif
这些程序有些我也不明白,贴出来希望大家一起探讨交流,打破网站SD卡用SPI方式读写的垄断局面,哈哈
sd模式下应该有4各data吧,怎么你的只用一个?
SPI模式 是1Bit的
SD模式 是1Bit或4Bit
SD卡确实也像USB一样分为全速(FULL-SPEED)卡和低速卡(LOW-SPEED)。全速卡支持SPI,
1BIT和4BIT的传输模式,可以工作在0-25MHz,并且可以提供高达10MB/S的传输速率;低速卡
仅支持SPI和1BIT的传输模式,4BIT属于可选模式,可以工作在0-400KHz.
在SD模式下,用软件将数据拆分,计算CRC16的时间都占了大头,实际速度不比SPI模式快多少!
SD模式的读有优势吧。写的时候SD模式下就多了CRC16(刚接触实际的东西,所以不太了解CRC16的时间问题,见笑),但是读不管哪种模式下,不是都有CRC校验的?SD模式到底还有那些优势呢,请教
关注一下,SD的读写方式资料太少,或是英文资料太难看
SD卡读卡程序 C语言 IO模拟,请问大神些,有谁用过SD模式读写SD卡?时序是用单片机IO模拟。...相关推荐
- 雪花飞舞的java程序_【图片】请问大神帮我看看一段代码,老是提示空指针异常【java吧】_百度贴吧...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 import java.io.*; import java.util.*; class JavaFileList { public static void ...
- STM32开发板入门教程(十三) - SPI模式读写SD卡
功能介绍 :使用SPI模式 读写SD卡block数据 可通过串口发送到PC机查看 SD卡是Secure Digital Card卡的简称,直译成汉语就是"安全数字卡",是由日本松下 ...
- 卡达8梯控系统怎么破解求大神指点迷津谢谢!!!
这里写自定义目录标题 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一 ...
- 关于PHP程序员技术职业生涯规划--swool大神韩天峰
关于PHP程序员技术职业生涯规划–swool大神韩天峰 看到很多PHP程序员职业规划的文章,都是直接上来就提Linux.PHP.MySQL.Nginx.Redis.Memcache.jQuery这些, ...
- c语言循环读文件程序,c语言读文件程序报告.docx
----------专业最好文档,专业为你服务,急你所急,供你所需-------------文档下载最佳的地方 ----------专业最好文档,专业为你服务,急你所急,供你所需----------- ...
- C语言是菜鸟和大神的分水岭
作为一门古老的编程语言,C语言已经坚挺了好几十年了,初学者从C语言入门,大学将C语言视为基础课程.不管别人如何抨击,如何唱衰,C语言就是屹立不倒:Java.C#.Python.PHP.Perl 等都有 ...
- 魔百盒服务器响应超时,大神支招:让你的魔百盒不再卡顿
最近有多用户都在群里抱怨说,自家的电视盒子越来越卡,卡的都不能看直播,巨奔溃.其实这些问题都是长期不合理使用导致的,如果你平时使用的时候能够好好保养电视盒子的话,基本上是不会出现卡顿问题的. 今天小编 ...
- c语言程序图片马赛克,关于c语言的图像均值滤波 请问大神为什么我的结果都是马赛克...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #include #include #include #include #include "stdlib.h ...
- 理解C语言——从小菜到大神的晋级之路(1)——引言:C语言的前世今生
第一课的视频链接点这里 C语言是现在应用最为广泛的编程语言之一,也是现在依然流行的编程语言中历史最悠久的一种之一.在目前业界广泛使用的编程语言中,许多 种语言是以C为基础发展而来.在多类大学的工程类专 ...
最新文章
- iOS传感器:实现一个随屏幕旋转的图片
- 【Cocos2dx开发】精灵
- mac安装opencv
- 蓝桥杯_算法训练_Torry的困惑(基本型)
- 修改linux默认启动级别(包括Ubuntu)
- 执行远程服务器上的脚本失败?(环境变量引起的问题)
- 【语法】iOS(一)ObjectC的语法
- 了解更多关于11gR2 diskmon
- 【XJTUSE 计算机组成与结构笔记】第十四章 指令级并行性和超标量处理
- 网页设计Dreamweaver【2】
- 在用友U8V13.0erp软件供应链管理的存货核算模块中正常单据记账后,查看存货核算的收发存汇总表时,发现存货有数量但没有结存金额,应如何调整?
- java 中rest,Java中的REST调用
- 解读BLM业务领先模型中的业务设计
- c语言eallow,求大神指导C语言框图设计!!!
- ultraos win10启动盘_使用ultraiso软件制Win10专业版U盘系统盘制作安装教程
- 一条命令在 Ubuntu 中安装所有基本的媒体编解码器
- 用php造了一个地址自动识别功能
- vector之resize剖析-曾经的我以为自己真的学会了vector
- win7文件夹工作组指定计算机共享,Win7工作组局域网文件共享需启动的服务
- 预测微前端的未来 - luca
热门文章
- Redis可视化工具(WEB端)
- Linux系统中的链接文件
- CVE-2020-14750: Weblogic Console 验证绕过漏洞通告
- mysql带有in的子查询_含有IN的子查询
- TCP的拥塞控制简介
- 数据结构(双链表/循环链表例题 )
- 苹果6系统怎么更新不了_苹果推送iOS 13.6 测试版:新增系统自定义自动更新开关...
- 【QT】资源文件导入
- log4j的ConversionPattern
- 垃圾回收之垃圾回收算法(标记清除、标记整理、复制)、分代垃圾回收