亿加合和智能车制作

标题: SD卡调试一册通v100 上 [打印本页]

作者: xcsjava    时间: 2009-12-2 19:47
标题: SD卡调试一册通v100 上
本帖最后由 xcsjava 于 2009-12-4 22:00 编辑

         大学生电子制作店:
努力给你最好的,有我你更强!

                     淘宝:http://shop57663993.taobao.com/


SD卡调试一册通v100



Madeby:cumt_liang

[attach]796[/attach]   

[attach]801[/attach]一序言:

2009年第四届北京总决赛看到很多学校在用sd卡调试小车,清华的用无线的。上大这项技术都用了2年了,如果第五届小车,你还没有用到SD卡,你是不是OUT了?

   SD有两种操作模式:SD 卡模式,SPI 模式。SD 卡模式不介绍。一般用SPI模式操作。如何你不知道什么是SPI,可以看看SPI的协议。飞思卡尔从MC9S08就有spi模块在绝大部分MCU里都有,DG128,XS128当然也有。我今天介绍的也是SPI模式,接口简单,移植也方便,速度也不慢, 一般都在1m/s。配合比较好的卡使用高速的SPI模式20M/S是很容易达到的(对我们来说:)


想在DG128,XS128上用SD卡的话,首先把SD最简单的操作搞清楚再前进。 但是FAT文件是非常有用的。创建文件、写文件、修改文件、删除文件、创建目录是FAT文件最大的好处,而且可以在电脑上识别到SD的数据。

二Sd认知:

闲话少说,先看一下sd 和他在spi模式下的电路连接,及其各引脚功能。

[attach]791[/attach]



图1 spi 图
图2 电路连接图spi模

[attach]792[/attach]


图3 sd卡的引脚功能

这里面有4个线特别重要如下:CLK每个时钟周期传输一个命令或数据位。频率可在0~25MHz 之间变化。SD 卡的总线管理器可以不受任何限制的自由产生0~25MHz 的频率。
作者: xcsjava    时间: 2009-12-2 19:49
回复 1# xcsjava


   

CMD令从该CMD 线上串行传输。一个命令是一次主机到从卡操作的开始。命令可以以单机寻址(寻址命令)或呼叫所有卡(广播命令)方式发送。回复从该CMD 线上串行传输。一个命令是对之前命令的回答。回复可以来自单机或所有卡。
DAT0~3:数据可以从卡传向主机或副versa。数据通过数据线传输。

三SD卡驱动:

A理论

[attach]793[/attach]

        


图4复位时序图

通用的驱动为
1.
初始化HCS12(X)的SPI接口 使用低速模式
2. 延时至少74clock
3. 发送CMD0,需要返回0x01,进入Idle状态
4. 循环发送CMD55+ACMD41,直到返回0x00,进入Ready状态
5. 设置读写block大小为512byte
6. 把SPI设置为高速模式

飞思卡尔系列的驱动:

SD cards are very similar to MMC cards. Basically the main differences from a software point of view are the initialization sequence and the access speed. An SD card requires a specific initialization sequence to enter SPI mode.

1. Set the SPI clock to 375 kbps. This is required for compatibility across a wide range of SD and MMC cards. 这里需要注意的是初始化的时候可以尽量低速必须的!100k以下最保险。

2. Provide at least 75 SPI clock cycles with the SS signal asserted to ensure that the SD card internal state machine is initialized.
发送最少75clock,并且要片选为高!

3. Send 16 SPI clocks (SS unasserted).再送16clock, 并且要片选为低!

4. Send reset command to restart the SD card in SPI mode.发送复位指令CMD55+ACMD41两种命令

为什么在使用CMD0以后不使用CMD1CMD1MMC卡使用的指令,为了实现兼容性,上电或者发送CMD0后,应该首先发送CMD55+ACMD41确认是否有回应如果有回应则为SD卡,如果等回应超时,则可能是MMC卡,再发CMD1确认。这个需要大家注意!我们发现金士顿的16m-2g的卡用CMD55+ACMD41或者cmd1都可以激活。

5. The card is continuously polled with the initialize and block-length commands until the idle bit becomes clear, indicating that the card is fully initialized and ready to respond to general commands. 剩下的就是设置块大小

6. The SPI clock is set to the maximum supported by the MCU and allowed by the SD card.

现在可以设置spi为高速了。终于可以撒开欢的跑了!!


作者: xcsjava    时间: 2009-12-2 19:52
回复 2# xcsjava


   

B 硬件知识

只介绍xs128spi驱动

[attach]794[/attach]

图5 spi硬件实现,引脚功能

void SPI_Init(void)

{


MODRR
= 0x00;


MODRR_MODRR4=1;
//
使用PM


DDRM|=0x38;
//
对照图5可知SCK0=1,MOSI=1,SS0=1本步可以忽略,这样做复位可以抗干扰下,并且直接让//片选无效


SPI0CR1 = 0x5e;

//CPOL=1,
时钟选择低有效,spsck空闲时为高电平

//CPHA=1会在发送8位数据开始sck就发生一次跳变


SPI0CR2 = 0x10;
// modfen=1 .
和上面ssoe=1 确定spimaster模式下ss位从机选择输出。并允许modf标志设置


SPI0BR
= 0x17;

//
波特率设置波特率= BR=busclk/((SPPR + 1)· 2^(SPR + 1))=80M / (1+!)*2(7+1) = =80m/512156k

}

//设置spi高速

void SPI_High()

{


SPI0BR = 0x01; //BR=busclk/((SPPR + 1)· 2^(SPR + 1))=80M / 4= 20m

}

好了看到这个该懂的都懂了,其他的也不需要懂了。

剩下的就是读写字节了,读写字节spi的底层驱动就算好了,剩下的就是fat文件系统了。

详细内容详见SD卡调试一册通v100

fat文件系统

成型的文件系统如下,详细内容详见SD卡调试一册通v100

1 sd中每40ms采集的效果图如下。插上电脑即能识别。并且可以播放。上层决策策略可以脱离小车更加直观,可靠的调试。就好像你的眼睛放在车上跑一样,所跑就是所看。时刻知道车状态。这个估计是sd卡的最大优势!

[attach]795[/attach]

上图是128*40的图片。

SD卡调试一册通v100中下,主要介绍如何提高spi速度,如何优化写入速度。如何加入文件系统。

大学生电子制作店: 努力给你最好的,有我你更强! 淘宝:http://shop57663993.taobao.com/


作者: changhao    时间: 2009-12-2 21:46
这个要顶 支持!
作者: xcsjava    时间: 2009-12-3 15:25
回复 4# changhao


   

SD卡调试一册通v100



Madeby:cumt_liang

一sd硬件

考虑到12xs单片机io口使用的是5v,而sd卡是3.3vSD卡所能接受的逻辑电平与xs128提供的逻辑电平不匹配,如果采用直接连接的话,有可能导致sd卡烧毁,而采用串接电阻的方法得计算串联的阻值,这个阻值的大小和单片机的管脚电流等有关系,得阅读大量资料,考虑到 SD卡在SPI协议的工作模式下,通讯都是单向的,于是在单片机向SD卡传输数据时采用晶体管加上拉电阻法的方案,基本电路如图6所示。而在SD卡向单片机传输数据时可以直接连接,因为它们之间的电平刚好满足上述的电平兼容原则,既经济又实用。网上关于此类电路图有很多人发布,要自己选择才能确定什么才是适合自己的。所以我们制作了一个sd通吃板,有我们认为最好的方案,也有网上的多家精华,可以自己回去根据需求焊接几个电阻。这个方案需要双电源供电、

1.电平变换电路
(一个5V电源一个3.3V电源供电),3.3V电源可以用AMS1117稳压管从5V电源稳压获取。这点特别要注意!3.3v 最好别接5V,毕竟人家官方要求这样的,不要挑战权威。(毕竟这是人家的孩子:))这个电路作者用了很好用。

二Spi软件:

   温馨提示:网上有些版本的sd程序,大家可能拿来就用了,开始搞得时候我们也是这样学习的,特别提醒大家下,特别是你的板上其他口比如pp,ph,pt,pm有摄像头或者其他的东西,拿来的程序要特别注意程序的初始化是否把这些口转换成了输入或输出口。比如我的ptp0p1接的是摄像头的行场中断,他们当然是输入模式,结果网上下的程序却把它设置成了输出口,那么你的摄像头就有被搞坏的可能。(我的就是这样坏了,心疼的兄弟跳楼了,当然实验室是一楼。)

写这种软件,怎么算才是写的好,网上流传的到底哪个好?新手

无从考察,怎么办?找官方!!有事找孩子他爹,就算不是最好的,也

是比较好的。如图3在官网找的一个实例。附件1是手册。附件2是他的程序。我们研究下。解压文件如图2所示。

      

2sd实例文件图

3 sd的一个实例使用手册

1 void SPI_Init(void)

void SPI_Init(void)

{


SPI_SS = 1;


_SPI_SS= 1;


SPI2BR = 0x14;
// 375KHz SPI clock


SPI2C2 = 0x00;


SPI2C1 = SPI2C1_SPE_MASK | SPI2C1_MSTR_MASK; //
具体含义见上册

}

查阅相关的文献 知道spi初始化,先要把Sd片选无效,然后设置工作模式,设置波特率。我们上册的初始化就是仿此的。

2 void SPI_Send_byte(byte u8Data)

void SPI_Send_byte(byte u8Data)

{


while(!SPI2S_SPTEF);


(void)SPI2S;


SPI2DL=u8Data;


while(!SPI2S_SPRF);


(void)SPI2DL;

}

左面的是官方例子。右面的我们学习改造的。

下面来说说道理。Dg128,xs128的传送与接收都用的一个寄存器spi0dr

while(!SPI2S_SPTEF);作用是看数据寄存器是否为空,只有他为空才能写数据,否则视为无效写入

(void)SPI2S;
刷新标志位,

SPI2DL=u8Data;将要写入的数据写入数据寄存器,这个时候SPI2S的响应标志会清除。

while(!SPI2S_SPRF); 1时候表示数据寄存器的内容已经传完

(void)SPI2DL; 刷新标志位,为什么要用这两个刷新标志位的指令。是因为他们的标志位需要清除,清除过程如下。

               4 标志位的清除过程

通过看图4就知道了,人家为什么有(void)SPI2DL;这个东西了。

好了到这里大家可能说,非要这样搞吗??官方就是老大吗??我不想抬扛,新手还是这样比较好,比较正统,而不是上来就自己另起炉灶搞一套。(如果你特别猛。那请走好你的路,别说我的路。:))


作者: xcsjava    时间: 2009-12-3 15:25
3 byte SPI_Receive_byte(void)

byte SPI_Receive_byte(void)

{


SPI2DL=0xFF;


while(!SPI2S_SPRF);


return(SPI2DL);

}

官例

经过上述分析我们改动一点,觉得比较合理。

好了到此为止,我们的spi底层应该说是没有问题了,如果有问题请联系freescal

三SD卡驱动

好了继续分析sd卡驱动看他是怎么写的。

/************************************************/

UINT8 SD_Init(void)

{


SPI_Init();
// SPI Initialization


SPI_SS=ENABLE;


SD_CLKDelay(10);
// Send 80 clocks


SPI_SS=DISABLE;


gu8SD_Argument.lword=0;


SD_CLKDelay(8);


/* IDLE Command */


SPI_SS=ENABLE;


if(SD_SendCommand(SD_CMD0|0x40,SD_IDLE))


{


SPI_SS=DISABLE;


return(1);
// Command IDLE fail


}


SPI_SS=DISABLE;


(void)SPI_Receive_byte();
// Dummy SPI cycle


/*
Initialize SD Command */


SPI_SS=ENABLE;


while(SD_SendCommand(SD_CMD1|0x40,SD_OK));


SPI_SS=DISABLE;


(void)SPI_Receive_byte();
// Dummy SPI cycle


/*
Block Length */


SPI_SS=ENABLE;


gu8SD_Argument.lword=SD_BLOCK_SIZE;


if(SD_SendCommand(SD_CMD16|0x40,SD_OK))


{


SPI_SS=DISABLE;


return(1);
// Command IDLE fail


}


SPI_SS=DISABLE;


SPI_High_rate();


SPI_Send_byte(0x00);


SPI_Send_byte(0x00);


//(void)SPI_Receive_byte();
// Dummy SPI cycle



return(0);

}

这里面我就不想多说了,按照这个改成右面的,有问题联系freescalSD卡调试一册通v100下,介绍如何加入文件系统。大学生电子制作店: 努力给你最好的,有我你更强! 淘宝:http://shop57663993.taobao.com/


作者: alaso12    时间: 2009-12-3 16:29
顶一下~~
作者: xcsjava    时间: 2009-12-3 21:23
大家觉得如何?写的对大家有用,大家给个掌声,兄弟会抓紧发布下部 的。如果有侮辱性语言请自己吧保留。。
作者: zdhly0401    时间: 2009-12-3 21:32

作者: leaf19881122    时间: 2009-12-3 21:36
顶```ding······
作者: xcsjava    时间: 2009-12-4 10:26
顶一下自己
作者: mtlsh    时间: 2009-12-6 14:22
期待着 下册出来~~~~~~~~·······
作者: chengyongji    时间: 2009-12-14 17:06
期待期待!!
作者: feiju    时间: 2009-12-25 14:15

作者: jpbirdy    时间: 2010-1-10 11:27
为什么没有下呢?
调人胃口了~
作者: ssclark    时间: 2010-1-17 15:38
好东西啊,顶顶
作者: ssclark    时间: 2010-1-17 15:40
好东西啊,顶顶
作者: 小什羊    时间: 2010-1-18 20:09
顶一个
作者: tc1zml    时间: 2010-1-18 20:35
好东西.....
作者: shangshu    时间: 2010-1-19 13:28
这个可以顶,这个真得顶。。。
作者: hlz512    时间: 2010-1-20 16:26
顶起
作者: lxh7792    时间: 2010-1-21 15:52
谢谢哈
作者: lxh7792    时间: 2010-1-21 15:52
谢谢哈
作者: lxh7792    时间: 2010-1-21 15:52
谢谢哈
作者: nantongxiaokang    时间: 2010-2-6 14:53
xiexie
作者: aiqing_shu    时间: 2010-3-2 00:18
好东东 顶
作者: aiqing_shu    时间: 2010-3-2 00:18
在顶。。
作者: yourchen    时间: 2010-3-2 15:18
回复 8# xcsjava


   还有没有下部的?谢谢?
作者: pkmaoqiao    时间: 2010-3-5 13:20
谢谢
作者: pkmaoqiao    时间: 2010-3-5 13:20
非常谢谢
作者: 凌风    时间: 2010-3-5 13:24
太好了 真是好东西
作者: zc1991129    时间: 2010-3-5 20:11
Thanks!!!!!!!!!!!!!!!
作者: dghhz    时间: 2010-3-8 10:17
weretwt
作者: zhadaolong_1    时间: 2010-3-8 12:19
新手上路,学习了,顶顶顶!!!
作者: zhadaolong_1    时间: 2010-3-8 12:24
没看到下啊  还有没有啊?
作者: wcl5335380    时间: 2010-3-10 22:05
dddd
作者: wcl5335380    时间: 2010-3-10 22:05
dfffff
作者: wcl5335380    时间: 2010-3-10 22:05
ggggg
作者: rivenlong    时间: 2010-3-11 21:23

作者: yangchunlin    时间: 2010-3-12 19:35
顶一下
作者: Deagle    时间: 2010-3-13 19:48
挺好的
作者: Deagle    时间: 2010-3-13 19:49
又看了一下中 还不错
作者: deng0620    时间: 2010-3-13 22:49
谢谢楼主
作者: xcsjava    时间: 2010-3-14 14:18
目前三册基本全了,有意的请留下email.三册全部打包送。。
作者: xsmart    时间: 2010-3-14 17:23
回复 44# xcsjava


gjhy2009@yeah.net
谢谢分享了~
作者: 剑灵秀    时间: 2010-3-16 18:29
hao!!!!!!!!!!11
作者: 20071261    时间: 2010-3-17 13:43
hao
作者: lxh7792    时间: 2010-3-17 18:09
力顶~~~
作者: crystal    时间: 2010-3-18 20:10

作者: crystal    时间: 2010-3-18 20:10

作者: crystal    时间: 2010-3-18 20:11
很good
作者: 本色英雄    时间: 2010-3-19 09:08
顶~
作者: 时代还怪    时间: 2010-3-19 14:28
lz真是太牛b了!good!
作者: 时代还怪    时间: 2010-3-19 14:55
还有下篇呢??
作者: nijianlong    时间: 2010-3-19 21:35
楼主辛苦  借鉴  谢谢
作者: zxcvb110    时间: 2010-3-19 21:54

作者: zxcvb110    时间: 2010-3-19 21:54

作者: sunjiajiang    时间: 2010-3-23 16:19
借鉴借鉴。。。
作者: puwenzheng    时间: 2010-3-24 18:51
回复 1# xcsjava


   
作者: puwenzheng    时间: 2010-3-24 18:52
回复 4# changhao


   
作者: freefly    时间: 2010-3-27 23:56
贵店的服务如何?
作者: freefly    时间: 2010-3-27 23:56
我想买一套试一试
作者: lingshuo81    时间: 2010-3-28 09:19
学习
作者: oh_mygod    时间: 2010-4-4 22:46
哇,这么好
作者: oh_mygod    时间: 2010-4-5 09:15
顶啊
作者: xixiangfeng0733    时间: 2010-4-5 10:38
非常有用啊,万分感谢!!
作者: qweasdqweasd    时间: 2010-4-5 12:24
回复 1# xcsjava


    谢谢啊
作者: liaowentian    时间: 2010-4-5 13:47
学习了
作者: xixiangfeng0733    时间: 2010-4-5 15:53

作者: seusj    时间: 2010-4-5 22:40

作者: libinchenglbc    时间: 2010-4-6 11:23
敬仰啊...
作者: sweetcab    时间: 2010-4-7 21:36
很好
作者: sweetcab    时间: 2010-4-7 21:36
太谢谢楼主了
作者: qq380779180    时间: 2010-4-8 00:35
ddddddddd
作者: he2010    时间: 2010-4-8 16:01

作者: mrxqk    时间: 2010-4-14 16:14
你那里有卖的吗?
作者: tom2002    时间: 2010-4-16 23:01
谢谢~
作者: zou317    时间: 2010-4-17 22:08

作者: oo7ak47666    时间: 2010-4-18 02:57
学习一下
作者: qhzbob    时间: 2010-4-19 00:30
顶一下
作者: san4852391    时间: 2010-4-19 22:21
O(∩_∩)O谢谢
作者: san4852391    时间: 2010-4-19 22:37
XIEXIE
作者: 416446891    时间: 2010-4-20 10:27
顶~!
作者: 416446891    时间: 2010-4-20 10:27
为什么不+贡献?
作者: treebenjamin    时间: 2010-4-21 20:23
faffasfsafa  kankan
作者: ddgg110    时间: 2010-4-21 20:53
不错,学习了
作者: happyfred    时间: 2010-4-23 10:22
不错,建议给楼主加分
作者: happyfred    时间: 2010-4-23 10:22
再顶一个,为了下载,不好意思!
作者: happyfred    时间: 2010-4-23 10:22
再顶一个,为了下载,不好意思!
作者: treebenjamin    时间: 2010-4-24 12:03
下来研究研究
作者: treebenjamin    时间: 2010-4-24 12:03
再看看
作者: treebenjamin    时间: 2010-4-24 12:03
再看看
作者: beam    时间: 2010-4-24 12:50
太感谢了!
作者: nanxiaoguax    时间: 2010-4-29 18:20

作者: redlhl    时间: 2010-4-30 19:29
很好很强大
作者: huachou    时间: 2010-5-1 21:20
这个要顶啊
作者: zhug    时间: 2010-5-8 00:47
顶!!!!
作者: firec    时间: 2010-5-8 08:01
学习中,回帖为了更好的down
作者: zhug    时间: 2010-5-8 11:18
再顶!!
作者: lfeng1_1    时间: 2010-5-8 11:21
ding!!1




欢迎光临 亿加合和智能车制作 (http://www.znczz.com/) Powered by Discuz! X3.2