使用原子的新版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;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
——————————————————————————————————————————————————
//等待卡准备好
//返回值:0,准备好了;其他,错误代码
u8 SD_WaitReady(void)
{
u8 t=0;
u8 temp;
delay_ms(5000);
do
{
temp = SD_SPI_ReadWriteByte(0XFF);
USART1->DR = temp;
while((USART1->SR & 0X40) == 0);//等待发送结束
if(temp==0XFF)return 0;//OK
t++;
}while(t<200);//等待
return 1;
}
————————————————————————
串口得到的数据。。。。
-----------------------------------------------------------------------------------------
SPI的程序
#include "spi.h"
/********************************************************
函数名称:void SPIx_Init(void)
功能描述:SPI模块的初始化代码,配置成主机模式
全局变量:无
参数说明:无
返回值: 无
说明:SPI1的初始化
*********************************************************/
void SPIx_Init(void)
{
RCC->APB2ENR|=1<<2; //PORTA时钟使能
RCC->APB2ENR|=1<<12; //SPI1时钟使能
//这里只针对SPI口初始化
GPIOA->CRL&=0X000FFFFF;
GPIOA->CRL|=0XBBB00000;//PA5.6.7复用
GPIOA->ODR|=0X7<<5; //PA5.6.7上拉
SPI1->CR1|=0<<10;//全双工模式
SPI1->CR1|=1<<9; //软件nss管理
SPI1->CR1|=1<<8;
SPI1->CR1|=1<<2; //SPI主机
SPI1->CR1|=0<<11;//8bit数据格式
SPI1->CR1|=1<<1; //空闲模式下SCK为1 CPOL=1
SPI1->CR1|=1<<0; //数据采样从第二个时间边沿开始,CPHA=1
SPI1->CR1|=7<<3; //Fsck=Fcpu/256
SPI1->CR1|=0<<7; //MSBfirst
SPI1->CR1|=1<<6; //SPI设备使能
SPIx_ReadWriteByte(0xff);//启动传输
}
/********************************************************
函数名称:void SPIx_SetSpeed(u8 SpeedSet)
功能描述:SPI 速度设置函数
全局变量:无
参数说明:SpeedSet
返回值: 无
说明:
SpeedSet:
SPI_SPEED_2 2分频 (SPI 36M@sys 72M)
SPI_SPEED_8 8分频 (SPI 9M@sys 72M)
SPI_SPEED_16 16分频 (SPI 4.5M@sys 72M)
SPI_SPEED_256 256分频 (SPI 281.25K@sys 72M)
*********************************************************/
void SPIx_SetSpeed(u8 SpeedSet)
{
SPI1->CR1&=0XFFC7;//Fsck=Fcpu/256
switch(SpeedSet)
{
case SPI_SPEED_2://二分频
SPI1->CR1|=0<<3;//Fsck=Fpclk/2=36Mhz
break;
case SPI_SPEED_4://四分频
SPI1->CR1|=1<<3;//Fsck=Fpclk/4=18Mhz
break;
case SPI_SPEED_8://八分频
SPI1->CR1|=2<<3;//Fsck=Fpclk/8=9Mhz
break;
case SPI_SPEED_16://十六分频
SPI1->CR1|=3<<3;//Fsck=Fpclk/16=4.5Mhz
break;
case SPI_SPEED_256://256分频
SPI1->CR1|=7<<3;//Fsck=Fpclk/16=281.25Khz
break;
}
SPI1->CR1|=1<<6; //SPI设备使能
}
/********************************************************
函数名称:u8 SPIx_ReadWriteByte(u8 TxData)
功能描述:SPIx 读写一个字节
全局变量:无
参数说明:TxData:要写入的字节
返回值: 读取到的字节
说明:
*********************************************************/
u8 SPIx_ReadWriteByte(u8 TxData)
{
while((SPI1->SR&1<<1)==0);
SPI1->DR=TxData; //发送一个byte
while((SPI1->SR&1<<0)==0);
return SPI1->DR; //返回收到的数据
}
----------------------------------------
SPI和VS1003可以通讯,应该是没问题
一周热门 更多>