На одной шине SPI LPC2214 сидят microSD и AT45DB161D. Выбор, с кем работать процу идёт через CS.
Есть тестовый алгоритм:
1. После вкл. питания инициализируется проц и периферия, выставляется CS на microSD (не нужна в работе)
2. Начинается запись файла ~80КБ в AT45 командой "Buffer 1 to Main Memory Page Program with Built-in Erase" - 83H
3. По окончании записи считывается содержимое записанной страницы и проверяется с тем, что отдавали на запись. Команда чтения: "Continuous Array Read (Low Frequency)" - 03H
Замечено, что при установке microSD Kingston 2GB в ~10% страниц запись прошла неудачно (даже при повторной попытке записи в те же страницы требуемых данных): в считанных данных, например, байт 0x0A превратился в 0x1A, на странице из 512Байт повреждено 1-2 байта. Если microSD извлечь, то запись/проверка проходят успешно. Если установить флэшки Samsung, Transcend, Toshiba, то сбойных записей или нет вообще, или из 156 страниц не будет записана с первой попытки только одна. Почему так происходит? По стандарту после подачи питания SD должна находиться в состоянии Idle:
Цитата
After power up (including hot insertion, i.e. inserting a card when the bus is operating) the SD Card enters the idle state
Если во время записи вставлять/вынимать флэхи Samsung, Transcend, Toshiba, то это не вызывает сбоев. Если Kingston, то валятся страницы с ошибками. В чём может быть дело?
Код взаимодействия с AT45 полностью рабочий, неоднократно использовался в других проектах. Частота клока ~7.37МГц. Неиспользуемые выводы microSD DAT1 и DAT2 подтянуты к +3,3В через 51К. Все остальные сигнальные тоже. Питание чистое.
Да, если ранее записанный в AT45 файл попытаться считать при вставленной Kingston, то файл считывается корректно, CRC на страницах правильное.