sn write ios write写入失败败是怎么办

您好,欢迎来到119G网盘!请登录 |
和万千网友分享文档资料
当前已有5596879个文件
本类周下载排行榜
当前位置:-&
SN_Write_tool_exe_v2.1304.00.rar
上传用户:
文件标签:
文件大小:13.83MB
文件类型:.rar
上传时间: 12:11:40
上传者IP:221.237.*.*
内容监督:
SHA1值:F95F1EC6A76CA9ACB628D
文件状态:已分享
119G免费网盘,注册即可享用119G以上永久大容量免费网络硬盘空间。
下载链接:
HTML代码:
论坛代码:
文件下载地址
用户其他文件查看: 157|回复: 0
请教下,fatfs 挂载三个磁盘读写错误 ??????
本帖最后由 hpdell 于
21:08 编辑
大侠们好, 下面的程序进行测试,结果只有 sd 卡是
正确的,其他的 nand flash , usb 都是错误的,不知道是怎么回事 ??
&&nand flash 单独的读写完全正确(不使用 fatfs系统) 。
部分程序如下 :
/* Definitions of physical drive number for each media */
#define FS_SD& && &&&0
#define FS_NAND& & 1
#define FS_USB& && &&&2
DSTATUS disk_initialize (
& & BYTE pdrv& && && && && & /* Physical drive nmuber (0..) */
& & DSTATUS stat = STA_NOINIT;
& & switch (pdrv)
& && &&&case FS_SD :& && &&&/* SD卡 */
& && && && &if (SD_Init() == SD_OK)
& && && && &{
& && && && && & stat = RES_OK;
& && && && &}
& && && && &else
& && && && &{
& && && && && & stat = STA_NODISK;
& && && && &}
& && && && &
& && &&&case FS_NAND :& && &&&/* NAND Flash */
& && && && &if (NAND_Init() == NAND_OK)
& && && && &{
& && && && && & stat = RES_OK;
& && && && &}
& && && && &else
& && && && &{
& && && && && & /* 如果初始化失败,请执行低级格式化 */
& && && && && & printf(&NAND_Init() Error!&&\r\n&);
& && && && && & stat = RES_ERROR;
& && && && &}
& && && && &
& && &&&case FS_USB :& && &&&/* STM32 USB Host 口外接U盘 */
& && && && &if(HCD_IsDeviceConnected(&USB_OTG_Core))
& && && && &{
& && && && && & stat &= ~STA_NOINIT;
& && && && &}
& && && && &
& && &&&default :
& && && && &
/*-----------------------------------------------------------------------*/
/* Get Disk Status& && && && && && && && && && && && && && && && && && & */
/*-----------------------------------------------------------------------*/
DSTATUS disk_status (
& & BYTE pdrv& && &&&/* Physical drive nmuber (0..) */
& & DSTATUS stat = STA_NOINIT;
& & switch (pdrv)
& && &&&case FS_SD :
& && && && &stat = 0;
& && && && &
& && &&&case FS_NAND :
& && && && &stat = 0;
& && && && &
& && &&&case FS_USB :
& && && && &stat = 0;
& && && && &
& && &&&default:
& && && && &
/*-----------------------------------------------------------------------*/
/* Read Sector(s)& && && && && && && && && && && && && && && && && && &&&*/
/*-----------------------------------------------------------------------*/
DRESULT disk_read (
& & BYTE pdrv,& && &&&/* Physical drive nmuber (0..) */
& & BYTE *buff,& && &&&/* Data buffer to store read data */
& & DWORD sector,& & /* Sector address (LBA) */
& & BYTE count& && &&&/* Number of sectors to read (1..128) */
& & DRESULT
& & switch (pdrv)
& && &&&case FS_SD :
& && && && &SD_Error Status = SD_OK;
& && && && &if (count == 1)
& && && && &{
& && && && && & Status = SD_ReadBlock(buff, sector && 9 , SECTOR_SIZE);
& && && && &}
& && && && &else
& && && && &{
& && && && && & Status = SD_ReadMultiBlocks(buff, sector && 9 , SECTOR_SIZE, count);
& && && && &}
& && && && &if (Status != SD_OK)
& && && && &{
& && && && && & res = RES_ERROR;
& && && && && &
& && && && &}
& && &&&#ifdef SD_DMA_MODE
& && && && &/* SDIO工作在DMA模式,需要检查操作DMA传输是否完成 */
& && && && &Status = SD_WaitReadOperation();
& && && && &if (Status != SD_OK)
& && && && &{
& && && && && & res = RES_ERROR;
& && && && && &
& && && && &}
& && && && &while(SD_GetStatus() != SD_TRANSFER_OK);
& && &&&#endif
& && && && &res = RES_OK;
& && && && &
& && &&&case FS_NAND :
& && && && &if (NAND_OK == NAND_ReadMultiSectors(buff, sector, 512, count))
& && && && &{
& && && && && & res = RES_OK;
& && && && &}
& && && && &else
& && && && &{
& && && && && & printf(&NAND_ReadMultiSectors() Error! sector = %d, count = %d \r\n&, sector, count);
& && && && && & res = RES_ERROR;
& && && && &}
& && && && &
& && &&&case FS_USB :
& && && && &//res = USB_disk_read(buff, sector, count);
& && && && &{
& && && && && & BYTE status = USBH_MSC_OK;
& && && && && & //if (Stat & STA_NOINIT)& &&&return RES_NOTRDY;
& && && && && & if (HCD_IsDeviceConnected(&USB_OTG_Core))
& && && && && & {
& && && && && && &&&do
& && && && && && &&&{
& && && && && && && && &status = USBH_MSC_Read10(&USB_OTG_Core, buff,sector,512 * count);
& && && && && && && && &USBH_MSC_HandleBOTXfer(&USB_OTG_Core ,&USB_Host);
& && && && && && && && &if (!HCD_IsDeviceConnected(&USB_OTG_Core))
& && && && && && && && &{
& && && && && && && && && &
& && && && && && && && &}
& && && && && && &&&}
& && && && && && &&&while (status == USBH_MSC_BUSY );
& && && && && & }
& && && && && & if (status == USBH_MSC_OK)
& && && && && & {
& && && && && && &&&res = RES_OK;
& && && && && & }
& && && && && & else
& && && && && & {
& && && && && && &&&res = RES_ERROR;
& && && && && & }
& && && && &}
& && && && &
& && &&&default:
& && && && &res = RES_PARERR;
& && && && &
/*-----------------------------------------------------------------------*/
/* Write Sector(s)& && && && && && && && && && && && && && && && && && & */
/*-----------------------------------------------------------------------*/
#if _USE_WRITE
DRESULT disk_write (
& & BYTE pdrv,& && && && &/* Physical drive nmuber (0..) */
& & const BYTE *buff,& & /* Data to be written */
& & DWORD sector,& && &&&/* Sector address (LBA) */
& & BYTE count& && && && &/* Number of sectors to write (1..128) */
& & DRESULT
& & switch (pdrv)
& && &&&case FS_SD :
& && && && &SD_Error Status = SD_OK;
& && && && &if (count == 1)
& && && && &{
& && && && && & Status = SD_WriteBlock((uint8_t *)buff, sector && 9 ,SECTOR_SIZE);
& && && && && & if (Status != SD_OK)
& && && && && & {
& && && && && && &&&res = RES_ERROR;
& && && && && && &&&
& && && && && & }
& && && && &#ifdef SD_DMA_MODE
& && && && && & /* SDIO工作在DMA模式,需要检查操作DMA传输是否完成 */
& && && && && & Status = SD_WaitReadOperation();
& && && && && & if (Status != SD_OK)
& && && && && & {
& && && && && && &&&res = RES_ERROR;
& && && && && && &&&
& && && && && & }
& && && && && & while(SD_GetStatus() != SD_TRANSFER_OK);
& && && && &#endif
& && && && && & res = RES_OK;
& && && && &}
& && && && &else
& && && && &{
& && && && && & /* 此处存在疑问: 扇区个数如果写 count ,将导致最后1个block无法写入 */
& && && && && & //Status = SD_WriteMultiBlocks((uint8_t *)buff, sector && 9 ,SECTOR_SIZE, count);
& && && && && & Status = SD_WriteMultiBlocks((uint8_t *)buff, sector && 9 ,SECTOR_SIZE, count + 1);
& && && && && & if (Status != SD_OK)
& && && && && & {
& && && && && && &&&res = RES_ERROR;
& && && && && && &&&
& && && && && & }
& && && && &#ifdef SD_DMA_MODE
& && && && && & /* SDIO工作在DMA模式,需要检查操作DMA传输是否完成 */
& && && && && & Status = SD_WaitReadOperation();
& && && && && & if (Status != SD_OK)
& && && && && & {
& && && && && && &&&res = RES_ERROR;
& && && && && && &&&
& && && && && & }
& && && && && & while(SD_GetStatus() != SD_TRANSFER_OK);
& && && && &#endif
& && && && && & res = RES_OK;
& && && && &}
& && && && &
& && &&&case FS_NAND :
& && && && &if (NAND_OK == NAND_WriteMultiSectors((uint8_t *)buff, sector, 512, count))
& && && && &{
& && && && && & res = RES_OK;
& && && && &}
& && && && &else
& && && && &{
& && && && && & printf(&NAND_WriteMultiSectors() Error! sector = %d, count = %d \r\n&, sector, count);
& && && && && & res = RES_ERROR;
& && && && &}
& && && && &
& && &&&case FS_USB :
& && && && &//res = USB_disk_write(buff, sector, count);
& && && && &{
& && && && && & BYTE status = USBH_MSC_OK;
& && && && && & //if (drv || !count) return RES_PARERR;
& && && && && & //if (Stat & STA_NOINIT) return RES_NOTRDY;
& && && && && & //if (Stat & STA_PROTECT) return RES_WRPRT;
& && && && && & if (HCD_IsDeviceConnected(&USB_OTG_Core))
& && && && && & {
& && && && && && &&&do
& && && && && && &&&{
& && && && && && && && &status = USBH_MSC_Write10(&USB_OTG_Core,(BYTE*)buff,sector, 512 * count);
& && && && && && && && &USBH_MSC_HandleBOTXfer(&USB_OTG_Core, &USB_Host);
& && && && && && && && &if(!HCD_IsDeviceConnected(&USB_OTG_Core))
& && && && && && && && &{
& && && && && && && && && &
& && && && && && && && &}
& && && && && && &&&}
& && && && && && &&&while(status == USBH_MSC_BUSY );
& && && && && & }
& && && && && & if (status == USBH_MSC_OK)
& && && && && & {
& && && && && && &&&res = RES_OK;
& && && && && & }
& && && && && & else
& && && && && & {
& && && && && && &&&res = RES_ERROR;
& && && && && & }
& && && && &}
& && && && &
& && &&&default:
& && && && &res = RES_PARERR;
& && && && &
/*-----------------------------------------------------------------------*/
/* Miscellaneous Functions& && && && && && && && && && && && && && && &&&*/
/*-----------------------------------------------------------------------*/
#if _USE_IOCTL
DRESULT disk_ioctl (
& & BYTE pdrv,& && &&&/* Physical drive nmuber (0..) */
& & BYTE cmd,& && &&&/* Control code */
& & void *buff& && &&&/* Buffer to send/receive control data */
& & DRESULT
& & switch (pdrv) {
& & case FS_SD :
& && &&&/* SD卡磁盘容量: SDCardInfo.CardCapacity */
& && &&&res = RES_OK;
& & case FS_NAND :
& && && && &DRESULT res = RES_OK;
& && && && &res = RES_ERROR;
& && && && &switch (cmd)
& && && && &{
& && && && && & case CTRL_SYNC :& && &&&/* Make sure that no pending write process */
& && && && && && &&&res = RES_OK;
& && && && && && &&&
& && && && && & case GET_SECTOR_COUNT :& & /* Get number of sectors on the disk (DWORD) */
& && && && && && &&&*(DWORD*)buff = 262144;
& && && && && && &&&res = RES_OK;
& && && && && && &&&
& && && && && & case GET_SECTOR_SIZE :& & /* Get R/W sector size (WORD) */
& && && && && && &&&*(WORD*)buff = 512;
& && && && && && &&&res = RES_OK;
& && && && && && &&&
& && && && && & case GET_BLOCK_SIZE :& & /* Get erase block size in unit of sector (DWORD) */\
& && && && && && &&&*(DWORD*)buff = 512;
& && && && && && &&&res = RES_OK;
& && && && && && &&&
& && && && && & default:
& && && && && && &&&res = RES_PARERR;
& && && && && && &&&
& && && && &}
& && && && && && && && &
& & case FS_USB :
& && && && &DRESULT res = RES_OK;
& && && && &//if (drv) return RES_PARERR;
& && && && &res = RES_ERROR;
& && && && &//if (Stat & STA_NOINIT) return RES_NOTRDY;
& && && && &switch (cmd)
& && && && &{
& && && && && & case CTRL_SYNC :& && &&&/* Make sure that no pending write process */
& && && && && && &&&res = RES_OK;
& && && && && && &&&
& && && && && & case GET_SECTOR_COUNT :& & /* Get number of sectors on the disk (DWORD) */
& && && && && && &&&*(DWORD*)buff = (DWORD) USBH_MSC_Param.MSC
& && && && && && &&&res = RES_OK;
& && && && && && &&&
& && && && && & case GET_SECTOR_SIZE :& & /* Get R/W sector size (WORD) */
& && && && && && &&&*(WORD*)buff = 512;
& && && && && && &&&res = RES_OK;
& && && && && && &&&
& && && && && & case GET_BLOCK_SIZE :& & /* Get erase block size in unit of sector (DWORD) */\
& && && && && && &&&*(DWORD*)buff = 512;
& && && && && && &&&res = RES_OK;
& && && && && && &&&
& && && && && & default:
& && && && && && &&&res = RES_PARERR;
& && && && && && &&&
& && && && &}
& && && && &
& & return RES_PARERR;
// =======================================================================================
/* 用于测试读写速度 */
#define TEST_FILE_LEN& && && && &(2*)& & /* 用于测试的文件长度 */
#define BUF_SIZE& && && && && & (4*1024)& && &&&/* 每次读写SD卡的最大数据长度 */
uint8_t g_TestBuf[BUF_SIZE];
/* 仅允许本文件内调用的函数声明 */
static void DispMenu(void);
static void ViewRootDir(uint8_t _DiskVolume);
static void CreateNewFile(uint8_t _DiskVolume);
static void ReadFileData(uint8_t _DiskVolume);
static void CreateDir(uint8_t _DiskVolume);
static void DeleteDirFile(uint8_t _DiskVolume);
static void WriteFileTest(void);
*********************************************************************************************************
*& & 函 数 名: DemoFatFS
*& & 功能说明: FatFS文件系统演示主程序
*& & 形& & 参:无
*& & 返 回 值: 无
*********************************************************************************************************
void DemoFatFS(void)
& & uint8_
& & uint8_t ucVolume = 0;
& && &/* Init Host Library */
& & #ifdef USE_USB_OTG_FS
& && &&&USBH_Init(&USB_OTG_Core,
& && && && &USB_OTG_FS_CORE_ID,
& && && && &&USB_Host,
& && && && &&USBH_MSC_cb,
& && && && &&USR_cb);
& && &&&USBH_Init(&USB_OTG_Core,
& && && && &USB_OTG_HS_CORE_ID,
& && && && &&USB_Host,
& && && && &&USBH_MSC_cb,
& && && && &&USR_cb);
& & #endif
& & /* 打印命令列表,用户可以通过串口操作指令 */
& & DispMenu();
& & while (1)
& && &&&bsp_Idle();& && &&&/* 这个函数在bsp.c文件。用户可以修改这个函数实现CPU休眠和喂狗 */
& && &&&USBH_Process(&USB_OTG_Core, &USB_Host);
& && &&&if (comGetChar(COM1, &cmd))& & /* 从串口读入一个字符(非阻塞方式) */
& && && && &printf(&\r\n&);
& && && && &switch (cmd)
& && && && &{
& && && && && & case '1':
& && && && && && &&&printf(&【1 - 显示SD卡根目录文件】\r\n&);
& && && && && && &&&ViewRootDir(FS_SD);& && && && &/* 显示SD卡根目录下的文件名 */
& && && && && && &&&printf(&【1 - 显示NAND Flash根目录文件】\r\n&);
& && && && && && &&&ViewRootDir(FS_NAND);& && &&&/* 显示U盘根目录下的文件名 */
& && && && && && &&&printf(&【1 - 显示U盘根目录文件】\r\n&);
& && && && && && &&&ViewRootDir(FS_USB);& && &&&/* 显示U盘根目录下的文件名 */
& && && && && && &&&
& && && && && & case '2':
& && && && && && &&&printf(&【2 - CreateNewFile】\r\n&);
& && && && && && &&&CreateNewFile(FS_SD);& & /* 创建一个新文件,写入一个字符串 */
& && && && && && &&&CreateNewFile(FS_NAND);& & /* 创建一个新文件,写入一个字符串 */
& && && && && && &&&CreateNewFile(FS_USB);& & /* 创建一个新文件,写入一个字符串 */
& && && && && && &&&
& && && && && & case '3':
& && && && && && &&&printf(&【3 - ReadFileData】\r\n&);
& && && && && && &&&ReadFileData(FS_SD);& && &&&/* 读取根目录下armfly.txt的内容 */
& && && && && && &&&ReadFileData(FS_NAND);& && &&&/* 读取根目录下armfly.txt的内容 */
& && && && && && &&&ReadFileData(FS_USB);& && &&&/* 读取根目录下armfly.txt的内容 */
& && && && && && &&&
& && && && && & case '4':
& && && && && && &&&printf(&【4 - CreateDir】\r\n&);
& && && && && && &&&CreateDir(FS_SD);& && &&&/* 创建目录 */
& && && && && && &&&CreateDir(FS_NAND);& && &&&/* 创建目录 */
& && && && && && &&&CreateDir(FS_USB);& && &&&/* 创建目录 */
& && && && && && &&&
& && && && && & case '5':
& && && && && && &&&printf(&【5 - DeleteDirFile】\r\n&);
& && && && && && &&&DeleteDirFile(FS_SD);& & /* 删除目录和文件 */
& && && && && && &&&DeleteDirFile(FS_NAND);& & /* 删除目录和文件 */
& && && && && && &&&DeleteDirFile(FS_USB);& & /* 删除目录和文件 */
& && && && && && &&&
& && && && && & case '6':
& && && && && && &&&printf(&【6 - TestSpeed】\r\n&);
& && && && && && &&&WriteFileTest();& & /* 速度测试 */
& && && && && && &&&
& && && && && & case '0':
& && && && && && &&&printf(&Start Format(Low Level) NAND Flash......\r\n&);
& && && && && && &&&NAND_Format();
& && && && && && &&&printf(&NAND Flash Format Ok\r\n&);
& && && && && && &&&
& && && && && & case 'V':& && &&&/* 切换当前盘符 */
& && && && && & case 'v':
& && && && && && &&&if (ucVolume == FS_SD)
& && && && && && &&&{
& && && && && && && && &ucVolume = FS_NAND;
& && && && && && &&&}
& && && && && && &&&else if (ucVolume == FS_NAND)
& && && && && && &&&{
& && && && && && && && &ucVolume = FS_USB;
& && && && && && &&&}
& && && && && && &&&else
& && && && && && &&&{
& && && && && && && && &ucVolume = FS_SD;
& && && && && && &&&}
& && && && && && &&&
& && && && && & default:
& && && && && && &&&DispMenu();
& && && && && && &&&
& && && && &}
& && &&&}& & /* comGetChar(COM1, &cmd) */
*********************************************************************************************************
*& & 函 数 名: DispMenu
*& & 功能说明: 显示操作提示菜单
*& & 形& & 参:无
*& & 返 回 值: 无
*********************************************************************************************************
static void DispMenu(void)
& & printf(&\r\n------------------------------------------------\r\n&);
& & printf(&请选择操作命令:\r\n&);
& & printf(&1 - 显示根目录下的文件列表\r\n&);
& & printf(&2 - 创建一个新文件armfly.txt\r\n&);
& & printf(&3 - 读armfly.txt文件的内容\r\n&);
& & printf(&4 - 创建目录\r\n&);
& & printf(&5 - 删除文件和目录\r\n&);
& & printf(&6 - 读写文件速度测试\r\n&);
& & printf(&0 - NAND Flash 低级格式化\r\n&);
*********************************************************************************************************
*& & 函 数 名: ViewRootDir
*& & 功能说明: 显示SD卡根目录下的文件名
*& & 形& & 参: _ucVolume : 磁盘卷标 0 - 2
*& & 返 回 值: 无
*********************************************************************************************************
static void ViewRootDir(uint8_t _ucVolume)
& & /* 本函数使用的局部变量占用较多,请修改启动文件,保证堆栈空间够用 */
& & FRESULT
& & DIR DirI
& & FILINFO FileI
& & uint32_t cnt = 0;
& & char lfname[256];
& & char path[32];
& &&&/* 挂载文件系统 */
& & result = f_mount(_ucVolume, &fs);& & /* Mount a logical drive */
& & if (result != FR_OK)
& && &&&printf(&挂载文件系统失败 (%d)\r\n&, result);
& & /* 打开根文件夹 */
& & sprintf(path, &%d:/&, _ucVolume);& &&&/* 1: 表示盘符 */
& & result = f_opendir(&DirInf, path);
& & if (result != FR_OK)
& && &&&printf(&打开根目录失败 (%d)\r\n&, result);
& & /* 读取当前文件夹下的文件和目录 */
& & FileInf.lfname =
& & FileInf.lfsize = 256;
& & printf(&属性& && &&&|&&文件大小 | 短文件名 | 长文件名\r\n&);
& & for (cnt = 0; ;cnt++)
& && &&&result = f_readdir(&DirInf,&FileInf);& && && &/* 读取目录项,索引会自动下移 */
& && &&&if (result != FR_OK || FileInf.fname[0] == 0)
& && && && &
& && &&&if (FileInf.fname[0] == '.')
& && && && &
& && &&&/* 判断是文件还是子目录 */
& && &&&if (FileInf.fattrib & AM_DIR)
& && && && &printf(&(0x%02d)目录&&&, FileInf.fattrib);
& && &&&else
& && && && &printf(&(0x%02d)文件&&&, FileInf.fattrib);
& && &&&/* 打印文件大小, 最大4G */
& && &&&printf(& %10d&, FileInf.fsize);
& && &&&printf(&&&%s |&, FileInf.fname);& & /* 短文件名 */
& && &&&printf(&&&%s\r\n&, (char *)FileInf.lfname);& & /* 长文件名 */
& & /* 卸载文件系统 */
& & f_mount(_ucVolume, NULL);
*********************************************************************************************************
*& & 函 数 名: CreateNewFile
*& & 功能说明: 在SD卡创建一个新文件,文件内容填写“”
*& & 形& & 参:无
*& & 返 回 值: 无
*********************************************************************************************************
static void CreateNewFile(uint8_t _ucVolume)
& & /* 本函数使用的局部变量占用较多,请修改启动文件,保证堆栈空间够用 */
& & FRESULT
& & DIR DirI
& & uint32_
& & char path[32];
& &&&/* 挂载文件系统 */
& & result = f_mount(_ucVolume, &fs);& && && && &/* Mount a logical drive */
& & if (result != FR_OK)
& && &&&printf(&挂载文件系统失败 (%d)\r\n&, result);
& & /* 打开根文件夹 */
& & sprintf(path, &%d:/&, _ucVolume);
& & result = f_opendir(&DirInf, path);
& & if (result != FR_OK)
& && &&&printf(&打开根目录失败 (%d)\r\n&, result);
& & /* 打开文件 */
& & sprintf(path, &%d:/armfly.txt&, _ucVolume);
& & result = f_open(&file, path, FA_CREATE_ALWAYS | FA_WRITE);
& & /* 写一串数据 */
& & result = f_write(&file, &FatFS Write Demo& & \r\n&, 34, &bw);
& & if (result == FR_OK)
& && &&&printf(&%s 文件写入成功\r\n&, path);
& && &&&printf(&%s 文件写入失败\r\n&, path);
& & /* 关闭文件*/
& & f_close(&file);
& & /* 卸载文件系统 */
& & f_mount(_ucVolume, NULL);
*********************************************************************************************************
*& & 函 数 名: ReadFileData
*& & 功能说明: 读取文件armfly.txt前128个字符,并打印到串口
*& & 形& & 参:无
*& & 返 回 值: 无
*********************************************************************************************************
static void ReadFileData(uint8_t _ucVolume)
& & /* 本函数使用的局部变量占用较多,请修改启动文件,保证堆栈空间够用 */
& & FRESULT
& & DIR DirI
& & uint32_
& & char buf[128];
& & char path[32];
& &&&/* 挂载文件系统 */
& & result = f_mount(_ucVolume, &fs);& && && && &/* Mount a logical drive */
& & if (result != FR_OK)
& && &&&printf(&挂载文件系统失败(%d)\r\n&, result);
& & /* 打开根文件夹 */
& & sprintf(path, &%d:/&, _ucVolume);
& & result = f_opendir(&DirInf, path);& &&&/* 1: 表示盘符 */
& & if (result != FR_OK)
& && &&&printf(&打开根目录失败(%d)\r\n&, result);
& & /* 打开文件 */
& & sprintf(path, &%d:/armfly.txt&, _ucVolume);
& & result = f_open(&file, path, FA_OPEN_EXISTING | FA_READ);
& & if (result !=&&FR_OK)
& && &&&printf(&Don't Find File : %s\r\n&, path);
& & /* 读取文件 */
& & result = f_read(&file, &buf, sizeof(buf) - 1, &bw);
& & if (bw & 0)
& && &&&buf[bw] = 0;
& && &&&printf(&\r\n%s 文件内容 : \r\n%s\r\n&, path,buf);
& && &&&printf(&\r\n %s文件内容 : \r\n&, path);
& & /* 关闭文件*/
& & f_close(&file);
& & /* 卸载文件系统 */
& & f_mount(_ucVolume, NULL);
*********************************************************************************************************
*& & 函 数 名: CreateDir
*& & 功能说明: 在SD卡根目录创建Dir1和Dir2目录,在Dir1目录下创建子目录Dir1_1
*& & 形& & 参:无
*& & 返 回 值: 无
*********************************************************************************************************
static void CreateDir(uint8_t _ucVolume)
& & /* 本函数使用的局部变量占用较多,请修改启动文件,保证堆栈空间够用 */
& & FRESULT
& & char path[32];
& &&&/* 挂载文件系统 */
& & result = f_mount(_ucVolume, &fs);& && && && &/* Mount a logical drive */
& & if (result != FR_OK)
& && &&&printf(&挂载文件系统失败 (%d)\r\n&, result);
& & /* 创建目录/Dir1 */
& & sprintf(path, &%d:/Dir1&, _ucVolume);
& & result = f_mkdir(path);
& & if (result == FR_OK)
& && &&&printf(&f_mkdir %s Ok\r\n&, path);
& & else if (result == FR_EXIST)
& && &&&printf(&%s 目录已经存在(%d)\r\n&,path, result);
& && &&&printf(&f_mkdir %s 失败 (%d)\r\n&,path, result);
& & /* 创建目录/Dir2 */
& & sprintf(path, &%d:/Dir2&, _ucVolume);
& & result = f_mkdir(path);
& & if (result == FR_OK)
& && &&&printf(&f_mkdir %s Ok\r\n&, path);
& & else if (result == FR_EXIST)
& && &&&printf(&%s 目录已经存在(%d)\r\n&, path, result);
& && &&&printf(&f_mkdir %s 失败 (%d)\r\n&, path, result);
& & /* 创建子目录 /Dir1/Dir1_1& && & 注意:创建子目录Dir1_1时,必须先创建好Dir1 */
& & sprintf(path, &%d://Dir1/Dir1_1&, _ucVolume);
& & result = f_mkdir(path);
& & if (result == FR_OK)
& && &&&printf(&f_mkdir %s 成功\r\n&, path);
& & else if (result == FR_EXIST)
& && &&&printf(&%s 目录已经存在 (%d)\r\n&,path, result);
& && &&&printf(&f_mkdir %s 失败 (%d)\r\n&,path, result);
& & /* 卸载文件系统 */
& & f_mount(_ucVolume, NULL);
*********************************************************************************************************
*& & 函 数 名: DeleteDirFile
*& & 功能说明: 删除SD卡根目录下的 armfly.txt 文件和 Dir1,Dir2 目录
*& & 形& & 参:无
*& & 返 回 值: 无
*********************************************************************************************************
static void DeleteDirFile(uint8_t _ucVolume)
& & /* 本函数使用的局部变量占用较多,请修改启动文件,保证堆栈空间够用 */
& & FRESULT
& & char FileName[13];
& & uint8_
& & char path[32];
& &&&/* 挂载文件系统 */
& & result = f_mount(_ucVolume, &fs);& && && && &/* Mount a logical drive */
& & if (result != FR_OK)
& && &&&printf(&挂载文件系统失败 (%d)\r\n&, result);
& & /* 删除目录/Dir1 【因为还存在目录非空(存在子目录),所以这次删除会失败】*/
& & sprintf(path, &%d:/Dir1&, _ucVolume);
& & result = f_unlink(path);
& & if (result == FR_OK)
& && &&&printf(&删除目录%s成功\r\n&, path);
& & else if (result == FR_NO_FILE)
& && &&&printf(&没有发现文件或目录 :%s\r\n&, path);
& && &&&printf(&删除%s失败(错误代码 = %d) 文件只读或目录非空\r\n&,path, result);
& & /* 先删除目录/Dir1/Dir1_1 */
& & sprintf(path, &%d:/Dir1/Dir1_1&, _ucVolume);
& & result = f_unlink(path);
& & if (result == FR_OK)
& && &&&printf(&删除子目录%s成功\r\n&, path);
& & else if ((result == FR_NO_FILE) || (result == FR_NO_PATH))
& && &&&printf(&没有发现文件或目录 :%s\r\n&, path);
& && &&&printf(&删除子目录%s失败(错误代码 = %d) 文件只读或目录非空\r\n&, path, result);
& & /* 先删除目录/Dir1 */
& & sprintf(path, &%d:/Dir1&, _ucVolume);
& & result = f_unlink(path);
& & if (result == FR_OK)
& && &&&printf(&删除目录%s成功\r\n&, path);
& & else if (result == FR_NO_FILE)
& && &&&printf(&没有发现文件或目录 :%s\r\n&, path);
& && &&&printf(&删除%s失败(错误代码 = %d) 文件只读或目录非空\r\n&,path, result);
& & /* 删除目录/Dir2 */
& & sprintf(path, &%d:/Dir2&, _ucVolume);
& & result = f_unlink(path);
& & if (result == FR_OK)
& && &&&printf(&删除目录 %s 成功\r\n&, path);
& & else if (result == FR_NO_FILE)
& && &&&printf(&没有发现文件或目录 :%s\r\n&, path);
& && &&&printf(&删除%s失败(错误代码 = %d) 文件只读或目录非空\r\n&, path, result);
& & /* 删除文件 armfly.txt */
& & result = f_unlink(&1:/armfly.txt&);
& & if (result == FR_OK)
& && &&&printf(&删除文件 armfly.txt 成功\r\n&);
& & else if (result == FR_NO_FILE)
& && &&&printf(&没有发现文件或目录 :%s\r\n&, &armfly.txt&);
& && &&&printf(&删除armfly.txt失败(错误代码 = %d) 文件只读或目录非空\r\n&, result);
& & /* 删除文件 speed1.txt */
& & for (i = 0; i & 20; i++)
& && &&&sprintf(FileName, &%d:/Speed%02d.txt&, _ucVolume, i);& & /* 每写1次,序号递增 */
& && &&&result = f_unlink(FileName);
& && &&&if (result == FR_OK)
& && && && &printf(&删除文件%s成功\r\n&, FileName);
& && &&&else if (result == FR_NO_FILE)
& && && && &printf(&没有发现文件:%s\r\n&, FileName);
& && &&&else
& && && && &printf(&删除%s文件失败(错误代码 = %d) 文件只读或目录非空\r\n&, FileName, result);
& & /* 卸载文件系统 */
& & f_mount(_ucVolume, NULL);
*********************************************************************************************************
*& & 函 数 名: WriteFileTest
*& & 功能说明: 测试文件读写速度
*& & 形& & 参:无
*& & 返 回 值: 无
*********************************************************************************************************
static void WriteFileTest(void)
& & /* 本函数使用的局部变量占用较多,请修改启动文件,保证堆栈空间够用 */
& & FRESULT
& & DIR DirI
& & uint32_
& & uint32_t i,k;
& & uint32_t runtime1,runtime2,
& & uint8_t err = 0;
& & char TestFileName[13];
& & static uint8_t s_ucTestSn = 0;
& & for (i = 0; i & sizeof(g_TestBuf); i++)
& && &&&g_TestBuf = (i / 512) + '0';
& && &/* 挂载文件系统 */
& & result = f_mount(FS_NAND, &fs);& && && && &/* Mount a logical drive */
& & if (result != FR_OK)
& && &&&printf(&挂载文件系统失败 (%d)\r\n&, result);
& & /* 打开根文件夹 */
& & result = f_opendir(&DirInf, &1:/&); /* 如果不带参数,则从当前目录开始 */
& & if (result != FR_OK)
& && &&&printf(&打开根目录失败 (%d)\r\n&, result);
& & /* 打开文件 */
& & sprintf(TestFileName, &1:/Speed%02d.txt&, s_ucTestSn++);& && &&&/* 每写1次,序号递增 */
& & result = f_open(&file, TestFileName, FA_CREATE_ALWAYS | FA_WRITE);
& & /* 写一串数据 */
& & printf(&开始写文件%s %dKB ...\r\n&, TestFileName, TEST_FILE_LEN / 1024);
& & runtime1 = bsp_GetRunTime();& & /* 读取系统运行时间 */
& & for (i = 0; i & TEST_FILE_LEN / BUF_SIZE; i++)
& && &&&result = f_write(&file, g_TestBuf, sizeof(g_TestBuf), &bw);
& && &&&if (result == FR_OK)
& && && && &if (((i + 1) % 8) == 0)
& && && && &{
& && && && && & printf(&.&);
& && && && &}
& && &&&else
& && && && &err = 1;
& && && && &printf(&%s文件写失败\r\n&, TestFileName);
& && && && &
& & runtime2 = bsp_GetRunTime();& & /* 读取系统运行时间 */
& & if (err == 0)
& && &&&timelen = (runtime2 - runtime1);
& && &&&printf(&\r\n&&写耗时 : %dms& &平均写速度 : %dB/S (%dKB/S)\r\n&,
& && && && &timelen,
& && && && &(TEST_FILE_LEN * 1000) / timelen,
& && && && &((TEST_FILE_LEN / 1024) * 1000) / timelen);
& & f_close(&file);& && &&&/* 关闭文件*/
& & /* 开始读文件测试 */
& & result = f_open(&file, TestFileName, FA_OPEN_EXISTING | FA_READ);
& & if (result !=&&FR_OK)
& && &&&printf(&没有找到文件: %s\r\n&, TestFileName);
& & printf(&开始读文件 %dKB ...\r\n&, TEST_FILE_LEN / 1024);
& & runtime1 = bsp_GetRunTime();& & /* 读取系统运行时间 */
& & for (i = 0; i & TEST_FILE_LEN / BUF_SIZE; i++)
& && &&&result = f_read(&file, g_TestBuf, sizeof(g_TestBuf), &bw);
& && &&&if (result == FR_OK)
& && && && &if (((i + 1) % 8) == 0)
& && && && &{
& && && && && & printf(&.&);
& && && && &}
& && && && &/* 比较写入的数据是否正确,此语句会导致读卡速度结果降低到 3.5MBytes/S */
& && && && &for (k = 0; k & sizeof(g_TestBuf); k++)
& && && && &{
& && && && && & if (g_TestBuf[k] != (k / 512) + '0')
& && && && && & {
& && && && && && && & err = 1;
& && && && && && &&&printf(&Speed1.txt 文件读成功,但是数据出错\r\n&);
& && && && && && &&&
& && && && && & }
& && && && &}
& && && && &if (err == 1)
& && && && &{
& && && && && &
& && && && &}
& && &&&else
& && && && &err = 1;
& && && && &printf(&Speed1.txt 文件读失败\r\n&);
& && && && &
& & runtime2 = bsp_GetRunTime();& & /* 读取系统运行时间 */
& & if (err == 0)
& && &&&timelen = (runtime2 - runtime1);
& && &&&printf(&\r\n&&读耗时 : %dms& &平均读速度 : %dB/S (%dKB/S)\r\n&, timelen,
& && && && &(TEST_FILE_LEN * 1000) / timelen, ((TEST_FILE_LEN / 1024) * 1000) / timelen);
& & /* 关闭文件*/
& & f_close(&file);
& & /* 卸载文件系统 */
& & f_mount(FS_NAND, NULL);
*********************************************************************************************************
*& & 函 数 名: main
*& & 功能说明: c程序入口
*& & 形& & 参:无
*& & 返 回 值: 错误代码(无需处理)
*********************************************************************************************************
int main(void)
& && &&&ST固件库中的启动文件已经执行了 SystemInit() 函数,该函数在 system_stm32f4xx.c 文件,主要功能是
& & 配置CPU系统的时钟,内部Flash访问时序,配置FSMC用于外部SRAM
& & bsp_Init();& && &&&/* 硬件初始化 */
& & PrintfLogo();& & /* 打印例程信息到串口1 */
& & DemoFatFS();& & /* FatFS文件系统演示程序 */
图片 截图如下:
请教下出现上面的情况一般是什么原因啊 ??
本帖子中包含更多资源
才可以下载或查看,没有帐号?
阿莫电子论坛, 原"中国电子开发网"

我要回帖

更多关于 sn write 下载 的文章

 

随机推荐