搜索
bottom↓
回复: 6

spi总线对mmc/sd的读写

[复制链接]

出0入0汤圆

发表于 2008-3-31 12:53:18 | 显示全部楼层 |阅读模式
马老师您好,我是刚开始学习avr单片机,相通过spi对mmc/sd读写进行读写,卡用的就是市面上常见的金士顿的卡,但总是不成功,希望能得到您的指导或建议

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2008-4-4 13:39:29 | 显示全部楼层
进行读写?读一个字节,还是读写文件?差别大了.

出0入0汤圆

发表于 2008-4-4 14:04:45 | 显示全部楼层
sd卡的pdf看完了没?

出0入0汤圆

发表于 2008-4-4 14:08:12 | 显示全部楼层
要读写文件,还要学习文件系统.

出0入0汤圆

 楼主| 发表于 2008-4-8 16:07:50 | 显示全部楼层
多谢马老师在百忙中关注我的问题,我主要是想对sd开进行读写,但有时命令0和1能够写进去,但有时就不能,不知道是什么原因,另外在向卡进行写操作时还是不成功,有劳您再给指点一二,3.3V的电源,256m的金狮顿的卡,用的是mega128,i/o分别接了15k的上拉电阻代码如下:

#include <macros.h>
#include<iom128v.h>

void spi_init(void) //SPI初始化
{
    DDRB=0X07;
    SPCR=0X5F;
    }

unsigned char sendbyte(unsigned char byte) //发送一个数据
{
    SPDR = byte;
    while(!(SPSR & (1<<SPIF)));
    return (SPDR);
}

unsigned char MMC_setCmd(unsigned char cmd,  unsigned long int adrH, unsigned long int adrL) //发送一个命令
{   
    sendbyte(0xFF);
    sendbyte(cmd|0x40);
    sendbyte((unsigned char)(adrH >> 8));
    sendbyte((unsigned char)adrH);
    sendbyte((unsigned char)(adrL >> 8));
    sendbyte((unsigned char)adrL);
    sendbyte(0x95);  
    sendbyte(0xFF);
    return sendbyte(0xFF);      

}


void MMC_init(void) // MMC初始化
{
    int i;
    unsigned char temp;

    PORTB|=0X01;//拉高片选PB0
    for(i=0; i < 10; i++)    //先发送 10*8=80 个'1'
       sendbyte(0xFF);         
       PORTB&=0XFE;// PB0清零
    do
    {
    temp=MMC_setCmd(MMC_GO_IDLE_STATE,0,0);//命令0
    }while(temp!=1);
   
    do
    {
    temp=MMC_setCmd(MMC_SEND_OP_COND,0,0);// 命令1
    }while(temp!=0);
    }
   

MMC_writeSector(unsigned char *pWrDat) //写内容到第一个扇区
{
    long int i;
    unsigned char temp;
    SPCR=0X5C;//提高时钟速度
    SPSR|=0X01;
    do
    {
    temp=MMC_setCmd(MMC_WRITE_BLOCK,0,51200); //设置 块 写命令
    }while(temp!=0);
    for(i=0; i < 100; i++)   

    sendbyte(0xff);   
    sendbyte(0xFE);                    //发送 起始标志  
    for(i=0;i<512;i++)              
       sendbyte(*pWrDat++);        //发送数据
    sendbyte(0xFF);                    //发送2字节dummy  

sendbyte(0xFF);
    if( (sendbyte(0xFF)&0x1F) != 0x05 )    //0x1F = 0b 0001 1111
       return 0;                //0x05 = 0b 0000 0101
}

void main ()
{unsigned char sendbuffer[512];
long int i;
for (i=0;i<512;i++)  //要写的数据
sendbuffer=i;
spi_init();
MMC_init();
MMC_writeSector(sendbuffer);
}

另外您提到的文件系统我也不是很了解,如果把以上数据写入的话,通过pc机读sd卡时看到的是什么文件呢,是.txt文档么

出0入0汤圆

发表于 2008-4-8 22:59:15 | 显示全部楼层
从基本的扎扎实实的学起.这不是几句话就能掌握的.

出0入0汤圆

发表于 2008-4-8 23:14:12 | 显示全部楼层
如果不了解文件系统,读出来的只是一串数字,没什么具体意义。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-25 14:15

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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