Снова вынужден просить помощи.
Никак не получается прикрутить к stm32f103c8 файловую систему. Сама система FAT32 "обкатана" ещё на avr. Чтение сектора тоже функционирует верно.
Вот фрагмент кода:
Код
SD_ReadSector(partition->firstSector, buffer); //read the bpb sector
bpb = (struct BS_Structure *)buffer;
}
// загрузить информацию о диске
var1 = buffer[13]; // для тестирования прочитать 13-й байт (=1)
// var1 = bpb->sectorPerCluster; // для тестирования прочитать
bytesPerSector = bpb->bytesPerSector;
sectorPerCluster = bpb->sectorPerCluster;
reservedSectorCount = bpb->reservedSectorCount;
..............................................................................
bpb = (struct BS_Structure *)buffer;
}
// загрузить информацию о диске
var1 = buffer[13]; // для тестирования прочитать 13-й байт (=1)
// var1 = bpb->sectorPerCluster; // для тестирования прочитать
bytesPerSector = bpb->bytesPerSector;
sectorPerCluster = bpb->sectorPerCluster;
reservedSectorCount = bpb->reservedSectorCount;
..............................................................................
структура описана так:
Код
//Структура для доступа к данным BootSector
struct BS_Structure{
unsigned char jumpBoot[3]; //Ассемблерная команда перехода к загрузочному коду default: 0x009000EB
unsigned char OEMName[8]; //Имя OEM в кодировке ASCII
unsigned short bytesPerSector; //Количество байтов в секторе. deafault: 512
unsigned char sectorPerCluster; //Количество секторов в кластере
unsigned short reservedSectorCount; //Размер зарезервированной области в секторах
unsigned char numberofFATs; //Количество копий FAT. Обычно в системе хранятся две копии
unsigned short rootEntryCount; //Максимальное количество файлов в корневом каталоге
unsigned short totalSectors_F16; //16-разрядное количество секторов в файловой системе. Если количество секторов не может быть представлено 2-байтовой величиной, позднее в структуре данных следует альтернативное 4-байтовое поле (а 2-байтовое поле должно быть равно нулю)must be 0 for FAT32
unsigned char mediaType; //Тип носителя. Согласно документации Microsoft, для стационарных дисков используется значение 0xf8, а для съемных - 0xf0
unsigned short FATsize_F16; //16-разрядный размер (в секторах) каждой копии FAT в FAT12 и FAT16. В FAT32 поле равно 0must be 0 for FAT32
unsigned short sectorsPerTrack; //Количество секторов в дорожке
unsigned short numberofHeads; //Количество головок
unsigned long hiddenSectors; //Количество секторов перед началом раздела
unsigned long totalSectors_F32; //32-разрядное количество секторов в файловой системе. Либо это поле, либо 16-разрядное поле (19-20) должно быть равно 0
unsigned long FATsize_F32; //32-разрядный размер одной копии FAT (в секторах)
unsigned short extFlags; //Режим обновления нескольких структур FAT. Если бит 7 равен 1, активна только одна копия FAT, индекс которой определяется разрядами 0-3. В противном случае все структуры FAT являются зеркальными копиями друг друга
unsigned short FSversion; //Основной и дополнительный номер версии 0x0000 (defines version 0.0)
unsigned long rootCluster; //Кластер, в котором находится корневой каталог (=2)
unsigned short FSinfo; //Сектор, в котором находится структура FSINFO (=1)
unsigned short BackupBootSector; //Сектор, в котором находится резервная копия загрузочного сектора (по умолчанию 6)
unsigned char reserved[12]; //Зарезервировано
unsigned char driveNumber; //Номер диска BIOS INT13h
unsigned char reserved1; //Не используется
unsigned char bootSignature; //Расширенная сигнатура, которая показывает, действительны ли следующие три значения. Сигнатура равна 0x29
unsigned long volumeID; //Серийный номер тома; в некоторых версиях Windows вычисляется на основании даты и времени создания
unsigned char volumeLabel[11]; //Метка тома в кодировке ASCII. Выбирается пользователем при создании файловой системы "NO NAME "
unsigned char fileSystemType[8]; //Метка типа файловой системы в кодировке ASCII "FAT32"
unsigned char bootData[420]; //Не используется
unsigned short bootEndSignature; //Сигнатура (0xAA55)
};
struct BS_Structure{
unsigned char jumpBoot[3]; //Ассемблерная команда перехода к загрузочному коду default: 0x009000EB
unsigned char OEMName[8]; //Имя OEM в кодировке ASCII
unsigned short bytesPerSector; //Количество байтов в секторе. deafault: 512
unsigned char sectorPerCluster; //Количество секторов в кластере
unsigned short reservedSectorCount; //Размер зарезервированной области в секторах
unsigned char numberofFATs; //Количество копий FAT. Обычно в системе хранятся две копии
unsigned short rootEntryCount; //Максимальное количество файлов в корневом каталоге
unsigned short totalSectors_F16; //16-разрядное количество секторов в файловой системе. Если количество секторов не может быть представлено 2-байтовой величиной, позднее в структуре данных следует альтернативное 4-байтовое поле (а 2-байтовое поле должно быть равно нулю)must be 0 for FAT32
unsigned char mediaType; //Тип носителя. Согласно документации Microsoft, для стационарных дисков используется значение 0xf8, а для съемных - 0xf0
unsigned short FATsize_F16; //16-разрядный размер (в секторах) каждой копии FAT в FAT12 и FAT16. В FAT32 поле равно 0must be 0 for FAT32
unsigned short sectorsPerTrack; //Количество секторов в дорожке
unsigned short numberofHeads; //Количество головок
unsigned long hiddenSectors; //Количество секторов перед началом раздела
unsigned long totalSectors_F32; //32-разрядное количество секторов в файловой системе. Либо это поле, либо 16-разрядное поле (19-20) должно быть равно 0
unsigned long FATsize_F32; //32-разрядный размер одной копии FAT (в секторах)
unsigned short extFlags; //Режим обновления нескольких структур FAT. Если бит 7 равен 1, активна только одна копия FAT, индекс которой определяется разрядами 0-3. В противном случае все структуры FAT являются зеркальными копиями друг друга
unsigned short FSversion; //Основной и дополнительный номер версии 0x0000 (defines version 0.0)
unsigned long rootCluster; //Кластер, в котором находится корневой каталог (=2)
unsigned short FSinfo; //Сектор, в котором находится структура FSINFO (=1)
unsigned short BackupBootSector; //Сектор, в котором находится резервная копия загрузочного сектора (по умолчанию 6)
unsigned char reserved[12]; //Зарезервировано
unsigned char driveNumber; //Номер диска BIOS INT13h
unsigned char reserved1; //Не используется
unsigned char bootSignature; //Расширенная сигнатура, которая показывает, действительны ли следующие три значения. Сигнатура равна 0x29
unsigned long volumeID; //Серийный номер тома; в некоторых версиях Windows вычисляется на основании даты и времени создания
unsigned char volumeLabel[11]; //Метка тома в кодировке ASCII. Выбирается пользователем при создании файловой системы "NO NAME "
unsigned char fileSystemType[8]; //Метка типа файловой системы в кодировке ASCII "FAT32"
unsigned char bootData[420]; //Не используется
unsigned short bootEndSignature; //Сигнатура (0xAA55)
};
Так вот, когда читаю buffer[13], то там 1, как и должно быть. А при попытке через структуру (bpb->sectorPerCluster), то получаю 194=0xc2.
Байт 0xc2 присутствует в секторе, но это buffer[14]. Т.е. как-то происходит смещение. Не могу понять как.....
Может быть получается какое-то выравнивание в структуре... типа по границе слова...
И ещё тест: при попытке прочитать так (bpb->sectorsPerTrack), реально считывается (bpb->hiddenSectors), которое находится дальше на 4 байта.
В структуре до этой позиции имеется 4 поля типа short, которые оказываются невыровнены. Так что похоже на результат выравнивания.
Как указать, чтобы выравнивания не было?
Компилятор Keil uVision 5.15.
Спасибо.