使用原子的新版SD卡程序移植到stm32f103vc的板子上,在SD卡初始化中,等待卡准备好的函数中,利用串口查看,始终得到0X00,不能得到0xff,换了3种卡都不能得到0xff,移植原来挑卡那版程序初始化没有问题,请大虾帮我分析分析造成的原因吧,不胜感激。
//等待卡准备好
//返回值:0,准备好了;其他,错误代码
u8 SD_WaitReady(void)
{
u32 t=0;
do
{
if(SD_SPI_ReadWriteByte(0XFF)==0XFF)return 0;//OK “此处SD_SPI_ReadWriteByte(0XFF)返回的值一直是0x00”
t++;
}while(t<0XFFFFFF);//等待
return 1;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
回复【5楼】 正点原子 :
---------------------------------
这个是定义了SD片选
//这部分应根据具体的连线来修改!
//Mini STM32使用的是PA4作为SD卡的CS脚.
#define SD_CS PAout(4) //SD卡片选引脚
-----------------------------------
这个是初始化片选IO口的程序
//SPI硬件层初始化
void SD_SPI_Init(void)
{
//设置硬件上与SD卡相关联的控制引脚输出
//避免NRF24L01/W25X16等的影响
RCC->APB2ENR|=1<<2; //PORTA时钟使能
GPIOA->CRL&=0XFFF0FFFF;
GPIOA->CRL|=0X00030000;//PA2.3.4 推挽
GPIOA->ODR|=0X7<<2; //PA2.3.4上拉
SPIx_Init();
SD_SPI_SpeedLow();//设置到低速模式
SD_CS=1;
}
-------------------------------------------------------------
程序在执行SD初始化时到进入r1=SD_SendCmd(CMD0,0,0x95);//进入IDLE状态最后进入到上面的等待卡准备好的函数时 返回的0X00;
//初始化SD卡
//返回值:0,正常.
// 其他,不正常.
u8 SD_Initialize(void)
{
u8 r1; // 存放SD卡的返回值
u16 retry; // 用来进行超时计数
u8 buf[4];
u16 i;
SD_SPI_Init(); //初始化IO
SD_SPI_SpeedLow(); //设置到低速模式
//for(i=0;i<0xf00;i++);//纯延时,等待SD卡上电完成
for(i=0;i<10;i++)SD_SPI_ReadWriteByte(0XFF);//发送最少74个脉冲
retry=20;
do
{
r1=SD_SendCmd(CMD0,0,0x95);//进入IDLE状态
}while((r1!=0X01) && retry--);
SD_Type=0;//默认无卡
--------------------------------------------------------------------------
在主函数里对片选口进行测试,用万用表量,每个2秒高低电平会有变化,正常。
int main(void)
{
u8 temp;
stm32_init();//stm32初始化
hardware_init();//外围器件初始化
while(1)
{
delay_ms(1000);
SD_CS = ~SD_CS;
delay_ms(1000);
--------------------------------------------------------------------------------
SPI的初始化完全移植开发板的程序,用金士顿 adata sandisk三个牌子的SD卡 一样的现象,实在是想不明白了
一周热门 更多>