hi, i am working on a project that in it i need to write and read sectors in sd card, i decide to use keil File system lib with mci driver but i have problem to write sector in sd card but reading is ok. i use below code to initilize sd card:
if (finit ("M0:") != fsOK) { // Initialize File System return 0; // Exit if failed } id = fs_ioc_get_id ("M0:"); // Get ID of media drive if (sdcard_drv_id < 0U) { return 0; } // If ID is invalid exit status = 0U; if (fs_ioc_device_ctrl (id, fsDevCtrlCodeControlMedia, &status) != fsOK) { return 0; // Exit if failed } if (fs_ioc_lock (id)) { // Lock media for USB usage return 0; // Exit if failed } st = fs_ioc_write_sector(id,0,buf,1); if(st != fsOK) return 0;
when i call fs_ioc_write_sector in above code it returns FsError(0x01) but when reading sector it work correctly. can any one give me an advise to solve that??
did you checked this ?? #define _USE_WRITE 1 #define _USE_IOCTL 1
you have to define in FF_GEN_DRV_H
where i must define these?? i added these defines in main,still not working. thanks for attention
in fatfs file called ****************************************************************************** * @file ff_gen_drv.h * @author MCD Application Team * @version V1.3.0 * @date 08-May-2015 * @brief Header for ff_gen_drv.c module. ****************************************************************************** * @attention * * <h2><center>© COPYRIGHT 2015 STMicroelectronics</center></h2> * * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); * You may not use this file except in compliance with the License. * You may obtain a copy of the License at: * * www.st.com/software_license_agreement_liberty_v2 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ****************************************************************************** */
/* Define to prevent recursive inclusion -------------------------------------*/ #ifndef __FF_GEN_DRV_H #define __FF_GEN_DRV_H
#ifdef __cplusplus extern "C" { #endif
/* Includes ------------------------------------------------------------------*/ #include "diskio.h" #include "ff.h" #include "stdint.h" /* Exported types ------------------------------------------------------------*/ #define _USE_WRITE 1 #define _USE_IOCTL 1 /** * @brief Disk IO Driver structure definition */ typedef struct { DSTATUS (*disk_initialize) (BYTE); /*!< Initialize Disk Drive */ DSTATUS (*disk_status) (BYTE); /*!< Get Disk Status */ DRESULT (*disk_read) (BYTE, BYTE*, DWORD, UINT); /*!< Read Sector(s) */ #if _USE_WRITE == 1 DRESULT (*disk_write) (BYTE, const BYTE*, DWORD, UINT); /*!< Write Sector(s) when _USE_WRITE = 0 */ #endif /* _USE_WRITE == 1 */ #if _USE_IOCTL == 1 DRESULT (*disk_ioctl) (BYTE, BYTE, void*); /*!< I/O control operation when _USE_IOCTL = 1 */ #endif /* _USE_IOCTL == 1 */
}Diskio_drvTypeDef;
/** * @brief Global Disk IO Drivers structure definition */ typedef struct { uint8_t is_initialized[_VOLUMES]; Diskio_drvTypeDef *drv[_VOLUMES]; uint8_t lun[_VOLUMES]; volatile uint8_t nbr;
}Disk_drvTypeDef;
/* Exported constants --------------------------------------------------------*/ /* Exported macro ------------------------------------------------------------*/ /* Exported functions ------------------------------------------------------- */ uint8_t FATFS_LinkDriverEx(Diskio_drvTypeDef *drv, char *path, uint8_t lun); uint8_t FATFS_LinkDriver(Diskio_drvTypeDef *drv, char *path); uint8_t FATFS_UnLinkDriver(char *path); uint8_t FATFS_LinkDriverEx(Diskio_drvTypeDef *drv, char *path, BYTE lun); uint8_t FATFS_UnLinkDriverEx(char *path, BYTE lun); uint8_t FATFS_GetAttachedDriversNbr(void);
#ifdef __cplusplus } #endif
#endif /* __FF_GEN_DRV_H */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
hi mohamad, i am using keil middleware file system under CMSIS:MCI driver, and i did n't find file that you point, also my mcu is lpc1788. after i programming keil usb file system example to my board, i notice that this example like my code can not write sector on sd card and writing done with fsError !!!! may be problem is keil side and library has a problem ???? i am still searching for solution and i can find problem.
after some hours of Paddle i noticed that fs_write sector write data on sd card(i can see writed data on hex editor when atach it to computer) but it return FsError !!!!!!! i wondered so, what is problem??
I uploaded file system files from outside and used it separate as any other c file that is why i can control my programs more easy check FATFS by chan files and try to implement it outside keil lib
don macki, I suggest that you take a look at your MCI driver and investigate if COMMAND_TIMEOUT/ERROR or TRANSFER_TIMEOUT/ERROR events are returned at some point.