打印

请帮我看一看这个电路写SD卡的有没有问题???

[复制链接]
2309|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
win2000_li|  楼主 | 2007-9-24 15:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这个电路是我做SD卡实验(C8051+SD),请大家帮我看一下,能实现吗?

因为我看到周立功的例子,发现在插卡时,要先下电再开电源,而我现在的电

是直接从电源引来的!!不能控制。

请各位大哥指点!!

相关帖子

沙发
win2000_li|  楼主 | 2007-9-24 16:00 | 只看该作者

顶一个啊!!

不好意思啊!!!

图传错了。

再传一个啊!!!

使用特权

评论回复
板凳
mpuhome| | 2007-9-25 08:38 | 只看该作者

不控制电源也没问题的

不控制电源也没问题的

使用特权

评论回复
地板
古道热肠| | 2007-9-25 11:25 | 只看该作者

你这个板好东西

    这个东西蛮好,不妨贴出原理图,让大伙给你把把关。
 
   原理图中没看到CS的连接情况,这可不行的哟!

    SD卡驱动只在初始化时用GPIO完成初始化操作,完成后就用高速硬件SPI通讯了,void SPI_SendByte(uint8 byte)这个函数就是SPI的典范。

   SD卡的卡座每个管脚的功能千万要分清,没把握的话贴出个封装图与原理图,我帮你审一下,返工太不划算的。
   
   做出来后告诉我一声,预订二块空板,嘿嘿,问我做什么用,想用它来普及SD卡应用啦!

使用特权

评论回复
5
tanchao| | 2007-9-25 11:43 | 只看该作者

我最近也在研究ZLG的代码!

一切如古道热肠 所说,不过我用的是MSP430F149,然后加上一个D12自己做U盘用,呵呵!

使用特权

评论回复
6
win2000_li|  楼主 | 2007-9-25 12:26 | 只看该作者

好的!!!我把电路图发出来!!!

"古道热肠"老师,我已做的是三线制,不用片选不行吗????

在这个问题我是第一次搞SD,所以不懂,请老师指点!!!

你要预订两个空板,好啊!!我做出来一定给你留两个.

电路图如下:

使用特权

评论回复
7
win2000_li|  楼主 | 2007-9-25 12:31 | 只看该作者

这个第二章的图片.

我用的是F320,其中有USB,有SD卡等等.

用的是三线制,并且SD卡的电源是直接接在3.3V的电源上.

而且SD片选线是直接地的.是低电平有效.

使用特权

评论回复
8
win2000_li|  楼主 | 2007-9-25 12:46 | 只看该作者

是这样的.

是这样,我不用CS线是因为我看了这个,所以把SD卡的CS线接地(低电平有效),一

直有效.

因为我这个系统里只有一个SD卡,并且在SPI总线上也只有一个设备.

所以我才这样接的,请老师指点.

图如下:

使用特权

评论回复
9
古道热肠| | 2007-9-25 14:49 | 只看该作者

最好参考典弄电路

CS是低电平有效,但是要取消选中时,就要拉高,而且初始化时,也要执行拉高操作的。
看好下初始化代码
********************************************************************************************************************/
void SD_HardWareInit(void)

    SD_Power();

    SPI_INIT();                                    /* 初始化SPI接口 */    

       SPI_CS_SET();                                /* CS置高 */
    SPI_Clk400k();    
}                                                


/****

SPI——CS——SET()就是拉高CS线

朋友,你的封装好象也不对吧,第1个引脚是标号9,tq

使用特权

评论回复
10
古道热肠| | 2007-9-25 14:51 | 只看该作者

编号定义是9,1,2,3

2脚是CS,3脚是DI,4-7脚是地,5脚是VCC,6脚是SCK,8脚是DO,务必细查。

使用特权

评论回复
11
win2000_li|  楼主 | 2007-9-25 16:34 | 只看该作者

是这样!!!

老师!我想SD卡的封装有可能有一些差别!!

我的这个SD卡的接线是与标准一致的,并且公司已做成功过.

而我只是COPY过来而以,把CPU改成51.

使用特权

评论回复
12
win2000_li|  楼主 | 2007-9-26 09:03 | 只看该作者

顶起啊!!!!

使用特权

评论回复
13
古道热肠| | 2007-9-26 12:19 | 只看该作者

那就放心了

   用过的封装最放心,第一次用新器件时,我都核对几次,接插件的封装最容易出错的。

使用特权

评论回复
14
win2000_li|  楼主 | 2007-9-26 12:37 | 只看该作者

我想用周立功的例子来用!!

古道热肠老师,我还是做四线制!!!

程序我打算用周立功的例子来做.

说实话新华龙的也提供了一些代码!!

但是我没有看懂啊!!

代码如下:

相关链接:https://bbs.21ic.com/upfiles/img/20079/2007926123656979.rar

使用特权

评论回复
15
古道热肠| | 2007-9-27 09:20 | 只看该作者

就用周立功的吧,我移植过,还不错。

  关键是它这代码有书作了相关的介绍。这对初学者及深刻理解SD卡的应用很有好处。

使用特权

评论回复
16
win2000_li|  楼主 | 2007-9-27 14:31 | 只看该作者

古道热肠老师,这个函数,我认为有错,你看一看!!

因为第一个参数根本就没有用到.

所以我认为这个参数是多余的啊!

请老师指点!!!!!!!

/****************************************************************
** 函数名称: uint8 SD_ReadCard_Status()            
** 功能描述: 读SD/MMC卡的 Card Status 寄存器    
** 输   入: uint8 len:      寄存器长度(固定为2)        
             uint8 *recbuf : 接收缓冲区                
** 输   出: 0:   正确    >0:   错误码              
*******************************************************************/
uint8 SD_ReadCard_Status(uint8 len, uint8 *buffer)
{
    uint8 param[4] = {0,0,0,0};

    return (SD_SendCmd(CMD13, param, CMD13_R, buffer)); /* 读 Card Status 寄存器 */
}

使用特权

评论回复
17
win2000_li|  楼主 | 2007-9-27 14:33 | 只看该作者

还有这个,也是一样的.

/*********************************************************************************************************************
** 函数名称: uint8 SD_ReadOCR()                        Name:      uint8 SD_ReadOCR()
** 功能描述: 读操作条件寄存器OCR                    Function: read OCR register of card
** 输   入: uint8 ocrlen  : 寄存器长度(固定为4)    Input:      uint8 ocrlen  : len of register (fixed,is 4)
             uint8 *recbuf : 接收缓冲区                          uint8 *recbuf : recbuffer    
** 输   出: 0:   正确    >0:   错误码                  Output:      0:  right        >0:  error code
**********************************************************************************************************************/
uint8 SD_ReadOCR(uint8 ocrlen, uint8 *recbuf)
{
    uint8 param[4] = {0,0,0,0}, resp[5], tmp;

    tmp = SD_SendCmd(CMD58, param, CMD58_R, resp);        /* 读 OCR 寄存器命令 */
    if (tmp != SD_NO_ERR)                                /* read OCR register command */
        return tmp;                                                 
                                                    
    if (resp[0] != 0)
        return SD_ERR_CMD_RESP;                             /* 响应错误 response is error */
    
    for (tmp = 0; tmp < 4; tmp++)
        recbuf[tmp] = resp[tmp + 1];                    /* 复制OCR寄存器内容到接收缓冲区 */
    
    return SD_NO_ERR;
}

使用特权

评论回复
18
古道热肠| | 2007-9-27 16:23 | 只看该作者

函数的入口参数没用到,编译时不会报错误的

   写函数的作者也许是为了以后某种应用预留个入口参数。不影响使用。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

142

主题

718

帖子

1

粉丝