coolzero
Oct 24 2007, 06:16
Добрый день , уважаемые форумчане
Помогите начинающему работать с USB.
Щупаю пример от Атмеля at91_demo_massstorage_fs
Возникло несколько вопросов по работе модуля USB:
1.При запуске проги , но не подключённом у-ве к хосту вижу что постоянно влетаю в прерывание
по флагу ENDBUSRES, которое вообще должно возникать при подключениие к хосту .
Флаг этот должен сбрасываться следующим кодом
AT91F_UDP_DisableIt( USBDEV_BASE_UDP, DISABLE_ALL_IT );
AT91F_UDP_InterruptClearRegister( USBDEV_BASE_UDP, CLEAR_ALL_IT );
AT91F_UDP_EnableIt( USBDEV_BASE_UDP, AT91C_UDP_EPINT0| AT91C_UDP_RXSUSP
| AT91C_UDP_RXRSM | AT91C_UDP_EXTRSM
| AT91C_UDP_SOFINT );
но почему то код не работает , флаг ENDBUSRES остаётся взведённым .
И вообще состояние регистров не меняется и в итоге прога постоянно крутится в прерывании.
2. Первоначально маска прерываний конфигурится в состояние по умолчанию - прерывание только по
флагу RXRSM .
При нормальной работе модуля , при подключении к хосту по этому флагу возникает прерывание ,
такой же вышепреведённый код отрабатывает нормально , начинается процесс нумерации.
А иногда бывает что у-во подключено , а никакой реакции на компе нет , прерывания только по ENDBUSRES , по RXRSM прерывания нет , у-во на компе не видно .
aaarrr
Oct 24 2007, 07:14
1. Скорее всего, флаг сбрасывается нормально, а Ваше устройство просто постоянно ловит BUSRES, пока не подключено к шине.
1-2. Как организовано подключение pull-up на D+?
coolzero
Oct 24 2007, 08:04
Цитата(aaarrr @ Oct 24 2007, 11:14)

1. Скорее всего, флаг сбрасывается нормально, а Ваше устройство просто постоянно ловит BUSRES, пока не подключено к шине.
1-2. Как организовано подключение pull-up на D+?
Подключение pull-up организовано через полевой транзистор типа IRLML5203.
Тут есть некоторые сомнения - резюк 1.5 кОм подтягивает линию к уровню примерно 5.1 В при подключённом к хосту девайсе ( берётся от питания шины ).
По докам надо вообще к 3.3 если я правильно понял.
Разаработчик платы уверяет что это нормально , работать должон...
Это принципиально ?
Насчёт сброса флага - всё может быть конечно , но эти команды выполняются в обработчике прерывания по соответствуюшему вектору , мне кажется вряд ли между 3 командами между 2 точками останова , я как то успеваю попасть в это же прерывание , и никак не заметить это по точкам остонова ? . Или я не прав ?
aaarrr
Oct 24 2007, 08:27
Цитата(coolzero @ Oct 24 2007, 12:04)

По докам надо вообще к 3.3 если я правильно понял.
Разаработчик платы уверяет что это нормально , работать должон...
Это принципиально ?
Это не нормально, нужно исправить.
Цитата(coolzero @ Oct 24 2007, 12:04)

Насчёт сброса флага - всё может быть конечно , но эти команды выполняются в обработчике прерывания по соответствуюшему вектору , мне кажется вряд ли между 3 командами между 2 точками останова , я как то успеваю попасть в это же прерывание , и никак не заметить это по точкам остонова ? . Или я не прав ?
Я не совсем понимаю, что именно Вы наблюдаете в прерывании. Между двумя точками останова можно сотню раз успеть поставить флаг. С JTAG'ом в прерываниях нужно быть осторожнее.
coolzero
Oct 24 2007, 09:00
[quote name='aaarrr' date='Oct 24 2007, 12:27' post='312649']
Это не нормально, нужно исправить.
[/quote]
Подтяжку буду исправлять...
Я не совсем понимаю, что именно Вы наблюдаете в прерывании. Между двумя точками останова можно сотню раз успеть поставить флаг. С JTAG'ом в прерываниях нужно быть осторожнее.
[/quote]
Насчёт флага - да конечно полностью согласен , он может выставляться.
Мне не совсем понятно почему после выполнения кода
AT91F_UDP_EnableIt( USBDEV_BASE_UDP, AT91C_UDP_EPINT0| AT91C_UDP_RXSUSP
| AT91C_UDP_RXRSM | AT91C_UDP_EXTRSM
| AT91C_UDP_SOFINT );
я не вижу никаких изменений в регистре маски прерываний UDP_ IMR?
Та же самая команда , но в обработеке флага RXRSM, ведёт себя корректно , и модифицирует
регистр UDP_ IMR.
Попробую разобраться с подтяжкой , может что то прояснится ...
aaarrr
Oct 24 2007, 09:10
Цитата(coolzero @ Oct 24 2007, 13:00)

Мне не совсем понятно почему после выполнения кода
...
я не вижу никаких изменений в регистре маски прерываний UDP_ IMR?
RESET активен, вот и нет изменений.
Kitsok
Oct 24 2007, 09:11
У меня подтяжка сделана как в Olimex SAM7-P256, все работает.
При отключенном кабеле действительно все время ловится ENDBUSRES, но я особенных проблем с этим не вижу.
Чем они мешают?
Цитата(coolzero @ Oct 24 2007, 10:16)

Щупаю пример от Атмеля at91_demo_massstorage_fs
При запуске проги , но не подключённом у-ве к хосту вижу что постоянно влетаю в прерывание
Что то не понятно, вы хост к хосту подключаете?
aaarrr
Oct 24 2007, 09:37
Цитата(KAlex @ Oct 24 2007, 13:23)

Что то не понятно, вы хост к хосту подключаете?
Где Вы, простите, это увидели?
ljerry
Oct 24 2007, 09:51
Цитата(coolzero @ Oct 24 2007, 10:16)

1.При запуске проги , но не подключённом у-ве к хосту вижу что постоянно влетаю в прерывание
по флагу ENDBUSRES, которое вообще должно возникать при подключениие к хосту .
Если есть цепь мониторинга VBUS, то при отсутствии оного можно блокировать прерывание от UDP непосредственно в AIC, а после обнаружения подключения - снова разрешать. До кучи можно еще и тактовые сигналы модуля UDP отключать, чтобы проц кушал меньше (какие тактовые сигналы в какой момент должны присутствовать - сказано в главе 34.5.3 мануала)
Успехов!
_4afc_
Oct 24 2007, 10:01
Цитата(coolzero @ Oct 24 2007, 10:16)

Щупаю пример от Атмеля at91_demo_massstorage_fs
Возникло несколько вопросов по работе модуля USB:
А иногда бывает что у-во подключено , а никакой реакции на компе нет , прерывания только по ENDBUSRES , по RXRSM прерывания нет , у-во на компе не видно .
У меня сей исходник работает только в ARM режиме, в THUMB соединяется только с двумя из пяти доступных машин.
Попробуйте с несколькими компьютерами.
Попробуйте подавать частоту на usb модуль сразу при старте.
Выберете частоту как 18.432/14*73.
Если у вас быстрая инициализация USB, то 1.5кОм можно повесить жёстко на 3.3В без транзистора.
Убрать ramfunc - всё равно не даёт выигрыша, но может стек налезать на функции.
Вообще рекомендую взять любой из своих рабочих проектов с работоспособным линковщиком и стартапом. И перенести туда .C и .H файлы at91_demo_massstorage_fs.
Я ещё выкинул все малоки и сделал статическую память. Прекрасно живёт на sam7s64 с двойным буфером обмена в 4кБ. (скорость 2мбита)
Выкиньте из обработчика прерывания управление энергопотреблением!!! - А то как вы будете отлаживаться?
coolzero
Oct 24 2007, 11:05
Изменил подтяжку вместо питания USB на 3.3 В , флаг ENDBURSES больше не вылезает .
Может быть из-за этого и девайс иногда некорректно определялся USB.
to Kitsok :
программка пока отладочная , кроме как обработки USB ничего не делает ,
мне кажется что в рабочей программе постоянные прерывания обработчика ENDBURSES могут реально тормозить всё остальное ( т.к флаг не сбрасывался - обработка прерывания велась практически непрерывно - я правильно мыслю ? )
Скажу даже больше , теперь мне удалось скопировать корректно пару файлов в DataFlash на плате...
Цитата(_4afc_ @ Oct 24 2007, 14:01)

Вообще рекомендую взять любой из своих рабочих проектов с работоспособным линковщиком и стартапом. И перенести туда .C и .H файлы at91_demo_massstorage_fs.
Я ещё выкинул все малоки и сделал статическую память. Прекрасно живёт на sam7s64 с двойным буфером обмена в 4кБ. (скорость 2мбита)
В принципе так и сделал , взял проект и добавил туда Mass Storage и File System .
Насчёт малоков была такая мысль , я так понимаю что памяти выделяется под размер конечной точки ,
т.е. 64 байта , примерно такой буффер и надо задать ?
ramfunc - убраны , т.к память внешняя - AT45 , я подумал что мне оно нафиг не нужно.
Насчёт "Выкиньте из обработчика прерывания управление энергопотреблением",
не совсем понял - не расшифруете , как оно мне может помешать ?
и вот вопрос я уже задал про косяк файловой системы - почему то затирается метка тома ( задается ATMEL при форматировании) и всё записи дальше на 380 байт пишутся?
Погрнял немного девайс , получается следующее :
был не прав , винда видит файлы ( хотя почему она переписала начало каталога по своему - не пойму )
Но при копировании файлов больше 3-4 кбайт - зависаем
Цитата(_4afc_ @ Oct 24 2007, 14:01)

У меня сей исходник работает только в ARM режиме, в THUMB соединяется только с двумя из пяти доступных машин.
Попробуйте с несколькими компьютерами.
Попробуйте подавать частоту на usb модуль сразу при старте.
Выберете частоту как 18.432/14*73.
Если у вас быстрая инициализация USB, то 1.5кОм можно повесить жёстко на 3.3В без транзистора.
Убрать ramfunc - всё равно не даёт выигрыша, но может стек налезать на функции.
Вообще рекомендую взять любой из своих рабочих проектов с работоспособным линковщиком и стартапом. И перенести туда .C и .H файлы at91_demo_massstorage_fs.
Я ещё выкинул все малоки и сделал статическую память. Прекрасно живёт на sam7s64 с двойным буфером обмена в 4кБ. (скорость 2мбита)
Выкиньте из обработчика прерывания управление энергопотреблением!!! - А то как вы будете отлаживаться?
Вопрос к вам уважаемый _4afc_:
а зачем при обработке флага RXRSM заново конфигурятся клоки всего проца ?
Начал тестировать , вылезли грабли , файлы копируются через раз, иногда глобально зависаю
_4afc_
Oct 24 2007, 11:10
Цитата(coolzero @ Oct 24 2007, 14:47)

В принципе так и сделал , взял проект и добавил туда Mass Storage и File System .
Насчёт малоков была такая мысль , я так понимаю что памяти выделяется под размер конечной точки ,
т.е. 64 байта , примерно такой буффер и надо задать ?
там несколько малоков внутри нескольких функций. Иногда размер точки, иногда фифо.
Цитата(coolzero @ Oct 24 2007, 14:47)

Насчёт "Выкиньте из обработчика прерывания управление энергопотреблением",
не совсем понял - не расшифруете , как оно мне может помешать ?
Например сом порт продолжит работать. (я просто JTAG не использовал никогда)
Цитата(coolzero @ Oct 24 2007, 14:47)

и вот вопрос я уже задал про косяк файловой системы - почему то затирается метка тома ( задается ATMEL при форматировании) и всё записи дальше на 380 байт пишутся?
Погрнял немного девайс , получается следующее :
был не прав , винда видит файлы ( хотя почему она переписала начало каталога по своему - не пойму )
Но при копировании файлов больше 3-4 кбайт - зависаем
У вас ошибка в файловой системе скорее всего (в программе). Выкиньте её совсем. Для доступа к флэш с компьютера она не нужна. Достаточно чтения и запись сектора по номеру (ReadMedia/flashwriteAdress). - Сможете отформатировать устройство и работать.
Я использовал другую файловую систему.
Цитата(coolzero)

а зачем при обработке флага RXRSM заново конфигурятся клоки всего проца ?
Я так понял что там в зависимости от приходящей от хоста команды вы переходите в режим малого энерго потребления и затем обратно в полное. Я это убрал. А в usb100h поставил USB_CONFIG = 0x60
ну и поставьте себе мА правильные (хоть 98)
coolzero
Oct 24 2007, 11:10
А чем мне может помешать управление энергопотреблением ?
Не совсем понял , расшифруйте пожалтста...
_4afc_
Oct 24 2007, 11:23
Цитата(coolzero @ Oct 24 2007, 15:10)

А чем мне может помешать управление энергопотреблением ?
Не совсем понял , расшифруйте пожалтста...
А зачем им управлять? Кроме того там могут стоять другие клоки по сравнению с вашими.
Зачем зря кварц и Pll дёргать. Достаточно для протокола отрубить\врубить usb:
Код
// *****************************************
// * (UDP) USB Resume Interrupt or WAKE_UP *
// *****************************************
if( (_IT_reg_b1 & AT91C_UDP_RXRSM) ||(_IT_reg_b1 & AT91C_UDP_WAKEUP))
{
AT91F_PMC_CfgSysClkEnableReg( AT91C_BASE_PMC, AT91C_PMC_PCK );
USB_EVENT |= USB_EVENT_MASK_RESUME;
AT91F_UDP_DisableIt( USBDEV_BASE_UDP, DISABLE_ALL_IT );
AT91F_UDP_InterruptClearRegister( USBDEV_BASE_UDP, CLEAR_ALL_IT );
AT91F_UDP_EnableIt( USBDEV_BASE_UDP, AT91C_UDP_EPINT0 | AT91C_UDP_EPINT1
| AT91C_UDP_EPINT2 | AT91C_UDP_RXSUSP
| AT91C_UDP_RXRSM | AT91C_UDP_EXTRSM
| AT91C_UDP_SOFINT | AT91C_UDP_WAKEUP );
AT91F_PMC_CfgSysClkEnableReg( AT91C_BASE_PMC, AT91C_PMC_UDP );
AT91F_PMC_EnablePeriphClock( AT91C_BASE_PMC, (1 << AT91C_ID_UDP) );
AT91F_UDP_EnableTransceiver(USBDEV_BASE_UDP);
}
coolzero
Oct 24 2007, 11:44
М-да что то не получается
Из проводника диск форматируется , но при записи файла подвисает , причём потом из проводника диск виден , а например из-под тотал командера нет , т.е получается что при записи файла корёжится файловая система, но как то хитро
Не совсем понял USB_CONFIG = 0x60 - это что ?
Цитата(_4afc_ @ Oct 24 2007, 15:23)

А зачем им управлять? Кроме того там могут стоять другие клоки по сравнению с вашими.
Зачем зря кварц и Pll дёргать. Достаточно для протокола отрубить\врубить usb:
А тут мы в сами друг друга не поняли: я тоже имел ввиду что , не стоит
по 2 раза конфигурить проц , соответственно и из обработки флага RXSUSP надо бы енто удалить ,
там частота ядра снижается , видимо для уменьшения потребления ?
_4afc_
Oct 24 2007, 11:45
Цитата(coolzero @ Oct 24 2007, 15:29)

Не совсем понял USB_CONFIG = 0x60 - это что ?
Я имел ввиду нижеследующее, но вы скорее всего этот этап уже проскочили
Вариант для устроиства с собственным питанием:
Код
FW_FULL_CONFIG_DESCRIPTOR fw_config =
{
{ // Standard Configuration Descriptor
sizeof(USB_CONFIGURATION_DESCRIPTOR), // Size of this descriptor in bytes
USB_CONFIGURATION_DESCRIPTOR_TYPE, // CONFIGURATION Descriptor Type
sizeof(FW_FULL_CONFIG_DESCRIPTOR), // Total length of data returned for this configuration.
1, // Number of interfaces supported by this configuration
1, // Value to use as an argument to the SetConfiguration() request to select this configuration
0, // Index of string descriptor describing this configuration
0x60,//USB_CONFIG_SELF_NOWAKEUP,//Must be 0x60 //USB_CONFIG_BUS_NOWAKEUP, // attribute : Bus-powered, no wakeup
0x01 // Maximum power consumption (in 2mA unit, so 0x01 =1= 2mA)
},
Цитата(coolzero @ Oct 24 2007, 15:29)

М-да что то не получается
Из проводника диск форматируется , но при записи файла подвисает , причём потом из проводника диск виден , а например из-под тотал командера нет , т.е получается что при записи файла корёжится файловая система, но как то хитро
Разбиритесь со своей реализацией FAT или уберите её совсем для отсечения ошибок.
Windows критична ко времени выполнения ReadMedia/flashwriteAdress - не ставьте там задержек.
Вообще похоже весь протокол выполняется в прерывании.
Цитата(coolzero @ Oct 24 2007, 15:29)

там частота ядра снижается , видимо для уменьшения потребления ?
Да, причём мне кажется сие нужно делать только если где-то будет сказано, что у вас есть такой режим - малого потребления.
coolzero
Oct 24 2007, 12:02
вот оно что , я то думаю где собака порылась
насчёт 0х60 я так и подумал , только вот в исходниках
значение USB_CONFIG_SELF_NOWAKEUP = 0хС0 ...
у меня с такими параметром винда и у-во не могла определить ...
Насчёт того что Windows критична ко времени - это не есть гуд
Так как я пишу по SPI во внешнюю флеш , то хадержки могут быть там
Придётся попробовать увеличить скорость ( сейчас MCK\4) или
использовать DMA... мне так кажется
_4afc_
Oct 24 2007, 12:26
Цитата(coolzero @ Oct 24 2007, 16:02)

вот оно что , я то думаю где собака порылась
насчёт 0х60 я так и подумал , только вот в исходниках
значение USB_CONFIG_SELF_NOWAKEUP = 0хС0 ...
я уже не помню почему выбрал именно 0х60, но их цифры меня навели на мысль, что они биты путают.
Цитата(coolzero @ Oct 24 2007, 16:02)

у меня с такими параметром винда и у-во не могла определить ...
Насчёт того что Windows критична ко времени - это не есть гуд
Так как я пишу по SPI во внешнюю флеш , то хадержки могут быть там
Я на 50мс задерживал - скорость заполнения внутреннего буфера - ничего.
Но если на секунды - то вроде отваливался.
Кстати - поставьте свой PID/VID - тоже полегче будет жить.
Цитата(coolzero @ Oct 24 2007, 16:02)

Придётся попробовать увеличить скорость ( сейчас MCK\4) или
использовать DMA... мне так кажется
в дма - придётся cs самому дёргать
coolzero
Oct 24 2007, 12:40
А если я поменяю PID\VID - у меня проблем с драйверами не будет ?
Я думал что они как раз по ним дрова цепляют , потому что у меня было 2 примера - CDC модем и эмулятор сом-порта , разница у них была в последнем бите PID , но при этом каждый цеплял свой драйвер ...
Если речь идёт о секундах тада засада : копирую файлы по 3 кило - нормально , порядка 60 - завис .
и от файловой системы мне не уйти , записанные файлы я должен буду потом найти и использовать уже по другому назаначению ( не по USB ) , а как их использовать если файловая структура не понятно какая.. ?
Dron_Gus
Oct 24 2007, 12:43
У меня sam7x нормально работает с AT45 и ("на глаз") с еще более тормозной mmc карточкой на ура. Задержки винду не смущают.
coolzero
Oct 24 2007, 13:04
Значит надо рыть в другую сторону , возможно действительно уйти от динамического распределения памяти в сторону статических буфферов.
Dron_Gus
Oct 24 2007, 13:34
Вы не забываете блокировать доступ "из" Вашего МК, когда он подключен по УСБ? Т.е. софт не должен писать во флешку, когда с ней работает винда.
coolzero
Oct 25 2007, 05:15
Да вроде нет - програмка пока отладочная , кроме usb нет ничего ,
только обработка прерываний по usb , да бесконечный цикл по опросу состояния флагов ( приём , передача , event ) .
Маленькие файлы копируются вроде нормально ( ~1-3 кБ) ,
побольше похоже не всегда дописываются до конца
Calculator
Oct 25 2007, 07:54
Цитата(coolzero @ Oct 25 2007, 11:15)

Маленькие файлы копируются вроде нормально ( ~1-3 кБ) ,
побольше похоже не всегда дописываются до конца
Возможно проблемы и не в программе. У нас иногда с серийными устройствами бывают "проблемы" при проверки работы USB, потом оказывается, что очередной раз купили плохие кабели. Обычно если на кабеле маркировка "High Speed", проблем не бывает, а если "Full Speed", то как повезет
coolzero
Oct 25 2007, 08:51
Всё возможно , надо проверить , спасибо ...
Но вот странная штука , проверяя отладчиком и USBMonitor трафик пакетов , получаю что в случае зависания копирования , получаю от винды совершенно чумовую копию каталога файлов
( я так понимаю что при записи файла , она считывает мой каталог , вносит туда новую запись и посылает мне ). После этого всё виснет...
Там почему то записаны 2 записи имени файла - первая с 0 между каждыми символами - 2 нормальная ...
Dron_Gus
Oct 25 2007, 09:53
Я описание ФАТ давно читал, но не длинное ли имя файла так закодировано? По два байта на символ...
_4afc_
Oct 25 2007, 10:21
Цитата(Dron_Gus @ Oct 25 2007, 13:53)

Я описание ФАТ давно читал, но не длинное ли имя файла так закодировано? По два байта на символ...
Именно длинное имя пишется в UTF16 !
Причём используется практически все 32 байта записи.
Причём если имя длинное - используют несколько записей.
Проще писать в формате 8+3 сомандером - тогда всё тип-топ будет.
coolzero
Oct 25 2007, 10:23
Так точно , похоже на то .
Длину имен подрезал, стало получше, думал что совсем хорошо...
Но погонял и некоторая нестабильность в работе всё равно остаётся
Calculator
Oct 25 2007, 10:42
Цитата(coolzero @ Oct 25 2007, 16:23)

Так точно , похоже на то .
Длину имен подрезал, стало получше, думал что совсем хорошо...
Но погонял и некоторая нестабильность в работе всё равно остаётся
Все-таки кабель Full Speed или High Speed? Что на нем написано?
coolzero
Oct 25 2007, 11:05
Написано достаточно много , но есть строка Revision 2.0
Полагаю это относится к версии USB...
_4afc_
Oct 25 2007, 11:20
Цитата(coolzero @ Oct 25 2007, 14:23)

Так точно , похоже на то .
Длину имен подрезал, стало получше, думал что совсем хорошо...
Но погонял и некоторая нестабильность в работе всё равно остаётся
Плата на экранированном столе? Может у вас помеха по земле\5вольтам всё выбивает.
Из компьютера на USB идёт плохо фильтрованное питание.
coolzero
Oct 25 2007, 11:37
Плата на пластиковых пеньках , стола не касается .
Питание от USB напрямую не используется , но заведено через защитный диод в паралель напряжению 3.9 В , на вход преобразователя TPS73033, который формирует итоговые 3.3 используемын для питания проца .
Не знаю может ли оно влиять ?
Проблемка осталась , с длинными файлами : типа файл практически полность скопирован , а нет чего то для завершения не хватает ...
При последующем включении файл виден , т.е в каталоге есть , но содержимое его битое...
Все малоки убрал , сделал статические буфера . Длину FIFO увеличил в 2 раза на всякий случай ... пока тоже самое
_4afc_
Oct 25 2007, 11:46
Цитата(coolzero @ Oct 25 2007, 15:37)

Плата на пластиковых пеньках , стола не касается .
Питание от USB напрямую не используется , но заведено через защитный диод в паралель напряжению 3.9 В , на вход преобразователя TPS73033, который формирует итоговые 3.3 используемын для питания проца .
Не знаю может ли оно влиять ?
Проблемка осталась , с длинными файлами : типа файл практически полность скопирован , а нет чего то для завершения не хватает ...
При последующем включении файл виден , т.е в каталоге есть , но содержимое его битое...
Все малоки убрал , сделал статические буфера . Длину FIFO увеличил в 2 раза на всякий случай ... пока тоже самое
Положите под плату лист текстолита соединённый с заземлением в розетке или в осциллоскопе.
Я не использовал BFSA, но в EFSL было кэширование записи - требовалось флушить файловую систему.
Проверьте можете ли вы писать/читать сектора не в начале флэши без ошибок.
coolzero
Oct 25 2007, 12:05
Текстолита , увы , сейчас под рукой нет ...
Не совсем понял , что значит флушить ?
Насчёт чтения\записи - я в принципе и так не в начале флеши работаю : первые 2 страницы ( 1056 байт ) отвёл под свои внутренние нужды , при доступе к файловой системе просто к адресу добавляется смещение .
Уважаемый 4afc , а не поясните ли какую роль играют буффера выделяемые малоком ( FIFO, FW_FIFO, TB ) и какие могут быть критичны по размеру ( возможно переполнение ) ?
_4afc_
Oct 25 2007, 12:33
Цитата(coolzero @ Oct 25 2007, 16:05)

Текстолита , увы , сейчас под рукой нет ...
Не совсем понял , что значит флушить ?
Насчёт чтения\записи - я в принципе и так не в начале флеши работаю : первые 2 страницы ( 1056 байт ) отвёл под свои внутренние нужды , при доступе к файловой системе просто к адресу добавляется смещение .
Уважаемый 4afc , а не поясните ли какую роль играют буффера выделяемые малоком ( FIFO, FW_FIFO, TB ) и какие могут быть критичны по размеру ( возможно переполнение ) ?
Просто односторонний текстолит проще чем метал. А втыкаемый паяльник вашим соседом или запускаемый за стеной холодильник могут добавить вам проблем.
Флушить - отписывать возможные буфера файловой системы на диск/флеш.
Вопрос не втом в каком адресе флеш памяти вы работаете, а в том насколько корректно вы умеете ходить по физическим секторам и пересчитывать кластеры FAT16 туда и обратно.
У вас таблица фат хоть меняется после записи файла? А сами сектора упомянутые в фат меняют своё содержимое?
Я заменял 4 буфера но их назначение для меня неизвесно т.к. протокол я не изучал, а тем более реализацию.
extern structTB MYMEM_fw_TB[FW_TB_NUM];//8*structTB=8*(12+64)=608 bytes
extern char MYMEM_data_buff[MAX_TRANSFER_SIZE]; //х*MAX_PACKET_SIZE
extern char MYMEM_fw_fifoId[FW_FIFO_SIZE];//512 bytes
extern UCHAR MYMEM_buff[FW_FIFO_SIZE];//512 bytes
Кстати несмоьря на то что MAX_TRANSFER_SIZE у меня равен 4096, WinXP1 читает с меня блоками по 64к. А ранее я вроде умудрялся ограничиватьразмеры запросов.
Dron_Gus
Oct 25 2007, 12:45
Какой размер сектора Вы используете? Хотя у AT45 размер сектора 264 байта, я использую лишь 256 первых. При этом обьединяю два сосених сектора в "честный" 512-байтный сектор.
coolzero
Oct 25 2007, 13:08
Таблица ФАТ и соответствующие сектора меняются
Насчёт того корректно ли хожу по физическим адресам , думаю что да , сбоев не замечал , но кто его знает... надо углублённо проверять .
Насчёт флага RXSUSP , а не может он мешать ?
Пару раз заметил при отсутствии копирования , что маска прерываний сброшена в состояние по умолчанию , пару раз прервание по конечной точке на выход запрещено...
странно как то
Я использую AT45DB16, там размер страницы 528 байт ,
правда есть какой-то режим с 512 байтами , но что я с ним не разобрался , не захотела флешка так работать
Dron_Gus
Oct 25 2007, 13:22
Цитата(coolzero @ Oct 25 2007, 17:08)

правда есть какой-то режим с 512 байтами , но что я с ним не разобрался , не захотела флешка так работать
Кажется этот режим задается 1 раз. Так что, если у Вас 528, то все.
Просто я советую попробовать "забить" на эти 16 байт и на низком уровне считывать/записывать сектора по 512 байт. Это все же ближе Винде.
coolzero
Oct 25 2007, 13:38
Надо попробовать
_4afc_
Oct 25 2007, 14:48
Цитата(Dron_Gus @ Oct 25 2007, 16:45)

Какой размер сектора Вы используете? Хотя у AT45 размер сектора 264 байта, я использую лишь 256 первых. При этом обьединяю два сосених сектора в "честный" 512-байтный сектор.
В одном проекте у меня устройство ёмкостью 8 секторов 512 байт, после каждого чтения данные в них меняются на новые.
В другом я заполняю SD карту файлами, которые доступны для чтения по USB. Сектора 512 байт.
Заполнение EFSL. Чтение чистый MSD без файловой системы - какой сектор винда хочет - такой и получает.
А вот у других сотрудников которые использовали другие файловые системы - были проблемы с вычислением из номера кластера в FAT16/FAT32 в физический номер сектора.
Dron_Gus
Oct 25 2007, 14:55
2 _4afc_, что-то наверное уже поздно... "ниасилил" осознать.

Я тоже использую чистый масс-сторадж. И PowerPack FS "внутри". И то и то использует одни и те же функции чтения/записи сектора. Глюков пока нет. Если не считать, что винда и "встроенная" ФС форматируют по-разному. Разный свободный обьем получается. ИМХО, глюк PowerPack FS.
_4afc_
Oct 26 2007, 11:17
Цитата(Dron_Gus @ Oct 25 2007, 18:55)

Я тоже использую чистый масс-сторадж. И PowerPack FS "внутри". И то и то использует одни и те же функции чтения/записи сектора. Глюков пока нет. Если не считать, что винда и "встроенная" ФС форматируют по-разному. Разный свободный обьем получается. ИМХО, глюк PowerPack FS.
Больший объём у меня получался пока я просто умножал на длину FAT таблицы - а надо её считывать и просмотреть значения внутри неё - получается 1:1 свободный объём. Правда собственных функций форматирования я не писал.
coolzero
Oct 26 2007, 12:09
Погонял свой девайс , мнение такое сложилось - косячно работает связка ARM-AT45 , там три команды есть непрерывного чтения основной памяти , у меня нормально работает только 0xE8 ,да и то на частоте AT91C_SPI_SCBR&(2<<8) ...
делаю частоту ниже AT91C_SPI_SCBR&(4<<8) - всё начинаются траблы
тут сегодня топик появился - у чела практически те же проблемы - при считовании больших массивов данных АТ45db161 сбоит...
не подскажут ли уважаемые форумчане , кто работает с данной датафлешкой , какиме настройки по SPI ?
Dron_Gus
Oct 26 2007, 12:45
Код
/*
typedef struct _AT45_Device{
int buflen;
int pages;
int blocks;
char pagebits;
char sign;
const char * name;
}AT45_Device;
*/
#define AT45_Types 8
const AT45_Device AT45_Type[AT45_Types]=
{
{ 264, 4096, 512, 9, 0, "Unknown"},
{ 264, 512, 64, 9, 3, "AT45DB011"}, // 1 Mbit
{ 264, 1024, 128, 9, 5, "AT45DB021"}, // 2 Mbit
{ 264, 2048, 256, 9, 7, "AT45DB041"}, // 4 Mbit
{ 264, 4096, 512, 9, 9, "AT45DB081"}, // 8 Mbit
{ 528, 4096, 512, 10, 11, "AT45DB161"}, // 16 Mbit
{ 528, 8192, 1024, 10, 13, "AT45DB128"}, // 32 Mbit
{1056, 8196, 1024, 11, 15, "AT45DB642"} // 64 Mbit
};
FS_AT45_InitSPI(void)
{
AT91PS_SPI pSPI = AT91C_BASE_SPI0;
// enable peripheral clock for SPI
AT91F_PMC_EnablePeriphClock (AT91C_BASE_PMC, (1 << AT91C_ID_SPI0));
// SPI enable and reset
if (!(pSPI->SPI_CR & AT91C_SPI_SPIEN))
{
pSPI->SPI_CR = AT91C_SPI_SWRST;
pSPI->SPI_CR = AT91C_SPI_SPIDIS;
pSPI->SPI_CR = AT91C_SPI_SPIEN;
}
// SPI mode: master, fixed periph. sel., FDIV=0, fault detection disabled
pSPI->SPI_MR = AT91C_SPI_MSTR | AT91C_SPI_PS_FIXED | AT91C_SPI_MODFDIS;
// set chip-select-register
// SPI mode 0: 8 bits per transfer, CPOL=0, ClockPhase=0, DLYBCT = 0
//pSPI->SPI_CSR[AT45_SPI_CSRNum] = /*AT91C_SPI_CPOL |*/ AT91C_SPI_NCPHA | AT91C_SPI_BITS_8 | AT91C_SPI_CSAAT | (0xFF << 8);
// SPI mode 3: 8 bits per transfer, CPOL=1, ClockPhase=1, DLYBCT = 0
pSPI->SPI_CSR[AT45_SPI_CSRNum] = AT91C_SPI_CPOL | /*AT91C_SPI_NCPHA |*/ AT91C_SPI_BITS_8 | 0x0F << 8;
// pSPI->SPI_CR = AT91C_SPI_SPIEN;
// if(pSPI->SPI_SR & AT91C_SPI_SPIENS)
// printf("SPI initialized...\n");
}
// Read DataFlash status register
__ramfunc char FS_AT45_ReadStatus(U8 Unit)
{
char s;
FS_AT45_DisableCS(Unit);
FS_AT45_EnableCS(Unit);
FS_AT45_RW(StatusReg);
s = FS_AT45_RW(0xFF);
FS_AT45_DisableCS(Unit);
return s;
}
int FS_AT45_InitDev(U8 Unit)
{
char result;
int i;
result = FS_AT45_ReadStatus(Unit);
// printf("AT45 status %X\r\n", result);
AT45_Devs[Unit] = &(AT45_Type[0]);
for (i = AT45_Types; i >= 0; i--)
if (((result >> 2) & 0x0F) == AT45_Type[i].sign)
break;
AT45_Devs[Unit] = &AT45_Type[i];
if (i != 0)
return 0;
else
return 1;
}
int FS_AT45_InitDevice(U8 Unit) // Called from AddDevice. Usually the first call to the driver
{
int result, i;
char prev_dev;
FS_AT45_InitPIO();
FS_AT45_InitSPI();
FS_AT45_DisableCS(Unit);
prev_dev = FS_AT45_Select(AT45_SPI_CSRMask);
FS_AT45_SetSpeed(AT45_MIN_SPEED); //slow during init
for(i=0;i<41;i++)
FS_AT45_RW(0xFF);
FS_AT45_SetSpeed(AT45_MAX_SPEED);
result = FS_AT45_InitDev(Unit);
//DataAbort will be detected if we use printf here! FS bag?
/* if (result != 0)
{
printf("Error init AT45 devise No %d\n\r", Unit);
}
else
{
printf("Found %s\n\r", AT45_Devs[Unit]->name);
}*/
FS_AT45_Select(prev_dev);
return result;
}
coolzero
Oct 26 2007, 12:55
Спасибо Dron_Gus , буду разбираться .
А какое значение для работы SPI имеет задержка перед выдачей
тактов после сброшенного ChipSelect ?
Может как то влиять на работоспособность ?
coolzero
Oct 29 2007, 07:38
а какая команда чтения датафлеш используется ?
coolzero
Oct 29 2007, 09:26
Поигрался с настройками SPI , не понятно
Девайс коннектится с виндой только на скорости 24 МГц , на этой частоте ещё что то копируется.
Делаю частоту ниже - всё винда уже не видет флеш , отформатить не может ...
Уважаемый Dron_Gus а почему вы дергаете чип селектом в ручную , а не используете бит CSAAT?
Dron_Gus
Oct 29 2007, 10:34
Где-то на форуме обсуждались проблеммы и особености SPI модуля в at91. При последовательно записи нескольких команд может возникнуть ситуация, что CS не успеет "подняться" между командами.
coolzero
Oct 31 2007, 08:59
Уважаемые форумчане , где то видел мессагу , про то что в примере Mass Storage не совсем корректно работает полтверждение приёма от хоста ...
что то про длину пакета равную размеру конечной точки...
не напомните в чём дело , а то что то пртокол булкин транспорт подвисает