大家读写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模拟。...相关推荐

  1. 雪花飞舞的java程序_【图片】请问大神帮我看看一段代码,老是提示空指针异常【java吧】_百度贴吧...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 import java.io.*; import java.util.*; class JavaFileList { public static void ...

  2. STM32开发板入门教程(十三) - SPI模式读写SD卡

    功能介绍 :使用SPI模式 读写SD卡block数据 可通过串口发送到PC机查看 SD卡是Secure Digital Card卡的简称,直译成汉语就是"安全数字卡",是由日本松下 ...

  3. 卡达8梯控系统怎么破解求大神指点迷津谢谢!!!

    这里写自定义目录标题 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一 ...

  4. 关于PHP程序员技术职业生涯规划--swool大神韩天峰

    关于PHP程序员技术职业生涯规划–swool大神韩天峰 看到很多PHP程序员职业规划的文章,都是直接上来就提Linux.PHP.MySQL.Nginx.Redis.Memcache.jQuery这些, ...

  5. c语言循环读文件程序,c语言读文件程序报告.docx

    ----------专业最好文档,专业为你服务,急你所急,供你所需-------------文档下载最佳的地方 ----------专业最好文档,专业为你服务,急你所急,供你所需----------- ...

  6. C语言是菜鸟和大神的分水岭

    作为一门古老的编程语言,C语言已经坚挺了好几十年了,初学者从C语言入门,大学将C语言视为基础课程.不管别人如何抨击,如何唱衰,C语言就是屹立不倒:Java.C#.Python.PHP.Perl 等都有 ...

  7. 魔百盒服务器响应超时,大神支招:让你的魔百盒不再卡顿

    最近有多用户都在群里抱怨说,自家的电视盒子越来越卡,卡的都不能看直播,巨奔溃.其实这些问题都是长期不合理使用导致的,如果你平时使用的时候能够好好保养电视盒子的话,基本上是不会出现卡顿问题的. 今天小编 ...

  8. c语言程序图片马赛克,关于c语言的图像均值滤波 请问大神为什么我的结果都是马赛克...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #include #include #include #include #include "stdlib.h ...

  9. 理解C语言——从小菜到大神的晋级之路(1)——引言:C语言的前世今生

    第一课的视频链接点这里 C语言是现在应用最为广泛的编程语言之一,也是现在依然流行的编程语言中历史最悠久的一种之一.在目前业界广泛使用的编程语言中,许多 种语言是以C为基础发展而来.在多类大学的工程类专 ...

最新文章

  1. iOS传感器:实现一个随屏幕旋转的图片
  2. 【Cocos2dx开发】精灵
  3. mac安装opencv
  4. 蓝桥杯_算法训练_Torry的困惑(基本型)
  5. 修改linux默认启动级别(包括Ubuntu)
  6. 执行远程服务器上的脚本失败?(环境变量引起的问题)
  7. 【语法】iOS(一)ObjectC的语法
  8. 了解更多关于11gR2 diskmon
  9. 【XJTUSE 计算机组成与结构笔记】第十四章 指令级并行性和超标量处理
  10. 网页设计Dreamweaver【2】
  11. 在用友U8V13.0erp软件供应链管理的存货核算模块中正常单据记账后,查看存货核算的收发存汇总表时,发现存货有数量但没有结存金额,应如何调整?
  12. java 中rest,Java中的REST调用
  13. 解读BLM业务领先模型中的业务设计
  14. c语言eallow,求大神指导C语言框图设计!!!
  15. ultraos win10启动盘_使用ultraiso软件制Win10专业版U盘系统盘制作安装教程
  16. 一条命令在 Ubuntu 中安装所有基本的媒体编解码器
  17. 用php造了一个地址自动识别功能
  18. vector之resize剖析-曾经的我以为自己真的学会了vector
  19. win7文件夹工作组指定计算机共享,Win7工作组局域网文件共享需启动的服务
  20. 预测微前端的未来 - luca

热门文章

  1. Redis可视化工具(WEB端)
  2. Linux系统中的链接文件
  3. CVE-2020-14750: Weblogic Console 验证绕过漏洞通告
  4. mysql带有in的子查询_含有IN的子查询
  5. TCP的拥塞控制简介
  6. 数据结构(双链表/循环链表例题 )
  7. 苹果6系统怎么更新不了_苹果推送iOS 13.6 测试版:新增系统自定义自动更新开关...
  8. 【QT】资源文件导入
  9. log4j的ConversionPattern
  10. 垃圾回收之垃圾回收算法(标记清除、标记整理、复制)、分代垃圾回收