Адаптировал EFSL версии 0.3.4 на ATMega32L на STK-500 под SD. Отладочные строки убрал во flash, все файловые переменные - глобальные, размер стека - 0х180, потребление памяти 1 879 bytes of DATA memory, размер кода несущественен - во flash укладывается. Examplы - копирование файла, вывод содержимого файла в UART проходят без проблем. Усложнил main - добавил командный процессор - и стал выводить содержимое файлов один за другим. И тут возникли зависания. Отладчика нет. Обложил печатью, и выяснил, что зависания происходят в функции посылки команды - sd_Command. Посмотрел исходники FlashFile v2.10 от Progressive Resources LLC, подправил sd_Command() и sd_readSector() на манер, как это сделано у prllc. Результат тот же, - несколько раз файл считывается и выводится, затем, при чтении сектора того же файла зависает в sd_Command(). На печать вывожу так же #сектора при вызове sd_readSector() - сектора все те же, что и читались успешно. Очевидно зависание в while(!(SPSR & (1<<SPIF))); У Трамперта в "AVR-RISC микроконтроллерах" сказано, что в режиме "мастер" текущая передача может быть прервана подачей 1 в линию SS. Счетчик разрядов и внутрення логика Slave сбрасываются. Оператор while(!(SPSR & (1<<SPIF))) в sd_Command() я добавил флагом, который взводится таймером через некоторое время после посылки команды так, чтобы исключить зависания. Если флаг взведен, поднимаю линию SS. Однако SD попав в это состояние больше не воспринимает команды - зависание исключено, но и секторы карты больше не читаются. Теперь подумываю о прерывании питания на карту и ее повторной инициализации в случае продолжительного ожидания в SPI. F osc = 3.68, F spi пробовал /2, /4 и /8 - безразлично. Никто не испытывал подобных проблем? Что посоветуете?
|