关于msp430驱动sd卡的问题
网上都说,sd卡的一个扇区是512B,但我通过读csd寄存器,为1024B,是错的吗?我有一个sd卡的写扇区的程序,但应答信息总为出错,程序如下:
uchar write_sd_sector(unsigned long addr,uchar *Buffer)
{
uchar reply,retry=0;
uint i;
uchar CMD[]={0x58,0x00,0x00,0x00,0x00,0xFF};
addr=addr<<10; //addr = addr * 512
CMD = ((addr & 0xFF000000) >>24 );
CMD = ((addr & 0x00FF0000) >>16 );
CMD = ((addr & 0x0000FF00) >>8 );
retry=0;
do
{
reply=write_cmd(CMD); //为了可靠写入,写100次
retry++;
if(retry==100)
{
return(reply); //send commamd Error!
}
}
while(reply!=0);
for(i=0;i<20;i++) //在写之前先产生20个时钟信号
{
read_byte();
}
write_byte(0xFE);
for (i=0;i<1024;i++) //现在可以写入1024个字节
{
write_byte(*Buffer++);
}
write_byte(0xFF); //Dummy CRC
write_byte(0xFF); //CRC Code
write_byte(0xFF);
reply=read_byte(); //read response
if((reply&0x1F)!=0x05) // 写入的1024个字节是未被接受
{
dis_sd();
while(read_byte()!=0xff){};
return(reply); //Error!
}
while(read_byte()!=0xff){};
dis_sd(); //
return(3); //写入成功
}
void write_byte(uchar data)
{
TXBUF_0=data;
while(!(IFG1&UTXIFG0));
}
uchar read_byte(void)
{
uchar data=0xff;
TXBUF_0=0xff;
while(!(IFG1&URXIFG0));
data=RXBUF_0;
return(data);
}
uchar write_cmd(uchar *cmd)
{
uchar data=0xff,retry=0;
dis_sd();
write_byte(0xff);
en_sd();
for(uchar i=0;i<6;i++)
write_byte(cmd);
// data=read_byte();
do
{
data=read_byte();
if(retry++>=200)
break;
}
while(data==0xff);
return data;
}
请高手指点一下。 以下蓝色文字由版主:pitolan 于:2010-03-01,20:04:33 加入。<font color=black>请发贴人注意:本贴放在这分区不合适,即将移走
原来分区:四轴飞行DIY论坛
即将移去的分区:MSP430
移动执行时间:自本贴发表0小时后
任何的疑问或咨询,请可随时联系站长。谢谢你的支持!</font> 不止是SD卡,貌似硬盘之类的存储器,一个扇区都是512吧?连续写1024肯定会出错
如果已经格式化为FAT,在读取BPB信息时,要注意结构体对齐
另:1、SD卡上电后要进行初始化的
2、单片机做SD控制一般是SPI总线。发送CMD命令前,要先拉低CS信号,发送完毕后,要拉高CS
3、不是写数据之前产生20个时钟信号,而是拉低CS后,发送CMD之前就要产生空闲时钟信号,方便卡完成内部操作,而且,20个好象不够,具体多少忘了,不过我做的是30个
不知你的“应答信息出错”是什么意思,建议看一下SD卡控制的时序:) 楼主调通了么
借份源码学习学习
760594750@qq.com
页:
[1]