Всем заглянувшим доброго времени суток...
Итак, есть задача: на МК AT90USB162 и микросхеме памяти AT45DB161E сделать "флешку" объёмом 2 МБ (в дальнейшем там будет храниться конфигурационный файл для некоторого устройства).
На данный момент я сумел скрестить между собой библиотеку USB от Atmel (по аппноуту AVR276), часть реализации класса MassStorage и обмена с AT45DB161 из библиотеки LUFA, а также написал обработку команд SCSI по мотивам этой статьи:
http://we.easyelectronics.ru/AVR/usb-fl ... ystvu.html.
Сразу скажу, чтобы не было разнообразных вопросов: да, я знаю, что в комплекте с LUFA идёт пример реализации MassStorage Class. Но этот код занимает почти 85% памяти AT90USB162, поэтому его я использовать не могу.
Моя "флешка" успешно определяется компьютером (Win XP, Win 7) как "Запоминающее устройство для USB", появляется "Съёмный диск". В его свойствах указан объём 0 байт и файловая система RAW. При попытке открыть его выдаётся сообщение с предложением отформатировать диск (что, впрочем, вполне естественно).
А вот при попытке отформатировать творится что-то странное. Форматирование, вроде как, происходит (и даже отображается правильный объём 2 МБ), в некоторые логические блоки памяти производится запись данных. Повторное чтение записанного также проходит без ошибок. Но в конце выдаётся сообщение, что форматирование не удалось.
В логах обмена по USB никаких проблем я не обнаружил, что приходит с компьютера - то и пишется в память. Но вот приходит какая-то фигня. В нулевом секторе (где, как я понимаю, должна быть MBR) оказывается какой-то мусор, похожий на кусок реестра:
Спойлер
Код:
00000000 88 03 08 00 88 03 08 00 65 00 6D 00 5C 00 43 00 ........e.m.\.C.
00000010 75 00 72 00 72 00 65 00 6E 00 74 00 43 00 6F 00 u.r.r.e.n.t.C.o.
00000020 6E 00 74 00 72 00 6F 00 6C 00 53 00 65 00 74 00 n.t.r.o.l.S.e.t.
00000030 5C 00 43 00 6F 00 6E 00 74 00 72 00 6F 00 6C 00 \.C.o.n.t.r.o.l.
00000040 5C 00 44 00 65 00 76 00 69 00 63 00 65 00 43 00 \.D.e.v.i.c.e.C.
00000050 6C 00 61 00 73 00 73 00 65 00 73 00 5C 00 7B 00 l.a.s.s.e.s.\.{.
00000060 35 00 33 00 46 00 35 00 36 00 33 00 30 00 44 00 5.3.F.5.6.3.0.D.
00000070 2D 00 42 00 36 00 42 00 46 00 2D 00 31 00 31 00 -.B.6.B.F.-.1.1.
00000080 44 00 30 00 2D 00 39 00 34 00 46 00 32 00 2D 00 D.0.-.9.4.F.2.-.
00000090 30 00 30 00 41 00 30 00 43 00 39 00 31 00 45 00 0.0.A.0.C.9.1.E.
000000A0 46 00 42 00 38 00 42 00 7D 00 00 00 30 00 42 00 F.B.8.B.}...0.B.
000000B0 39 00 45 00 43 00 31 00 7D 00 00 00 5C 00 44 00 9.E.C.1.}...\.D.
000000C0 65 00 76 00 69 00 63 00 65 00 5C 00 7B 00 31 00 e.v.i.c.e.\.{.1.
000000D0 30 00 45 00 45 00 37 00 35 00 46 00 43 00 2D 00 0.E.E.7.5.F.C.-.
000000E0 38 00 35 00 45 00 41 00 2D 00 34 00 46 00 30 00 8.5.E.A.-.4.F.0.
000000F0 39 00 2D 00 38 00 30 00 30 00 41 00 2D 00 46 00 9.-.8.0.0.A.-.F.
00000100 30 00 36 00 44 00 39 00 31 00 34 00 46 00 41 00 0.6.D.9.1.4.F.A.
00000110 38 00 42 00 32 00 7D 00 00 00 5C 00 44 00 65 00 8.B.2.}...\.D.e.
00000120 76 00 69 00 63 00 65 00 5C 00 7B 00 46 00 45 00 v.i.c.e.\.{.F.E.
00000130 45 00 36 00 32 00 46 00 32 00 35 00 2D 00 42 00 E.6.2.F.2.5.-.B.
00000140 44 00 41 00 37 00 2D 00 34 00 46 00 43 00 30 00 D.A.7.-.4.F.C.0.
00000150 2D 00 42 00 31 00 30 00 45 00 2D 00 35 00 43 00 -.B.1.0.E.-.5.C.
00000160 43 00 35 00 42 00 34 00 46 00 35 00 36 00 43 00 C.5.B.4.F.5.6.C.
00000170 38 00 38 00 7D 00 00 00 5C 00 44 00 65 00 76 00 8.8.}...\.D.e.v.
00000180 69 00 63 00 65 00 5C 00 7B 00 32 00 42 00 43 00 i.c.e.\.{.2.B.C.
00000190 35 00 34 00 33 00 39 00 39 00 2D 00 34 00 45 00 5.4.3.9.9.-.4.E.
000001A0 46 00 45 00 2D 00 34 00 35 00 34 00 37 00 2D 00 F.E.-.4.5.4.7.-.
000001B0 38 00 39 00 45 00 34 00 2D 00 33 00 35 00 32 00 8.9.E.4.-.3.5.2.
000001C0 30 00 35 00 46 00 33 00 32 00 41 00 45 00 43 00 0.5.F.3.2.A.E.C.
000001D0 46 00 7D 00 00 00 5C 00 44 00 65 00 76 00 69 00 F.}...\.D.e.v.i.
000001E0 63 00 65 00 5C 00 4E 00 64 00 69 00 73 00 57 00 c.e.\.N.d.i.s.W.
000001F0 61 00 6E 00 49 00 70 00 00 00 00 00 00 00 00 00 a.n.I.p.........
Впрочем, иногда там такого не наблюдается, но тогда там какой-то другой мусор. Создаётся впечатление, что туда попадает произвольный кусок из оперативной памяти.
В другие секторы тоже пишется какая-то ерунда. Только в последний, 4095-й, попадает пачка из 512 нулей.
В общем, я в замешательстве. Моё устройство честно выполняет все команды, которые на него приходят с ПК, но вот сами команды... Они точно флешку не отформатируют.
Ровно такое же поведение и на двух других компьютерах, и под Win XP, и под Win 7.
Вот логи обмена по USB при энумерации и при попытке отформатировать:
https://yadi.sk/d/qwDWmBuFNGG-iQhttps://yadi.sk/d/Hv61NH5fzKFPSAБуду очень признателен, если кто-нибудь сможет помочь разобраться, в чём дело...
