智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 45935|回复: 190
打印 上一主题 下一主题

SD卡调试一册通v100 上

  [复制链接]

45

主题

277

帖子

0

精华

杰出人士

Rank: 12Rank: 12Rank: 12

积分
12254

论坛元老奖章

威望
1516
贡献
10106
兑换币
289
注册时间
2008-5-19
在线时间
316 小时
跳转到指定楼层
1#
发表于 2009-12-2 19:47:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 xcsjava 于 2009-12-4 22:00 编辑

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

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


SD卡调试一册通v100



Madeby:cumt_liang

   

一序言:

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模式下的电路连接,及其各引脚功能。



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


图3 sd卡的引脚功能

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

45

主题

277

帖子

0

精华

杰出人士

Rank: 12Rank: 12Rank: 12

积分
12254

论坛元老奖章

威望
1516
贡献
10106
兑换币
289
注册时间
2008-5-19
在线时间
316 小时
2#
 楼主| 发表于 2009-12-2 19:49:03 | 只看该作者
回复 1# xcsjava


   

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

三SD卡驱动:

A理论

        


图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为高速了。终于可以撒开欢的跑了!!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

45

主题

277

帖子

0

精华

杰出人士

Rank: 12Rank: 12Rank: 12

积分
12254

论坛元老奖章

威望
1516
贡献
10106
兑换币
289
注册时间
2008-5-19
在线时间
316 小时
3#
 楼主| 发表于 2009-12-2 19:52:29 | 只看该作者
回复 2# xcsjava


   

B 硬件知识

只介绍xs128spi驱动

图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卡的最大优势!

上图是128*40的图片。

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

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

5

主题

206

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2526
威望
413
贡献
1707
兑换币
0
注册时间
2009-8-22
在线时间
203 小时
4#
发表于 2009-12-2 21:46:04 | 只看该作者
这个要顶 支持!
回复 支持 反对

使用道具 举报

45

主题

277

帖子

0

精华

杰出人士

Rank: 12Rank: 12Rank: 12

积分
12254

论坛元老奖章

威望
1516
贡献
10106
兑换币
289
注册时间
2008-5-19
在线时间
316 小时
5#
 楼主| 发表于 2009-12-3 15:25:15 | 只看该作者
回复 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;这个东西了。

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

回复 支持 反对

使用道具 举报

45

主题

277

帖子

0

精华

杰出人士

Rank: 12Rank: 12Rank: 12

积分
12254

论坛元老奖章

威望
1516
贡献
10106
兑换币
289
注册时间
2008-5-19
在线时间
316 小时
6#
 楼主| 发表于 2009-12-3 15:25:30 | 只看该作者
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/

回复 支持 反对

使用道具 举报

1

主题

143

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1336
威望
791
贡献
343
兑换币
100
注册时间
2009-8-6
在线时间
101 小时
7#
发表于 2009-12-3 16:29:49 | 只看该作者
顶一下~~
回复 支持 反对

使用道具 举报

45

主题

277

帖子

0

精华

杰出人士

Rank: 12Rank: 12Rank: 12

积分
12254

论坛元老奖章

威望
1516
贡献
10106
兑换币
289
注册时间
2008-5-19
在线时间
316 小时
8#
 楼主| 发表于 2009-12-3 21:23:51 | 只看该作者
大家觉得如何?写的对大家有用,大家给个掌声,兄弟会抓紧发布下部 的。如果有侮辱性语言请自己吧保留。。
回复 支持 反对

使用道具 举报

22

主题

518

帖子

0

精华

版主

Rank: 9Rank: 9Rank: 9

积分
6442
QQ
威望
943
贡献
5041
兑换币
99
注册时间
2008-2-26
在线时间
229 小时
9#
发表于 2009-12-3 21:32:18 | 只看该作者
回复 支持 反对

使用道具 举报

0

主题

37

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
445
QQ
威望
280
贡献
55
兑换币
0
注册时间
2009-4-3
在线时间
55 小时
10#
发表于 2009-12-3 21:36:23 | 只看该作者
顶```ding······
回复 支持 反对

使用道具 举报

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

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-12-25 15:08 , Processed in 0.407464 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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