新手上路
- 积分
- 41
- 金钱
- 41
- 注册时间
- 2016-3-7
- 在线时间
- 13 小时
|
1金钱
问题1:
void SD_SPI_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOG, ENABLE); //ê1ÄüPB¶Ë¿úê±Öó
//éèÖÃó2¼téÏóëSD¿¨Ïà1ØáaμÄ¿ØÖÆòy½Åêä3ö
//±üÃaNRF24L01/W25Q32μèμÄó°Ïì
//Õaàï B12oíPG7à-¸ß,êÇÎaáË·àÖ1ó°ÏìFLASHμÄéÕD′.
//òòÎaËûÃÇ12óÃò»¸öSPI¿ú.
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //PB12 íÆíì
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //íÆíìêä3ö
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_12); //PB12éÏà-
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PD2 íÆíì
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_SetBits(GPIOD,GPIO_Pin_2);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //PG7 íÆíì
GPIO_Init(GPIOG, &GPIO_InitStructure);
GPIO_SetBits(GPIOG,GPIO_Pin_7);
SPI2_Init(); //àïÃæμļ«DÔoíÏàλ£¿£¿£¿£¿£¿£¿£¿£¿£¿£¿£¿£¿
SD_CS=1;
}
该函数中SPI2_Init();代码中
PI_InitStructure.SPI_CPOL = SPI_CPOL_High; //Ñ¡ÔñáË′®DDê±ÖóμÄÎèì¬:ê±ÖóDü¿Õ¸ß
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //êy¾Y2¶»ñóúμú¶t¸öê±ÖóÑØ
的根据在SD卡协议哪里?找不着,麻烦给指下,谢谢
******************************************************************************************************
问题2:
u8 SD_Initialize(void)
{
u8 r1; // ′æ·ÅSD¿¨μÄ·μ»ØÖμ
u16 retry; // óÃà′½øDD3¬ê±¼Æêy
u8 buf[4];
u16 i;
SD_SPI_Init(); //3õê¼»ˉIO
SD_SPI_SpeedLow(); //éèÖÃμ½μíËùÄ£ê½ //???????????????????????????
for(i=0;i<10;i++)SD_SPI_ReadWriteByte(0XFF);//·¢Ëí×îéù74¸öÂö3å
retry=20;
do
{
r1=SD_SendCmd(CMD0,0,0x95);//½øèëIDLE×′ì¬
}while((r1!=0X01) && retry--);
SD_Type=0;//ĬèÏÎT¿¨
if(r1==0X01)
{
if(SD_SendCmd(CMD8,0x1AA,0x87)==1)//SD V2.0
{
for(i=0;i<4;i++)buf=SD_SPI_ReadWriteByte(0XFF); //Get trailing return value of R7 resp
if(buf[2]==0X01&&buf[3]==0XAA) //卡是否支持2.7~3.6V //?????????????
{
retry=0XFFFE;
do
{
SD_SendCmd(CMD55,0,0X01); //·¢ËíCMD55
r1=SD_SendCmd(CMD41,0x40000000,0X01);//·¢ËíCMD41
}while(r1&&retry--);
if(retry&&SD_SendCmd(CMD58,0,0X01)==0)//¼ø±eSD2.0¿¨°æ±¾¿aê¼
{
for(i=0;i<4;i++)buf=SD_SPI_ReadWriteByte(0XFF);//μÃμ½OCRÖμ
if(buf[0]&0x40)SD_Type=SD_TYPE_V2HC; //¼ì2éCCS
else SD_Type=SD_TYPE_V2;
}
}
......
中if(buf[2]==0X01&&buf[3]==0XAA) 的判断语句应该是对照着读出来的OCR写的吧,感觉并不支持所说的2.7-3.6电压范围,麻烦解释下,谢谢?
********************************************************************************************************************
问题3:
SD_TYPE_V2HC 表示高容量SD卡
SD_TYPE_V2 表示标准SD卡
.......
if(retry&&SD_SendCmd(CMD58,0,0X01)==0)/
{ //判断是哪种卡
for(i=0;i<4;i++)buf=SD_SPI_ReadWriteByte(0XFF);//μÃμ½OCRÖμ
if(buf[0]&0x40)SD_Type=SD_TYPE_V2HC; //¼ì2éCCS
else SD_Type=SD_TYPE_V2;
.......
u8 SD_ReadDisk(u8*buf,u32 sector,u8 cnt)
{
u8 r1;
if(SD_Type!=SD_TYPE_V2HC)sector <<= 9;//转换为字节地址 //????????????????
if(cnt==1)
{
r1=SD_SendCmd(CMD17,sector,0X01);
if(r1==0)
{
r1=SD_RecvData(buf,512);
}
}else
{
r1=SD_SendCmd(CMD18,sector,0X01);
do
{
r1=SD_RecvData(buf,512);
buf+=512;
}while(--cnt && r1==0);
SD_SendCmd(CMD12,0,0X01);
}
SD_DisSelect();
return r1;
}
中的if(SD_Type!=SD_TYPE_V2HC) sector <<= 9;为什么要判断是不是SD_TYPE_V2HC类型,再转换为字节地址,而不是直接转换,难道SD_TYPE_V2不需要转换为字节地址吗?
|
|