Цитата(Liseev @ Sep 25 2008, 16:50)

1. Вычисляем очередной кластер (если надо), выискиваем в нем сектор, который пойдет первым в блоке.
2. Инициализируем процесс чтения из CF: устанавливаем адрес сектора, количество читаемых секторов (4), даем команду старт.
3. Ждем готовность карты.
4. Забираем данные. 1024 цикла по 2 байта.
5. Идем к пункту 1.
При начальной инициализации в IdeInfo блоке смотрю на размер буфера карточки.
Выполняю п.1, если данные последовательны (дефрагментация на больших файлах записанных подряд как правило небольшая) считываю кол-во секторов (находящихся на одном треке) по максимуму заполняющих буфер - это позволит ускорить п.2 и п.3 сумарно.
Скорректировав на размер буфера, вычислим номер следующего кластера и т.д.
Если нужно потреблять блоками по 2кБ и не хочется хранить всю цепочку FAT можно завести счётчик блоков имеющихся в буфере карточки и выбирать их из него пока буфер не исчерпается.
Лично я запоминал в памяти микроконтроллера номера стартового и последнего кластера файла,
после чтения/использования порции файла номер стартового кластера менял на следующий кластер блока, если достигли номера последнего кластера, то всё чтение окончено.
п.4 можно ускорить только используя DMA вместо PIO, из всего разнообразия карточек используемых мной не встретилась ни одна у которой не было-бы этого режима.