新手入门
- 积分
- 15
- 金钱
- 15
- 注册时间
- 2016-5-3
- 在线时间
- 2 小时
|
1金钱
本人用的是普通IO口模拟了下SPI模式,用手头上的几张microSD卡套进大的SD卡槽再连接的单片机,按SD协议的初始化流程编好了程序,发现CMD0+CMD8都是正常的,然后后面的CMD55(回复0X01正常)+ACMD41(R1=0xE0(HCS=0)或者R1=0xE1),就初始化不下去了。有一张卡能够正常初始化,然后用CMD17读扇区的的时候R1=0x05有问题,还有一张卡CMD17后回复字节连续好几个0x00后一直变0xff,正常不应该是几个0xff后0x00,然后几个0xff后0xfe接着数据吗,求看下哪里有问题
下面是程序
void SD_spi_write(unsigned char x)
{
unsigned char i,j;
for(i=0;i<8;i++)
{
j=(x<<i)&0x80;
j=j>>7;
if(j==0x01) //依次向数据写入线P1.1写入8位,一个字节数据
P1OUT|=BIT1;
else
P1OUT&=~BIT1;
SD_CLK_low;//下降沿写入
if(is_init) delay(delaytime);//用于初始化、复位时降速
SD_CLK_high;
if(is_init) delay(delaytime);//用于初始化、复位时降速
}
MOSI_Set;
}
写字节
unsigned char SD_spi_read()
{
unsigned char temp=0;
unsigned int i;
//P1OUT|=BIT2;//SPI_DO,芯片输出脚置高
MOSI_Set;
for(i=0;i<8;i++)
{
SD_CLK_low;//下降沿
//if(is_init) delay(delaytime);
if((P1IN&BIT2)==BIT2)
temp|=(0x80>>i);//读出数据
if(is_init) delay(delaytime);
SD_CLK_high;//时钟上升沿
if(is_init) delay(delaytime);
}
return(temp);
}
写命令
unsigned char SD_Write_Cmd(unsigned char CMD,unsigned long arg) //向SD卡中写入命令,并返回回应的第二个字节
{
unsigned char res,n;
unsigned char time=0;
SD_CS_high; //禁止SD卡片选
SD_spi_write(0xFF); //发送8个时钟信号
SD_CS_low; //使能SD卡片选
SD_spi_write(0xFF);
/* 发送命令包 */
SD_spi_write(CMD);
SD_spi_write((unsigned char)(arg>>24));
SD_spi_write((unsigned char)(arg>>16));
SD_spi_write((unsigned char)(arg>>8));
SD_spi_write((unsigned char)arg);
n = 0x01; /* Dummy CRC + Stop */
if (CMD == CMD0) n = 0x95; /* Valid CRC for CMD0(0) */
if (CMD == CMD8) n = 0x87; /* Valid CRC for CMD8(0x1AA) */
SD_spi_write(n);
//SD_spi_read(); //获得16位的回应 read the first byte,ignore it.
do
{
res = SD_spi_read(); //读取后8位
time++;
}
while((res==0xff)&&(time<TRY_TIME)); //写命令是否成功
return(res);
}
|
|