|
|
  |
CY7C68013A + ADSP-2181, Приделать USB к IDMA |
|
|
|
Jan 29 2007, 20:56
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 26-01-07
Из: Саратов
Пользователь №: 24 791

|
Раньше была плата: к IDMA ADSP-2181 через ISA был подключен компьютер, или, наоборот, к компьютеру по ISA был подключен через IDMA ADSP-2181. Во загнул...  Короче, теперь требуется повесить IDMA на USB. Вроде бы CY7C68013A терпит по I/O 5,25 В. Руки чешутся подсоединить напрямую. Хотя я так никогда не делал. А может быть, есть 5В аналоги CYPRESS? Да, плата питаться будет от USB. Можно? Потом, хотел бы все сделать на флагах (I/O), но тогда могут быть конфликты на шине вследствие ошибок в программе. Это технически неверно, сам знаю. Но последнее время все чаще так делаю. Что думаете, господа разработчики? И последний вопрос, так USB не занимался до этого. Везде рекомендуют на D+ и D- , бусины, а можно поставить просто дроссели? И какие лучше? Спасибо.
Сообщение отредактировал Aluminium - Jan 29 2007, 20:58
|
|
|
|
|
Jan 30 2007, 20:15
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 26-01-07
Из: Саратов
Пользователь №: 24 791

|
Подумал я немножко и понял, что не следует делать на портах микроконтроллера интерфейс с ADSP IDMA. Зачем тогда вообще USB нужно?
Нужно напрямую через FIFO работать. Как такой вариант: 56-ножная микросхема, CTLx на IAL, #IRD и #IWR, IACK на один из RDY, #IS и #RESET процессора взять со свободного порта?
Вроде бы должно получиться, но в голове картина не складывается. Как, например, различать данные и адреса для IDMA порта? Протокол придумать, чтобы в начале шел адрес, потом данные? Или для адреса можно сделать отдельный endpoint?
Я первый раз работаю с USB, поэтому задачка еще та, тем более я не прогаммист совершенно. Поэтому прошу прощения за свой поток мыслей - не с кем поделиться.
Сообщение отредактировал Aluminium - Jan 30 2007, 20:21
|
|
|
|
|
Jan 30 2007, 21:27
|
Местный
  
Группа: Свой
Сообщений: 205
Регистрация: 16-10-05
Пользователь №: 9 704

|
Цитата(Aluminium @ Jan 29 2007, 19:56)  Раньше была плата: к IDMA ADSP-2181 через ISA был подключен компьютер, или, наоборот, к компьютеру по ISA был подключен через IDMA ADSP-2181. Во загнул...  Короче, теперь требуется повесить IDMA на USB. Да, хорошо загнул! :-) Думаю, что гораздо лучше коллеги смогут тебе посоветовать, если станет понятно, что логически нужно сделать. Нужно-ли считывать из устройства какой-то диапазон адресуемых данных, или можно ограничиться считыванием одного порта? Каков объем этих данных? Как нужно организовать квитирование (по готовности?) и каким образом? В общем, представь, что ты пишешь техзадание... :-) Цитата(Aluminium @ Jan 29 2007, 19:56)  Вроде бы CY7C68013A терпит по I/O 5,25 В. Руки чешутся подсоединить напрямую. Хотя я так никогда не делал. А может быть, есть 5В аналоги CYPRESS? Да, плата питаться будет от USB. Можно? Навскидку не скажу, но ты лучше не спрашивай, а даташит посмотри. Ведь авторы микросхемы по-любому это лучше знают... Цитата(Aluminium @ Jan 29 2007, 19:56)  Потом, хотел бы все сделать на флагах (I/O), но тогда могут быть конфликты на шине вследствие ошибок в программе. Это технически неверно, сам знаю. Но последнее время все чаще так делаю. Что думаете, господа разработчики? Совсем не понял... Цитата(Aluminium @ Jan 29 2007, 19:56)  И последний вопрос, так USB не занимался до этого. Везде рекомендуют на D+ и D- , бусины, а можно поставить просто дроссели? И какие лучше? Спасибо.  Лучше всего делать так, как рекомендуют авторы микросхемы - фирма Cypress. Т.е. линии USB присоединяешь прямо к разъему без ничего. Нужно только соблюсти требование, чтобы проводники были максимально короткими. Я делал порядка 30-40 мм - все хорошо. Цитата(Aluminium @ Jan 30 2007, 19:15)  Нужно напрямую через FIFO работать. Как такой вариант: 56-ножная микросхема, CTLx на IAL, #IRD и #IWR, IACK на один из RDY, #IS и #RESET процессора взять со свободного порта? Думаю, что это вполне нормальный вариант. Цитата(Aluminium @ Jan 30 2007, 19:15)  Вроде бы должно получиться, но в голове картина не складывается. Как, например, различать данные и адреса для IDMA порта? Протокол придумать, чтобы в начале шел адрес, потом данные? Или для адреса можно сделать отдельный endpoint? К сожалению, я не знаю твоей микросхемы, но ты рассуждай так. С помощью микроконтроллера в CY7C68013A ты можешь выставлять на свободном порту признак ADDR/DATA или еще как-то задавать начальный адрес блока, который требуется передать. А дальше с помощью потоковой передачи через FIFO качать данные. Т.е. к примеру, по одной ендпойнте (управления) ты задаешь режим передачи, начальный адрес, направление и т.п., а с помощью другой уже непосредственно передаешь данные. (Я так грубо, прикидочно говорю, т.к. не знаю твоей задачи.) Цитата(Aluminium @ Jan 30 2007, 19:15)  Вроде бы должно получиться, но в голове картина не складывается. Как, например, различать данные и адреса для IDMA порта? Протокол придумать, чтобы в начале шел адрес, потом данные? Или для адреса можно сделать отдельный endpoint? Лучше всего отдельный ендпойнт: ендпойнт управления, для которого ты можешь выработать необходимую систему команд. Нужно рассматривать каждую ендпойнту, как отдельный, независимый канал данных. Тогда сразу в голове проясняется :-) Цитата(Aluminium @ Jan 30 2007, 19:15)  Я первый раз работаю с USB, поэтому задачка еще та, тем более я не прогаммист совершенно. Поэтому прошу прощения за свой поток мыслей - не с кем поделиться. С нами делись :-) Если удастся помочь - обязательно поможем :-) Мы же все коллеги!
--------------------
MPEG-4 - в массы!
|
|
|
|
|
Jan 30 2007, 22:50
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 26-01-07
Из: Саратов
Пользователь №: 24 791

|
Задача вот какая.
Есть 16-разрядный мультиплексированный порт процессора. По нему можно в память процессора писать данные или грузить программу. Из него можно читать данные или код (последнее труднее, потому что код 24-разрядный). Для чтения и записи есть четыре управляющих сигнала: 4 входных (#IS, IAL, #IRD, #IWR) и один выходной IACK, который хочу завести на RDY. Еще нужно системный сброс #RESET на процессор.
#IS - это выбор порта, как #CS у озушки, например. Его можно и всегда разрешенным держать, но я им с порта собираюсь управлять.
Собственно IAL, #IRD, #IWR, которые хочу завести на CTLx, должны сопровождаться #IS.
IAL - защелка адреса, то куда или откуда я хочу читать.
#IRD и #IWR - собственно сигналы чтения и записи этого порта.
Каждое чтение или запись инкрементирует указатель адреса.
Поскольку мой порт - это порт прямого доступа в память, читать память я могу на всем скоку. Для квитирования того, что данные из памяти переписались в буфер порта служит IACK. Пока сигнал не встал, держи #IRD с #IS. (При записи не актуально.) Появился - снимай.
Общая задача состоит в том, чтобы периодически писать по IAL адреса, а потом по #IRD и #IWR писать и читать данные. Иногда сбрасывать процессор.
Да, испугался я при словах "техническое задание". :-)
Про конфликты на шине. Меня еще n-лет назад учили, что аппаратура не должна позволять программе себя сжечь. Поэтому никогда раньше не делал, чтобы программист мог одновременно и чтение, и запись заделать. Поэтому всегда предпочитал управлять устройствами с шины, а не портами ввода-вывода. А сейчас не хочется разбираться и вспоминать, особенно когда почти все так и делают. Знаю, что современный КМОП так не сожжешь, так что вопрос философский, ищу себе оправдания.
Спасибо за помощь.
|
|
|
|
|
Jan 31 2007, 10:57
|
Местный
  
Группа: Свой
Сообщений: 205
Регистрация: 16-10-05
Пользователь №: 9 704

|
Цитата(Aluminium @ Jan 30 2007, 21:50)  Есть 16-разрядный мультиплексированный порт процессора. По нему можно в память процессора писать данные или грузить программу. Из него можно читать данные или код (последнее труднее, потому что код 24-разрядный). ... Общая задача состоит в том, чтобы периодически писать по IAL адреса, а потом по #IRD и #IWR писать и читать данные. Иногда сбрасывать процессор. Вот, теперь понятно. Почти такая же задача стоит и у меня. Я пришел вот к какому решению (правда у меня не процессор, а FPGA, но это в данном случае без разницы). 1. Есть режим записи/считывания служебной информации посредством порта управления/состояния (т.е. набор внутренних регистров). Один из этих регистров служит защелкой начального адреса для блока данных. 2. Есть режим записи/считывания блоков данных размером в ендпойнту (у меня величина блока данных - 512 байт с перспективой увеличения до 1024 байта, когда специалисты из Cypress'а дадут ответ, как это сделать. Пока они уже почти неделю чешут репу, задали парочку дурацких вопросов, короче, виляют как уж на сковородке в попытках уклониться от моих пожеланий :-) 3. Для разделения этих двух режимов я использую свободную ногу порта ввода/вывода микроконтроллера в CY7C68013A. Типа, "1" - пишутся/читаются управляющие данные, "0" - пишутся/читаются блоки данных. 4. Для канала управления используется режим записи/считывания одиночного слова (GPIF Waveforms: Single Word Write и Single Word Read), в котором старший байт - номер регистра, а младший байт - данные для записи в этот регистр. Для считывания регистра используется более хитрый метод из двух операций: сначала записывается номер регистра в специальный регистр номера, а затем считывается байт данных того регистра, номер которого мы только что записали. 5. Для канала блочной передачи данных используется режим записи/считывания посредством FIFO (GPIF Waveforms: FIFO Write и FIFO Read). Таким образом представляется, что в твоем случае можно использовать вэйвформу Single Word Write для записи начального адреса, а вэйвформы FIFO Write, FIFO Read для последующего записи/считывания данных. Тогда можно развести сигналы так: IAL, #IRD и #IWR на выводы CTL0...2, а #IS включить постоянно или подать на свободный вывод порта ввода/вывода. В вэйвформе Single Word Write будут активизироваться сигналы IAL=1 и #IWR=0 для защелкивания адреса, а в вэйвформах FIFO Write и FIFO Read - IAL=0 и #IWR=0 или #IRD=0 для передачи данных. Цитата(Aluminium @ Jan 30 2007, 21:50)  Да, испугался я при словах "техническое задание". :-) :-) Цитата(Aluminium @ Jan 30 2007, 21:50)  Про конфликты на шине. Меня еще n-лет назад учили, что аппаратура не должна позволять программе себя сжечь. Поэтому никогда раньше не делал, чтобы программист мог одновременно и чтение, и запись заделать. Поэтому всегда предпочитал управлять устройствами с шины, а не портами ввода-вывода. А сейчас не хочется разбираться и вспоминать, особенно когда почти все так и делают. Знаю, что современный КМОП так не сожжешь, так что вопрос философский, ищу себе оправдания. Ерунда, не бери в голову. Во-первых, в подобной ситуации с нынешними микросхемами трудновато что-то сжечь (я еще ни разу не сталкивался, хотя ошибки неоднократно допускал). Во-вторых, как я понял, данные из твоего процессора выдаются только по сигналу #IRD, и хорошо, что этот сигнал инверсный (хорошо тем, что в неинициализированной системе он будет неактивным; нужно только не забыть поставить подтягивающий резистор на Vcc). Таким образом твоя задача упрощается до минимума: нужно просто не допускать одновременного появления обеих сигналов #IWR и #IRD.
--------------------
MPEG-4 - в массы!
|
|
|
|
|
Jan 31 2007, 21:33
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 26-01-07
Из: Саратов
Пользователь №: 24 791

|
Спасибо большое. Радует, что я был прав. Пока рисую схему. Потом будет куча вопросов по софту. Во имя истины замечу, что в ADSP-2181 IAL не сопровождается записью #IWR. Он сам себе запись.  Сегодня, например, искал разъем типа B и все такое.
|
|
|
|
|
Jan 31 2007, 22:46
|
Местный
  
Группа: Свой
Сообщений: 205
Регистрация: 16-10-05
Пользователь №: 9 704

|
Цитата(Aluminium @ Jan 31 2007, 20:33)  Спасибо большое. Радует, что я был прав. Пока рисую схему. Потом будет куча вопросов по софту. Если тебе интересно, то отслеживай топик "CY7C680013A Киньте ссылкой на софт и лит-ру". Я сейчас ожидаю ответа от специалистов Cypress по поводу использования Interrupt endpoint для потоковой передачи 1024-байтных блоков данных на более-менее приличной скорости. (Чтобы не травмировать ранимые души означенных специалистов, я сказал, что они смогут удовлетворить меня скоростью всего-лишь 20-30 МБ/сек :-) Ответ помещу в этот топик. Цитата(Aluminium @ Jan 31 2007, 20:33)  Во имя истины замечу, что в ADSP-2181 IAL не сопровождается записью #IWR. Он сам себе запись.  А, так это вроде сигнала ALE в 8085 или 8051? Хорошая микросхема! Грамотно разработанная, видать.
--------------------
MPEG-4 - в массы!
|
|
|
|
|
Dec 14 2007, 08:36
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 26-01-07
Из: Саратов
Пользователь №: 24 791

|
Сделали две платы. Хорошо получилось.  Но запрограммировать не очень получается. Сделали вейформы. Для записи данных выделили эндпойнт, для чтения данных выделили и для записи адреса сделали свой. Работаем с фифо пока в ручном режиме. И вроде бы работает. Пишем адрес, пишем данные. Пишем адрес, читаем данные. А из буфера два раза принимаем мусор произвольной длины, а на третий наши родные данные, столько, сколько надо.  То ли буфер не инициализировался, то ли что... В тупике, нужна помощь. Если есть желающие покопаться в проекте, выложим куда-нибудь.
|
|
|
|
|
Aug 13 2008, 11:48
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 26-01-07
Из: Саратов
Пользователь №: 24 791

|
Понятно, наверно, для тех, кто работал с микросхемой CYPRESS, что мы пытаемся работать из EPROM. И при перезагрузке, когда питание не снимается, и при включении питания, когда питание снимается, наша плата опознается как неизвестное устройство. Помогает только расстыковка-стыковка разъема USB, тогда опознается правильно.
|
|
|
|
|
Aug 13 2008, 16:39
|
Знающий
   
Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644

|
Цитата(Aluminium @ Aug 13 2008, 14:48)  Понятно, наверно, для тех, кто работал с микросхемой CYPRESS, что мы пытаемся работать из EPROM. И при перезагрузке, когда питание не снимается, и при включении питания, когда питание снимается, наша плата опознается как неизвестное устройство. Помогает только расстыковка-стыковка разъема USB, тогда опознается правильно. Попробуйте запретить переход FX2LP в режим Suspend. То есть, если написание firmware основывалось на модификации какого-то примера от Cypress, попробуйте найти и закоментировать следующие строки: Цитата // check for and handle suspend. // NOTE: Idle mode stops the processor clock. There are only two // ways out of idle mode, the WAKEUP pin, and detection of the USB // resume state on the USB bus. The timers will stop and the // processor will not wake up on any other interrupts. if (Sleep) { if(TD_Suspend()) { Sleep = FALSE; // Clear the "go to sleep" flag. Do it here to prevent any race condition between wakeup and the next sleep. do { EZUSB_Susp(); // Place processor in idle mode. } while(!Rwuen && EZUSB_EXTWAKEUP()); // above. Must continue to go back into suspend if the host has disabled remote wakeup // *and* the wakeup was caused by the external wakeup pin.
// 8051 activity will resume here due to USB bus or Wakeup# pin activity. EZUSB_Resume(); // If source is the Wakeup# pin, signal the host to Resume. TD_Resume(); } }
|
|
|
|
|
Aug 14 2008, 14:12
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 26-01-07
Из: Саратов
Пользователь №: 24 791

|
Спасибо. Все заработало. Дело было именно в этом.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|