icertt 发表于 2008-3-31 12:53:18

spi总线对mmc/sd的读写

马老师您好,我是刚开始学习avr单片机,相通过spi对mmc/sd读写进行读写,卡用的就是市面上常见的金士顿的卡,但总是不成功,希望能得到您的指导或建议

machao 发表于 2008-4-4 13:39:29

进行读写?读一个字节,还是读写文件?差别大了.

thriller 发表于 2008-4-4 14:04:45

sd卡的pdf看完了没?

machao 发表于 2008-4-4 14:08:12

要读写文件,还要学习文件系统.

icertt 发表于 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;
long int i;
for (i=0;i<512;i++)//要写的数据
sendbuffer=i;
spi_init();
MMC_init();
MMC_writeSector(sendbuffer);
}

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

machao 发表于 2008-4-8 22:59:15

从基本的扎扎实实的学起.这不是几句话就能掌握的.

thriller 发表于 2008-4-8 23:14:12

如果不了解文件系统,读出来的只是一串数字,没什么具体意义。
页: [1]
查看完整版本: spi总线对mmc/sd的读写