#define MSC_MemorySize 8380416//16384
Функция mmc_read_block(BlockNum) читает из MMC карточки сектор 512 байт с номером BlockNum. Для определения собсвенно его номера выполняю следующее :
Код
BlockNum=Offset>>9;
shift = Offset& 0x1FF;
shift = Offset& 0x1FF;
В итоге я могу прочитать и записать файлы , но их размер не может превышать около 20кБ , иначе подтирается нулевой сектор на MMC карточке и стирается заголовок файловой системы .Причем я отслеживаю в начале функции mmc_write_block(BlockNum) обращение к нулевому сектору и его НЕТУ.
Для ясности привожу подивицированный код фунции void MSC_MemoryRead (void)
Код
void MSC_MemoryRead (void)
{
WORD_ n,BlockNum;
WORD_ shift;
CE_H;/* set SPI SSEL */
if (Length > MSC_MAX_PACKET) {
n = MSC_MAX_PACKET;
} else {
n = Length;
}
if ((Offset + n) > MSC_MemorySize) {
n = MSC_MemorySize - Offset;
BulkStage = MSC_BS_DATA_IN_LAST_STALL;
}
/////////////
BlockNum=Offset>>9;
shift = Offset& 0x1FF;
if (shift==0)
{
FLAG=1;
if ( mmc_read_block(BlockNum) )
printf ("\n ERROR READ SD CARD _ MemoryRead Sector=%d\n",BlockNum);
#ifdef enable_debug
printf ("\nread BlockNum=%ld n=%d",BlockNum,n);
#endif
FLAG=0;
}
/////////////
USB_WriteEP(MSC_EP_IN, (BYTE *)(MSC_MemoryStart + /*Offset*/shift), n);
Offset += n;
Length -= n;
CSW.dDataResidue -= n;
if (Length == 0) {
BulkStage = MSC_BS_DATA_IN_LAST;
}
if (BulkStage != MSC_BS_DATA_IN) {
//IOCLR1 = LED_RD; /* Turn Off Read LED */
IOCLR0 = 1 << 10;
CSW.bStatus = CSW_CMD_PASSED;
}
}
{
WORD_ n,BlockNum;
WORD_ shift;
CE_H;/* set SPI SSEL */
if (Length > MSC_MAX_PACKET) {
n = MSC_MAX_PACKET;
} else {
n = Length;
}
if ((Offset + n) > MSC_MemorySize) {
n = MSC_MemorySize - Offset;
BulkStage = MSC_BS_DATA_IN_LAST_STALL;
}
/////////////
BlockNum=Offset>>9;
shift = Offset& 0x1FF;
if (shift==0)
{
FLAG=1;
if ( mmc_read_block(BlockNum) )
printf ("\n ERROR READ SD CARD _ MemoryRead Sector=%d\n",BlockNum);
#ifdef enable_debug
printf ("\nread BlockNum=%ld n=%d",BlockNum,n);
#endif
FLAG=0;
}
/////////////
USB_WriteEP(MSC_EP_IN, (BYTE *)(MSC_MemoryStart + /*Offset*/shift), n);
Offset += n;
Length -= n;
CSW.dDataResidue -= n;
if (Length == 0) {
BulkStage = MSC_BS_DATA_IN_LAST;
}
if (BulkStage != MSC_BS_DATA_IN) {
//IOCLR1 = LED_RD; /* Turn Off Read LED */
IOCLR0 = 1 << 10;
CSW.bStatus = CSW_CMD_PASSED;
}
}
Какие есть соображения товарищи коллеги ???
Есть ли альтернатива примеру Mass Storage с сайта Keil . (но необходимо именно под компилятор CARM либо RV , т.к USB d проекте является небольшой частью, а остальная часть кода уже написано именно под Keil)