?? 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 + -