spi总线对mmc/sd的读写
马老师您好,我是刚开始学习avr单片机,相通过spi对mmc/sd读写进行读写,卡用的就是市面上常见的金士顿的卡,但总是不成功,希望能得到您的指导或建议 进行读写?读一个字节,还是读写文件?差别大了. sd卡的pdf看完了没? 要读写文件,还要学习文件系统. 多谢马老师在百忙中关注我的问题,我主要是想对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文档么 从基本的扎扎实实的学起.这不是几句话就能掌握的. 如果不了解文件系统,读出来的只是一串数字,没什么具体意义。
页:
[1]