|
|
  |
проблемы с настройкой модуля USB в AT91SAM7S256 |
|
|
|
Oct 24 2007, 06:16
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 16-05-06
Пользователь №: 17 135

|
Добрый день , уважаемые форумчане Помогите начинающему работать с 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 прерывания нет , у-во на компе не видно .
|
|
|
|
|
Oct 24 2007, 08:04
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 16-05-06
Пользователь №: 17 135

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

|
Цитата(coolzero @ Oct 24 2007, 12:04)  По докам надо вообще к 3.3 если я правильно понял. Разаработчик платы уверяет что это нормально , работать должон... Это принципиально ? Это не нормально, нужно исправить. Цитата(coolzero @ Oct 24 2007, 12:04)  Насчёт сброса флага - всё может быть конечно , но эти команды выполняются в обработчике прерывания по соответствуюшему вектору , мне кажется вряд ли между 3 командами между 2 точками останова , я как то успеваю попасть в это же прерывание , и никак не заметить это по точкам остонова ? . Или я не прав ? Я не совсем понимаю, что именно Вы наблюдаете в прерывании. Между двумя точками останова можно сотню раз успеть поставить флаг. С JTAG'ом в прерываниях нужно быть осторожнее.
|
|
|
|
|
Oct 24 2007, 09:00
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 16-05-06
Пользователь №: 17 135

|
[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.
Попробую разобраться с подтяжкой , может что то прояснится ...
|
|
|
|
|
Oct 24 2007, 09:51
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 7-02-06
Из: Зеленоград
Пользователь №: 14 071

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

Профессионал
    
Группа: Свой
Сообщений: 1 262
Регистрация: 13-10-05
Из: Санкт-Петербург
Пользователь №: 9 565

|
Цитата(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мбита) Выкиньте из обработчика прерывания управление энергопотреблением!!! - А то как вы будете отлаживаться?
Сообщение отредактировал _4afc_ - Oct 24 2007, 10:03
|
|
|
|
|
Oct 24 2007, 11:05
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 16-05-06
Пользователь №: 17 135

|
Изменил подтяжку вместо питания 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 заново конфигурятся клоки всего проца ? Начал тестировать , вылезли грабли , файлы копируются через раз, иногда глобально зависаю
Сообщение отредактировал coolzero - Oct 24 2007, 10:51
|
|
|
|
|
Oct 24 2007, 11:10
|

Профессионал
    
Группа: Свой
Сообщений: 1 262
Регистрация: 13-10-05
Из: Санкт-Петербург
Пользователь №: 9 565

|
Цитата(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)
Сообщение отредактировал _4afc_ - Oct 24 2007, 11:16
|
|
|
|
|
Oct 24 2007, 11:10
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 16-05-06
Пользователь №: 17 135

|
А чем мне может помешать управление энергопотреблением ? Не совсем понял , расшифруйте пожалтста...
|
|
|
|
|
Oct 24 2007, 11:23
|

Профессионал
    
Группа: Свой
Сообщений: 1 262
Регистрация: 13-10-05
Из: Санкт-Петербург
Пользователь №: 9 565

|
Цитата(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); }
|
|
|
|
|
Oct 24 2007, 11:44
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 16-05-06
Пользователь №: 17 135

|
М-да что то не получается Из проводника диск форматируется , но при записи файла подвисает , причём потом из проводника диск виден , а например из-под тотал командера нет , т.е получается что при записи файла корёжится файловая система, но как то хитро Не совсем понял USB_CONFIG = 0x60 - это что ? Цитата(_4afc_ @ Oct 24 2007, 15:23)  А зачем им управлять? Кроме того там могут стоять другие клоки по сравнению с вашими. Зачем зря кварц и Pll дёргать. Достаточно для протокола отрубить\врубить usb: А тут мы в сами друг друга не поняли: я тоже имел ввиду что , не стоит по 2 раза конфигурить проц , соответственно и из обработки флага RXSUSP надо бы енто удалить , там частота ядра снижается , видимо для уменьшения потребления ?
|
|
|
|
|
Oct 24 2007, 11:45
|

Профессионал
    
Группа: Свой
Сообщений: 1 262
Регистрация: 13-10-05
Из: Санкт-Петербург
Пользователь №: 9 565

|
Цитата(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)  там частота ядра снижается , видимо для уменьшения потребления ? Да, причём мне кажется сие нужно делать только если где-то будет сказано, что у вас есть такой режим - малого потребления.
Сообщение отредактировал _4afc_ - Oct 24 2007, 11:49
|
|
|
|
|
Oct 24 2007, 12:02
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 16-05-06
Пользователь №: 17 135

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

Профессионал
    
Группа: Свой
Сообщений: 1 262
Регистрация: 13-10-05
Из: Санкт-Петербург
Пользователь №: 9 565

|
Цитата(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 самому дёргать
Сообщение отредактировал _4afc_ - Oct 24 2007, 12:28
|
|
|
|
|
Oct 24 2007, 12:40
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 16-05-06
Пользователь №: 17 135

|
А если я поменяю PID\VID - у меня проблем с драйверами не будет ? Я думал что они как раз по ним дрова цепляют , потому что у меня было 2 примера - CDC модем и эмулятор сом-порта , разница у них была в последнем бите PID , но при этом каждый цеплял свой драйвер ... Если речь идёт о секундах тада засада : копирую файлы по 3 кило - нормально , порядка 60 - завис . и от файловой системы мне не уйти , записанные файлы я должен буду потом найти и использовать уже по другому назаначению ( не по USB ) , а как их использовать если файловая структура не понятно какая.. ?
|
|
|
|
|
Oct 24 2007, 13:04
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 16-05-06
Пользователь №: 17 135

|
Значит надо рыть в другую сторону , возможно действительно уйти от динамического распределения памяти в сторону статических буфферов.
|
|
|
|
|
Oct 25 2007, 05:15
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 16-05-06
Пользователь №: 17 135

|
Да вроде нет - програмка пока отладочная , кроме usb нет ничего , только обработка прерываний по usb , да бесконечный цикл по опросу состояния флагов ( приём , передача , event ) .
Маленькие файлы копируются вроде нормально ( ~1-3 кБ) , побольше похоже не всегда дописываются до конца
|
|
|
|
|
Oct 25 2007, 07:54
|
Участник

Группа: Свой
Сообщений: 45
Регистрация: 19-04-07
Пользователь №: 27 172

|
Цитата(coolzero @ Oct 25 2007, 11:15)  Маленькие файлы копируются вроде нормально ( ~1-3 кБ) , побольше похоже не всегда дописываются до конца Возможно проблемы и не в программе. У нас иногда с серийными устройствами бывают "проблемы" при проверки работы USB, потом оказывается, что очередной раз купили плохие кабели. Обычно если на кабеле маркировка "High Speed", проблем не бывает, а если "Full Speed", то как повезет
|
|
|
|
|
Oct 25 2007, 08:51
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 16-05-06
Пользователь №: 17 135

|
Всё возможно , надо проверить , спасибо ... Но вот странная штука , проверяя отладчиком и USBMonitor трафик пакетов , получаю что в случае зависания копирования , получаю от винды совершенно чумовую копию каталога файлов ( я так понимаю что при записи файла , она считывает мой каталог , вносит туда новую запись и посылает мне ). После этого всё виснет... Там почему то записаны 2 записи имени файла - первая с 0 между каждыми символами - 2 нормальная ...
|
|
|
|
|
Oct 25 2007, 10:21
|

Профессионал
    
Группа: Свой
Сообщений: 1 262
Регистрация: 13-10-05
Из: Санкт-Петербург
Пользователь №: 9 565

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

Группа: Участник
Сообщений: 25
Регистрация: 16-05-06
Пользователь №: 17 135

|
Так точно , похоже на то . Длину имен подрезал, стало получше, думал что совсем хорошо... Но погонял и некоторая нестабильность в работе всё равно остаётся
|
|
|
|
|
Oct 25 2007, 10:42
|
Участник

Группа: Свой
Сообщений: 45
Регистрация: 19-04-07
Пользователь №: 27 172

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

Группа: Участник
Сообщений: 25
Регистрация: 16-05-06
Пользователь №: 17 135

|
Написано достаточно много , но есть строка Revision 2.0 Полагаю это относится к версии USB...
|
|
|
|
|
Oct 25 2007, 11:37
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 16-05-06
Пользователь №: 17 135

|
Плата на пластиковых пеньках , стола не касается . Питание от USB напрямую не используется , но заведено через защитный диод в паралель напряжению 3.9 В , на вход преобразователя TPS73033, который формирует итоговые 3.3 используемын для питания проца . Не знаю может ли оно влиять ? Проблемка осталась , с длинными файлами : типа файл практически полность скопирован , а нет чего то для завершения не хватает ... При последующем включении файл виден , т.е в каталоге есть , но содержимое его битое... Все малоки убрал , сделал статические буфера . Длину FIFO увеличил в 2 раза на всякий случай ... пока тоже самое
|
|
|
|
|
Oct 25 2007, 11:46
|

Профессионал
    
Группа: Свой
Сообщений: 1 262
Регистрация: 13-10-05
Из: Санкт-Петербург
Пользователь №: 9 565

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

Группа: Участник
Сообщений: 25
Регистрация: 16-05-06
Пользователь №: 17 135

|
Текстолита , увы , сейчас под рукой нет ... Не совсем понял , что значит флушить ? Насчёт чтения\записи - я в принципе и так не в начале флеши работаю : первые 2 страницы ( 1056 байт ) отвёл под свои внутренние нужды , при доступе к файловой системе просто к адресу добавляется смещение . Уважаемый 4afc , а не поясните ли какую роль играют буффера выделяемые малоком ( FIFO, FW_FIFO, TB ) и какие могут быть критичны по размеру ( возможно переполнение ) ?
|
|
|
|
|
Oct 25 2007, 12:33
|

Профессионал
    
Группа: Свой
Сообщений: 1 262
Регистрация: 13-10-05
Из: Санкт-Петербург
Пользователь №: 9 565

|
Цитата(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к. А ранее я вроде умудрялся ограничиватьразмеры запросов.
Сообщение отредактировал _4afc_ - Oct 25 2007, 12:36
|
|
|
|
|
Oct 25 2007, 13:08
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 16-05-06
Пользователь №: 17 135

|
Таблица ФАТ и соответствующие сектора меняются Насчёт того корректно ли хожу по физическим адресам , думаю что да , сбоев не замечал , но кто его знает... надо углублённо проверять . Насчёт флага RXSUSP , а не может он мешать ? Пару раз заметил при отсутствии копирования , что маска прерываний сброшена в состояние по умолчанию , пару раз прервание по конечной точке на выход запрещено... странно как то
Я использую AT45DB16, там размер страницы 528 байт , правда есть какой-то режим с 512 байтами , но что я с ним не разобрался , не захотела флешка так работать
|
|
|
|
|
Oct 25 2007, 13:38
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 16-05-06
Пользователь №: 17 135

|
Надо попробовать
|
|
|
|
|
Oct 25 2007, 14:48
|

Профессионал
    
Группа: Свой
Сообщений: 1 262
Регистрация: 13-10-05
Из: Санкт-Петербург
Пользователь №: 9 565

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

Группа: Участник
Сообщений: 25
Регистрация: 16-05-06
Пользователь №: 17 135

|
Погонял свой девайс , мнение такое сложилось - косячно работает связка ARM-AT45 , там три команды есть непрерывного чтения основной памяти , у меня нормально работает только 0xE8 ,да и то на частоте AT91C_SPI_SCBR&(2<<8) ... делаю частоту ниже AT91C_SPI_SCBR&(4<<8) - всё начинаются траблы тут сегодня топик появился - у чела практически те же проблемы - при считовании больших массивов данных АТ45db161 сбоит... не подскажут ли уважаемые форумчане , кто работает с данной датафлешкой , какиме настройки по SPI ?
|
|
|
|
|
Oct 26 2007, 12:45
|

Профессионал
    
Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861

|
Код
/* 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; }
--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
|
|
|
|
|
Oct 26 2007, 12:55
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 16-05-06
Пользователь №: 17 135

|
Спасибо Dron_Gus , буду разбираться . А какое значение для работы SPI имеет задержка перед выдачей тактов после сброшенного ChipSelect ? Может как то влиять на работоспособность ?
|
|
|
|
|
Oct 29 2007, 07:38
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 16-05-06
Пользователь №: 17 135

|
а какая команда чтения датафлеш используется ?
|
|
|
|
|
Oct 29 2007, 09:26
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 16-05-06
Пользователь №: 17 135

|
Поигрался с настройками SPI , не понятно Девайс коннектится с виндой только на скорости 24 МГц , на этой частоте ещё что то копируется. Делаю частоту ниже - всё винда уже не видет флеш , отформатить не может ... Уважаемый Dron_Gus а почему вы дергаете чип селектом в ручную , а не используете бит CSAAT?
|
|
|
|
|
Oct 31 2007, 08:59
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 16-05-06
Пользователь №: 17 135

|
Уважаемые форумчане , где то видел мессагу , про то что в примере Mass Storage не совсем корректно работает полтверждение приёма от хоста ... что то про длину пакета равную размеру конечной точки... не напомните в чём дело , а то что то пртокол булкин транспорт подвисает
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|