📄 sd卡的复位操作.c
字号:
unsigned char SD_Reset() //SD卡复位函数,进入SPI模式
{
unslgned Char i;
unsigned char rddata[1],wrdata[1];
unsigned char cmd0[]=(0x40,0x00,0x00,0x00,0x00,0x95);
CS_EN=1; //CS_EN置为高电平,屏蔽SPI内核的SS_n
IOWR ALTERA_AVALON_PIO_DATA(CS_EN_BASE,CS_EN);
DI_EN=0; //DI_EN置为低电平,使SPI内核的mosi不被屏蔽
IOWR_ALTERA_ALON_PIO_DATA(DI_EN_BASE,DI_EN);
for(i=0;i<0x10;i++) //复位时先发送最少74个时钟,发送一个字节需要
//8个时钟,这里发送128个时钟
{
wrdata[0]=0xff; //使mosi端口为高电平
alt_avalon_spi_command(SPI_BASE,0,1,wrdata,0,NULL,0);
//发送一个字节的数据
IOWR_ALTERA_AVALON_PIO_DATA(CS EN_BASE,CS_EN);
do
{
rddata[0]_Write_Cmd(cmd0);//发送CMD0,并读取返回值
}while(rddata[0]!=0x01); //当返回值=l时,表示CMDO发送成功
CS_EN =1; //CS_EN置为高电平,屏蔽SPI内核的SS_n
IOWR_ALTERA_AVALON_PIO_DATA(CS_EN_BASE,CS_EN);
wrdata[0]=0xff;
alt_avalon spi_command(SPI_BASE,0,1,wrdata,0,NULL,0);
//发送8个时钟
return 0; //返回0,表示复位操作成功
}
unsigned char Write_Cmd(unsigned char cmd)
//发送命令并读取返回值的函数
{
unsigned char rddata[1],time=0;
do
{
time=0;
DI_EN=0; //DI_EN置为低电平,使SPI内核的mosi不被屏蔽
IOWR_ALTERA_AVALONJIOJ_ATA(DI_EN_BASE,DI EN);
alt avalon_spi_command(SPI_BASE,0,6,cmd,0,NULL,1);
//发送6个字节的CMD命令
DI_EN=1; //DI__EN置为高电平,屏蔽SPI内核的mosi
IOWR_ALTERA_AVALON_PIO_DATA(DI_EN_BASE,DI_EN);
do
{
alt_avalon_spi_command(SPI_BASE,0,0,NULL,1,rddata,1);
//读取一个字节的数据
time++;
}while(rddata[0]==0xff&&(time<50));//如果读到的不是0xff或超时,跳出循环
}while(rddata[0]==0xff); //如果读到的不是0xff,跳出循环
return(rddata[0]); //返回读取的一个字节数据
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -