智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 1838|回复: 10
打印 上一主题 下一主题

SD卡,求助!!!!!!!!

[复制链接]

3

主题

70

帖子

0

精华

高级会员

Rank: 4

积分
661
威望
325
贡献
204
兑换币
207
注册时间
2015-1-21
在线时间
66 小时
毕业学校
陕西科技大学
跳转到指定楼层
1#
发表于 2015-2-4 21:09:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近打算开始看SD卡的资料,SD卡到底可以用来干什么呢?感觉好高大上的样子,谁有相关的资料可以共享一下吗?
回复

使用道具 举报

162

主题

2048

帖子

5

精华

超级版主

岳麓山没有车神

Rank: 10Rank: 10Rank: 10

积分
14920

论坛元老奖章优秀会员奖章活跃会员奖章论坛骨干奖章在线王奖章优秀版主奖章资源大师奖章

QQ
威望
6285
贡献
5963
兑换币
2581
注册时间
2013-11-14
在线时间
1336 小时
2#
发表于 2015-2-4 21:15:04 | 只看该作者
资料全丢了。只剩下代码了。
uint8 __u8_SD_WaitReady( void )
{
    uint8 r1 ;
    uint16 retry ;
    retry=0 ;
    do
    {
        r1 = __u8_SD_SPI_TXRX_(SD_SPI_USER,0,0xFF);
        if(500 == retry)//如果卡异常,会死循坏!
        {
            retry++;
            return 1 ;
        }
    }
    while(r1!=0xFF);
   
    return 0 ;
}
uint8 __u8_SD_Write_ ( uint8 command , uint32 data , uint8 CRC , uint8 isContinue )
{
    uint8 re = 0;
    uint8 wait = 0;
    __u8_SD_SPI_TXRX_(SD_SPI_USER , 0 ,   0xFF                          );
    __u8_SD_SPI_TXRX_(SD_SPI_USER , 0 ,   0xFF                          );
    SD_CS_ENABLE();
    // 命令发送
    __u8_SD_SPI_TXRX_(SD_SPI_USER , 0 ,   (0x40 | ( command & 0x3F ))   );
    __u8_SD_SPI_TXRX_(SD_SPI_USER , 0 ,   ((data >> 24) & 0xFF)         );
    __u8_SD_SPI_TXRX_(SD_SPI_USER , 0 ,   ((data >> 16) & 0xFF)         );
    __u8_SD_SPI_TXRX_(SD_SPI_USER , 0 ,   ((data >> 8) & 0xFF)          );
    __u8_SD_SPI_TXRX_(SD_SPI_USER , 0 ,   (data & 0xFF)                 );
    __u8_SD_SPI_TXRX_(SD_SPI_USER , 0 ,   (CRC)                         );
   
    while( 0xFF == (re=__u8_SD_SPI_TXRX_(SD_SPI_USER , 0 ,   0xFF)) )
    {
        wait++;
        if(wait>200)
        {
        break ;
        }
    }
    // 命令返回
   
    if(0 == isContinue)
    {
        SD_CS_DISABLE();
        __u8_SD_SPI_TXRX_(SD_SPI_USER , 0 ,   0xFF);
    }
   
    return re;
}
unsigned char __u8_SD_ReceiveData_(unsigned char*data,signed int len,unsigned char isRelease)
{
    unsigned char re ;
   
    USER_SD_CS = 0;
   
    // 等待SD卡发回数据起始令牌0xFE
   
    do
    {
        re = __u8_SD_SPI_TXRX_(SD_SPI_USER,0,0xFF);
    }
    while(re != 0xFE);
   

    while(len--)
    {
        *data = __u8_SD_SPI_TXRX_(SD_SPI_USER,0,0xFF);
        data++;
    }
   
    //下面是2个伪CRC(dummy CRC)
    __u8_SD_SPI_TXRX_(SD_SPI_USER,0,0xFF);
    __u8_SD_SPI_TXRX_(SD_SPI_USER,0,0xFF);
   
    //按需释放总线,将CS置高
    if(isRelease == 1)
    {
        //传输结束
        USER_SD_CS = 1;
        __u8_SD_SPI_TXRX_(SD_SPI_USER,0,0xFF);
    }

    return 0 ;
}
uint8 __u8_SD_Init_()
{
    // 发送复位命令 CMD0 ,CS低电平有效 - > SPI
    // DMD 55  ACMD 41 判断电压,CID,CMD16,CMD9,CSD
    // CMD23 ->  Write single block
    // CMD55 -> ACMD,CMD55 -> 特殊命令指示符
    //uint8 MaxDelay = 0;
    uint8 RecData[4]={0,0,0,0};
  
    uint16 loop = 0;
    uint8 re   = 0;
    /*
    USER_SD_CS = 0;
    for(loop=0;loop<0xf00;loop++);
    for(loop=0;loop<10;loop++)
    {
        __u8_SD_SPI_TXRX_(SD_SPI_USER,0,0xFF);
    }
    */
    USER_SD_CS = 1;
    for(loop=0;loop<0xf00;loop++);
    for(loop=0;loop<10;loop++)
    {
        __u8_SD_SPI_TXRX_(SD_SPI_USER,0,0xFF);
    }
    //
    //MaxDelay = 0;
    do
    {
        //发送CMD0,让SD卡进入IDLE状态
        re = __u8_SD_Write_(CMD0,0,0x95,0);
        //MaxDelay = re;
    }
    while( re!=0x01 );
    re = 0;
    re = __u8_SD_Write_(CMD8,0x1aa,0x87,1);        // 卡类型认读
   
   
    if( 0x01 == re )
    {
        RecData[0] = __u8_SD_SPI_TXRX_(SD_SPI_USER,0,0xFF);
        RecData[1] = __u8_SD_SPI_TXRX_(SD_SPI_USER,0,0xFF);
        RecData[2] = __u8_SD_SPI_TXRX_(SD_SPI_USER,0,0xFF);
        RecData[3] = __u8_SD_SPI_TXRX_(SD_SPI_USER,0,0xFF);
        // 31 - 28      27 - 12         11 - 8          7 - 0
        // command v    reserved        vol accepted    check pattern
        // 0x00 0x00 0x01 0xAA
        if(RecData[2]==0x01 && RecData[3]==0xAA)
        {
            // 支持电压范围,可以操作
            // 发卡初始化指令CMD55+ACMD41
            do
            {
                re = __u8_SD_Write_(CMD55,0,0,0);
                if(re!=0x01)
                {
                    return re ;
                }
                re = __u8_SD_Write_(ACMD41,0x40000000,0,0);
            }
            while(re != 0);
            
            // 初始化指令发送完成,接下来获取OCR信息
            
            // READ_OCR
            re = __u8_SD_Write_(CMD58,0,0,1);
            
            if(re != 0x00)
            {
                return re ;
                // 如果命令没有返回正确应答,直接退出,返回应答
            }
            
            // 读OCR指令发出后,紧接着是4字节的OCR信息
            
            RecData[0] = __u8_SD_SPI_TXRX_(SD_SPI_USER,0,0xFF);
            RecData[1] = __u8_SD_SPI_TXRX_(SD_SPI_USER,0,0xFF);
            RecData[2] = __u8_SD_SPI_TXRX_(SD_SPI_USER,0,0xFF);
            RecData[3] = __u8_SD_SPI_TXRX_(SD_SPI_USER,0,0xFF);
            
            // OCR接收完成,片选置高
            USER_SD_CS = 1;
            //
            __u8_SD_SPI_TXRX_(SD_SPI_USER,0,0xFF);
            
            // 检查接收到的OCR中的bit30位(CCS),确定其为SD2.0还是SDHC
            // 如果CCS=1:SDHC   CCS=0:SD2.0
            if(RecData[0]&0x40)
            {
                re = 4 ;   // SDHC;
            }
            else
            {
                re = 2 ;   // SD2.0
            }
        }
    }
    else
    if(( 0x05 == re )||( 0x09 == re ))  // R8不被支持
    {
        re = 1;         // SD_TYPE
    }
    return re;
}
unsigned char __u8_SD_GetInfor_(sMicroSD * SD_HOST,unsigned char isShowInfor)
{
    // CSD
    unsigned char re = 0 ;
    do
    {
        re = __u8_SD_Write_(CMD9,0,0xFF,1);
    }
    while( 0x00 != re );
    // 接收16个字节的数据
    __u8_SD_ReceiveData_(SD_HOST->CSD_data,16,1);
   
    // CID
    do
    {
        re = __u8_SD_Write_(CMD10,0,0xFF,1);
    }
    while( 0x00 != re );
    // 接收16个字节的数据
    __u8_SD_ReceiveData_(SD_HOST->CID_data,16,1);
    if(1 == isShowInfor)
    {
        // 进行卡片识别
    }
    return 0 ;
}
回复 支持 反对

使用道具 举报

162

主题

2048

帖子

5

精华

超级版主

岳麓山没有车神

Rank: 10Rank: 10Rank: 10

积分
14920

论坛元老奖章优秀会员奖章活跃会员奖章论坛骨干奖章在线王奖章优秀版主奖章资源大师奖章

QQ
威望
6285
贡献
5963
兑换币
2581
注册时间
2013-11-14
在线时间
1336 小时
3#
发表于 2015-2-4 21:15:39 | 只看该作者
/* 选定SPI通道 */
#define SD_SPI_USER     1

/* SD卡类型定义 */
#define SD_TYPE_MMC     0
#define SD_TYPE_V1      1
#define SD_TYPE_V2      2
#define SD_TYPE_V2HC    4

/* SPI总线速度设置*/
#define SPI_SPEED_LOW   0
#define SPI_SPEED_HIGH  1

/* SD传输数据结束后是否释放总线宏定义 */
#define NO_RELEASE      0
#define RELEASE         1

/* SD卡指令表 */
#define CMD0            0       //卡复位
#define CMD8            8
#define CMD9            9       //命令9 ,读CSD数据
#define CMD10           10      //命令10,读CID数据
#define CMD12           12      //命令12,停止数据传输
#define CMD16           16      //命令16,设置SectorSize 应返回0x00
#define CMD17           17      //命令17,读sector
#define CMD18           18      //命令18,读Multi sector
#define ACMD23          23      //命令23,设置多sector写入前预先擦除N个block
#define CMD24           24      //命令24,写sector
#define CMD25           25      //命令25,写Multi sector
#define ACMD41          41      //命令41,应返回0x00
#define CMD55           55      //命令55,应返回0x01
#define CMD58           58      //命令58,读OCR信息
#define CMD59           59      //命令59,使能/禁止CRC,应返回0x00
回复 支持 反对

使用道具 举报

28

主题

2228

帖子

1

精华

杰出人士

Rank: 12Rank: 12Rank: 12

积分
15822

论坛元老奖章在线王奖章活跃会员奖章优秀会员奖章资源大师奖章

QQ
威望
7433
贡献
4215
兑换币
5195
注册时间
2013-12-9
在线时间
2087 小时
4#
发表于 2015-2-4 21:39:37 | 只看该作者
诸葛好人
回复 支持 反对

使用道具 举报

2

主题

456

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3039

优秀会员奖章活跃会员奖章

威望
1604
贡献
885
兑换币
854
注册时间
2014-3-6
在线时间
275 小时
5#
发表于 2015-2-4 22:50:47 | 只看该作者
:P:P:P:P:P
回复 支持 反对

使用道具 举报

7

主题

268

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2049
威望
1048
贡献
627
兑换币
668
注册时间
2014-7-27
在线时间
187 小时
毕业学校
北华航天工业学院
6#
发表于 2015-2-5 07:27:09 | 只看该作者
:lol:lol:lol
回复 支持 反对

使用道具 举报

6

主题

291

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4936
威望
2451
贡献
1463
兑换币
1663
注册时间
2013-9-21
在线时间
511 小时
7#
发表于 2015-2-5 09:33:15 | 只看该作者
Quixote 发表于 2015-2-4 21:15
/* 选定SPI通道 */
#define SD_SPI_USER     1

诸葛,可不可以用sd卡模块保存bmp图片格式文件?
回复 支持 反对

使用道具 举报

3

主题

70

帖子

0

精华

高级会员

Rank: 4

积分
661
威望
325
贡献
204
兑换币
207
注册时间
2015-1-21
在线时间
66 小时
毕业学校
陕西科技大学
8#
 楼主| 发表于 2015-2-5 11:32:34 | 只看该作者
Quixote 发表于 2015-2-4 21:15
/* 选定SPI通道 */
#define SD_SPI_USER     1

SD卡在智能车制作中有什么作用啊?
回复 支持 反对

使用道具 举报

162

主题

2048

帖子

5

精华

超级版主

岳麓山没有车神

Rank: 10Rank: 10Rank: 10

积分
14920

论坛元老奖章优秀会员奖章活跃会员奖章论坛骨干奖章在线王奖章优秀版主奖章资源大师奖章

QQ
威望
6285
贡献
5963
兑换币
2581
注册时间
2013-11-14
在线时间
1336 小时
9#
发表于 2015-2-5 14:16:23 | 只看该作者
make1573 发表于 2015-2-5 09:33
诸葛,可不可以用sd卡模块保存bmp图片格式文件?

keyi
回复 支持 反对

使用道具 举报

6

主题

291

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4936
威望
2451
贡献
1463
兑换币
1663
注册时间
2013-9-21
在线时间
511 小时
10#
发表于 2015-2-5 15:38:33 | 只看该作者
Quixote 发表于 2015-2-5 14:16
keyi

写txt的时候是直接写入,那些bmp是否是需要按照bmp文件格式的框架保存数据呢?
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-2-27 06:08 , Processed in 0.048571 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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