2015-10-13 04:07 AM
2015-10-13 04:57 AM
Why don't you try to format it the traditional way using Windows (right click on drive then Format)? Maybe it's DiskPart's fault. If you have to use command line then I believe it's something like this (where Z: is you drive's letter):
format Z: /FS:NTFS /V:MYLABEL /Q
Warning: If you use NTFS you can't access your files in the microcontroller using FatFs, so use FAT or FAT32 instead of NTFS.2015-10-13 05:09 AM
I'd instrument the code outputting the sector numbers it's accessing and double check the read/write are successful, and what sense codes are passed back to Windows. Check also the 64-bit math related to the size is correct.
2015-10-13 05:09 AM
I tried all possible ways to format it (with Windows). None of them work. DiskPart can give you a bit more clue, about what goes wrong than only format command.
Only thing I did not try is to format it using qparted live cd, but I do not want to go there, as I am sure, the problem is with my implementation in the code.2015-10-13 05:23 AM
clive1, thanks for your input.
This is the card info I get from eMMC: *block_size = SDCardInfo.CardBlockSize = 512 *block_num = SDCardInfo.CardCapacity / SDCardInfo.CardBlockSize =8388608 I think I may have a problem with descriptor:const int8_t STORAGE_Inquirydata_FS[] = {
/* LUN 0 */
0x00,
0x80,
0x02,
0x02,
(STANDARD_INQUIRY_DATA_LEN - 5),
0x00,
0x00,
0x00,
'S', 'T', 'M', ' ', ' ', ' ', ' ', ' ', /* Manufacturer : 8 bytes */
'P', 'r', 'o', 'd', 'u', 'c', 't', ' ', /* Product : 16 Bytes */
' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
'0', '.', '0' ,'1', /* Version : 4 Bytes */
};
/* USB Standard Device Descriptor */
__ALIGN_BEGIN uint8_t USBD_FS_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END =
{
0x12, /*bLength */
USB_DESC_TYPE_DEVICE, /*bDescriptorType*/
#if (USBD_LPM_ENABLED == 1)
0x01, /*bcdUSB */ /* changed to USB version 2.01
in order to support LPM L1 suspend
resume test of USBCV3.0*/
#else
0x00, /* bcdUSB */
#endif
0x02,
0x00, /*bDeviceClass*/
0x00, /*bDeviceSubClass*/
0x00, /*bDeviceProtocol*/
USB_MAX_EP0_SIZE, /*bMaxPacketSize*/
LOBYTE(USBD_VID), /*idVendor*/
HIBYTE(USBD_VID), /*idVendor*/
LOBYTE(USBD_PID_FS), /*idVendor*/
HIBYTE(USBD_PID_FS), /*idVendor*/
0x00, /*bcdDevice rel. 2.00*/
0x02,
USBD_IDX_MFC_STR, /*Index of manufacturer string*/
USBD_IDX_PRODUCT_STR, /*Index of product string*/
USBD_IDX_SERIAL_STR, /*Index of serial number string*/
USBD_MAX_NUM_CONFIGURATION /*bNumConfigurations*/
} ;
( USBD_LPM_ENABLED = 0 )
#define USBD_VID 1155
#define USBD_LANGID_STRING 1033
#define USBD_MANUFACTURER_STRING ''STMicroelectronics''
#define USBD_PID_FS 22314
#define USBD_PRODUCT_STRING_FS ''STM32 Mass Storage''
/* USER CODE BEGIN SERIALNUMBER_STRING_FS */
#define USBD_SERIALNUMBER_STRING_FS ''00000000001A''
/* USER CODE END SERIALNUMBER_STRING_FS */
#define USBD_CONFIGURATION_STRING_FS ''MSC Config''
#define USBD_INTERFACE_STRING_FS ''MSC Interface''
2015-10-14 01:38 AM
Update to the thread...
I found the problem. I forgot to wait for DMA to complete my requests...Sdio_WaitUntilDmaRdComplete(); andSdio_WaitUntilDmaTxComplete(); were missing inSTORAGE_Read_FS andSTORAGE_Write_FSeMMC_ReadMultiBlocks(buf, blk_addr, blk_len);
Sdio_WaitUntilDmaRdComplete();
I was sucessful with formatting 5MB big size, formatting 4GB is stil in progress... it takes very long time. By current estimations... cca 4 days!! And from what I found out, it is the problem with waiting for reponse flag from eMMC that DMA reading/writting was completed. Formatting is basically writing byte by byte from Windows side, not for whole block (512) in one step, but 512 steps for each block.
This issue I will address with implementing Chan FatFS and trying to execute format from fw side.
2015-10-22 03:28 PM
Hi,
Glad to hear you resolved this.We are also trying to interface with 4G eMMC using SDIO interface, but can't find any drivers for this.I see that you have some code snippets attached that do this, and was hoping you might be able to give a pointer to where the source code for this resides on the ST site (or elsewhere). I can't seem to find it anywhere.Thanks,Al2015-10-23 03:20 AM
Hi Al,
I also had big problem with finding some sample for handling eMMC. In the end, I had to go through all documentation of stm32f429 manual and JEDEC standard used on eMMC. I have finished handling yesterday, so the code above is not 100% complete and may include some small errors.As this is a part of the code I did at work, I cannot give you all of the code, but if you will have any specific questions, I will try to answer you.As a first test, I used the sample code generated from CubeMx, to get some feeling, how ST thinks of handling things (this is my first project with eMMC and STM). Then I had problems with using HAL drivers as some things are missing in HAL driver (which are in standard driver) and I manually checked differences and added some direct settings for registers etc. in my updated code...Workflow:1. SDIO init (with SDIO_BUS_WIDE_1B !)2. NVIC config3. eMMC init (eMMC commands)4. set eMMC bus width to 85. set SDIO bus width to 86. SDIO clock to 24kHz7. eMMC get card info (parsing results from command executed already in eMMC init step8. here I have 2 options:8.1 mounting FatFs by Chan on eMMC inside Firmwareor8.2 mounting eMMC to USB MSD driver and using eMMC as Fat32 via usb on WindowsSD_read, SD_write for FatFs by Chan I pointed to same functions for STORAGE_Read_FS, STORAGE_Write_FS used by USB MSD. In this function then you have to:1. check if eMMC is ready for data !! (otherwise I got corrupted files)2. read/write to eMMC3. wait for DMA read/write process to completeThe speed of reading from eMMC via USB MSD on Windows is cca 0,69 MB/s , write is cca 0,51 MB/s (tested with USB Flash Benchmark tool) and I am (for the moment) satisfied with this results as I am using USB FS and not USB HS.Best regards, U.2015-10-23 04:08 AM
> 6. SDIO clock to 24kHz
Isn't it too slow? Or maybe it's a typo (should've been MHz). If not, then maybe that's why your read/write speed is not impressive. Here is what the reference manual of STM32F429 saying:SDIO_CK is the clock to the card: one bit is transferred on both command and data lineswith each clock cycle. The clock frequency can vary between 0 MHz and 20 MHz (for a
MultiMediaCard V3.31), between 0 and 48 MHz for a MultiMediaCard V4.0/4.2, or between 0 and 25 MHz (for an SD/SD I/O card).
2015-10-23 05:40 AM
Yes, of course. That was a typo. 24 MHz is correct.
Sdio_SetClock_kHz(24000);uint16_t Sdio_SetClock_kHz(uint16_t Freq)
{
uint32_t tmpreg;
uint16_t Divisor;
Divisor = 48000/Freq-2;
tmpreg = SDIO->CLKCR;
tmpreg &= 0xFFFFFF00;
Divisor &= 0x00FF;
tmpreg += Divisor;
SDIO->CLKCR = tmpreg;
return Divisor;
}