新手入门
积分 14
金钱 14
注册时间 2019-8-5
在线时间 3 小时
1 金钱
diskio.c文件填充的函数如下:
DSTATUS disk_initialize (
BYTE pdrv /* Physical drive nmuber to identify the drive */
)
{
uint8_t res;
res = SD_init();//SD_Initialize()
if(res)//STM32 SPIμÄbug,Ôúsd¿¨2ù×÷ê§°üμÄê±oòèç1û2»Ö′DDÏÂÃæμÄóï¾ä,¿éÄüμ¼ÖÂSPI¶áD′òì3£
{
SPI_setspeed(SPI_BAUDRATEPRESCALER_256);
spi_readwrite(0xff);//ìá1©¶îíaμÄ8¸öê±Öó
SPI_setspeed(SPI_BAUDRATEPRESCALER_2);
}
if(res)return STA_NOINIT;
else return RES_OK; //3õê¼»ˉ3é1|
}
---------------------------------------------------------------------------
DRESULT disk_ioctl (
BYTE pdrv, /* Physical drive nmuber (0..) */
BYTE cmd, /* Control code */
void *buff /* Buffer to send/receive control data */
)
{
DRESULT res;
switch(cmd)
{
case CTRL_SYNC :
return RES_OK;
case GET_SECTOR_COUNT :
*(DWORD*)buff = SD0_CardInfo.Capacity/512;
return RES_OK;
case GET_BLOCK_SIZE :
*(WORD*)buff = 512;
return RES_OK;
case CTRL_POWER :
break;
case CTRL_LOCK :
break;
case CTRL_EJECT :
break;
/* MMC/SDC command */
case MMC_GET_TYPE :
break;
case MMC_GET_CSD :
break;
case MMC_GET_CID :
break;
case MMC_GET_OCR :
break;
case MMC_GET_SDSTAT :
break;
}
return res;
}
------------------------------------------------------------------------
DRESULT disk_read (
BYTE pdrv, /* Physical drive nmuber to identify the drive */
BYTE *buff, /* Data buffer to store read data */
DWORD sector, /* Start sector in LBA */
UINT count /* Number of sectors to read */
)
{
int Status;
if( !count )
{
return RES_PARERR; /* count2»Äüμèóú0£¬·ñÔò·μ»Ø2Îêy′íÎó */
}
switch (pdrv)
{
case 0:
if(count==1) /* 1¸ösectorμĶá2ù×÷ */
{
Status = SD_ReadSB( sector ,buff );
if(Status == 0){
return RES_OK;
}else{
return RES_ERROR;
}
}
else /* ¶à¸ösectorμĶá2ù×÷ */
{
Status = SD_ReadMB( sector , buff ,count);
if(Status == 0){
return RES_OK;
}else{
return RES_ERROR;
}
}
case 1:
if(count==1) /* 1¸ösectorμĶá2ù×÷ */
{
return RES_OK;
}
else /* ¶à¸ösectorμĶá2ù×÷ */
{
return RES_OK;
}
default:
return RES_ERROR;
}
}
-------------------------------------------------------------------------
DSTATUS disk_status (
BYTE pdrv /* Physical drive nmuber to identify the drive */
)
{switch (pdrv)
{
case 0 :
return RES_OK;
case 1 :
return RES_OK;
case 2 :
return RES_OK;
default:
return STA_NOINIT;
}
}
-------------------------------------------------------------------------------
#if FF_FS_READONLY == 0
DRESULT disk_write (
BYTE pdrv, /* Physical drive nmuber to identify the drive */
const BYTE *buff, /* Data to be written */
DWORD sector, /* Start sector in LBA */
UINT count /* Number of sectors to write */
)
{
int Status;
if( !count )
{
return RES_PARERR; /* count2»Äüμèóú0£¬·ñÔò·μ»Ø2Îêy′íÎó */
}
switch (pdrv)
{
case 0:
if(count==1) /* 1¸ösectorμÄD′2ù×÷ */
{
Status = SD_WriteSB( sector , (uint8_t *)(&buff[0]) );
if(Status == 0){
return RES_OK;
}else{
return RES_ERROR;
}
}
else /* ¶à¸ösectorμÄD′2ù×÷ */
{
Status = SD_WriteMB( sector , (uint8_t *)(&buff[0]) , count );
if(Status == 0){
return RES_OK;
}else{
return RES_ERROR;
}
}
default:return RES_ERROR;
}
}
#endif
---------------------------------------------------------------------------------------------------------------
DWORD get_fattime (void)
{
return 0;
}
-------------------------------------------------------------
测试行如下:
//挂载文件系统
res=f_mount(&fs,"0:",0);if(res!=FR_OK)printf("挂载失败%d ",res);
//创建文件夹
res=f_mkdir("201908");if(res!=FR_OK){printf("创建目录 失败%d ",res );}
//打开文件
res=f_open(&file,"test.txt",FA_READ|FA_WRITE|FA_OPEN_ALWAYS);if(res!=FR_OK){printf("打开文件 失败%d ",res );}
//写入数据
res = f_write(&file, textFileBuffer, sizeof(textFileBuffer), &bw); if(res!=FR_OK){printf("数据写入失败%d",res);}
//关闭文件
f_close(&file);
//打开文件
res=f_open(&file,"test.txt",FA_READ|FA_OPEN_EXISTING);if(res!=FR_OK){printf( "打开文件 失败%d ",res );}
//读取数据
res = f_read(&file, buffer, sizeof(textFileBuffer), &br); if(res!=FR_OK){printf(" 数据读取失败%d",res );}
//关闭文件
f_close(&file);
//打印输出读取到的数据
printf("%s\n\r",buffer);
串口输出的结果如下:
[14:38:09.542]收←◆中英文测试字符串 hellokfdijgdoifjoigjdofjgodjfghoudfhudhfvuhhipuhsdpifuhiChinese and English test strings
但是把SD卡插电脑上用读卡器看的时候没有目录也没有test.txt文件
我来回答