Перейти к содержанию
    

klaks

Участник
  • Постов

    12
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный
  1. ISP1763A

    заметил баги: эти 2 строчки из configure: isp_read_register_16(ISP_REG_INTERRUPT_CONFIGURATION, &tmp); isp_write_register_16(ISP_REG_INTERRUPT_CONFIGURATION, tmp | (1 << ISP_INTC_DATA_DEBUG_MODE_OUT_POS) | (1 << ISP_INTC_DATA_DEBUG_MODE_IN_POS) | (1 << ISP_INTC_CONTROL_0_DEBUG_MODE_POS)); заменить на: isp_write_register_16(ISP_REG_INTERRUPT_CONFIGURATION, ISP_INTC_ACTIVE_HIGH_INTERRUPT_MASK | ISP_INTC_PULSED_INTERRUPT_MASK | (1 << ISP_INTC_DATA_DEBUG_MODE_OUT_POS) | (1 << ISP_INTC_DATA_DEBUG_MODE_IN_POS) | (1 << ISP_INTC_CONTROL_0_DEBUG_MODE_POS)); и убрать строку из usb_init: isp_write_register_16(ISP_REG_TEST_MODE, ISP_TSTM_FORCE_FULL_SPEED_MASK); если по control pipe вопросы будут - обращайтесь Не могу запустить DMA на bulk. Настраиваю его таким образом: isp_write_register_16(ISP_REG_DMA_ENDPOINT, USB_ENDPOINT2_IN_INDEX); isp_write_register_32(ISP_REG_DMA_TRANSFER_COUNTER, count); isp_write_register_16(ISP_REG_DMA_COMMAND, ISP_DCMD_GDMA_READ_COMMAND); Сигнал DREQ выставляется, после чего выставляется DACK. Идет один цикл считывания слова. Отсылается только одно слово и все. В чем может быть загвоздка?
  2. ISP1763A

    Инициализация периферийного режима void usb_init(void) { uint16_t hw; // Настраиваем пины (PORTD_Bit2 - прерывание от ISP, PORTD_Bit4 - ресет USB) DDRD = DDRD & ~(1 << DDD2) | (1 << DDD4); GICR_INT0 = 0; MCUCR |= (1 << ISC01) | (1 << ISC00); // Работаем по фронту импульса прерывания // Последовательность включения ISP PORTD_Bit4 = 0; __delay_cycles((unsigned long) (AVR_FREQUENCY * 1.1E-2)); PORTD_Bit4 = 1; isp_read_register_16(ISP_REG_CHIP_ID, &hw); // Дамми чтение __delay_cycles((unsigned long) (AVR_FREQUENCY * 1.1E-2)); // Инициализация интерфейса hw = ISP_HMC_EDGE_TRIGGERED_INTERRUPT_MASK | ISP_HMC_COMMON_INT_MASK | ISP_HMC_ACTIVE_HIGH_INTERRUPT_MASK; isp_write_register_16(ISP_REG_HW_MODE_CONTROL, hw); hw |= ISP_HMC_INTERFACE_LOCK_MASK; isp_write_register_16(ISP_REG_HW_MODE_CONTROL, hw); isp_write_register_16(ISP_REG_UNLOCK_DEVICE, ISP_UNLOCK_DEVICE_CODE); isp_write_register_16(ISP_REG_MODE, ISP_MODE_SOFT_RESET_MASK); isp_write_register_16(ISP_REG_MODE, 0); // Основная инициализация isp_write_register_16(ISP_REG_OTG_CONTROL_CLEAR, 0xFFFF); isp_write_register_16(ISP_REG_OTG_CONTROL_SET, ISP_OTGC_HC2_DISABLE_MASK | ISP_OTGC_SOFT_SELECT_HC_DC_MASK | ISP_OTGC_OTG_DISABLE_MASK); isp_write_register_16(ISP_REG_TEST_MODE, ISP_TSTM_FORCE_FULL_SPEED_MASK); isp_write_register_16(ISP_REG_DMA_ENDPOINT, USB_DEFAULT_INDEX); isp_write_register_16(ISP_REG_INTERRUPT_CONFIGURATION, ISP_INTC_ACTIVE_HIGH_INTERRUPT_MASK | ISP_INTC_PULSED_INTERRUPT_MASK); isp_write_register_16(ISP_REG_INTERRUPT_PULSE_WIDTH, 0x0F); // 0.5 мкс isp_write_register_32(ISP_REG_INTERRUPT_ENABLE, ISP_INTE_VBUS_MASK); g_state = USB_STATE_NOT_ATTACHED; // Включаем прерывания GICR_INT0 = 1; isp_write_register_16(ISP_REG_MODE, ISP_MODE_GLOBAL_INTERRUPT_ENABLE_MASK); hw |= ISP_HMC_GLOBAL_INTERRUPT_ENABLE_MASK; isp_write_register_16(ISP_REG_HW_MODE_CONTROL, hw); } // Функция для конфигурирования микросхемы в разных режимах. // Режим USB_STATE_POWERED - после прерывания VBUS если VBUSSTAT == 1 // Режим USB_STATE_DEFAULT - после прерывания BUS RESET // Режим USB_STATE_NOT_ATTACHED - после прерывания VBUS если VBUSSTAT == 0 static void configure(void) { uint16_t tmp; switch (g_state) { case USB_STATE_NOT_ATTACHED: isp_write_register_16(ISP_REG_MODE, ISP_MODE_GLOBAL_INTERRUPT_ENABLE_MASK); isp_write_register_32(ISP_REG_INTERRUPT_ENABLE, ISP_INTE_VBUS_MASK); isp_write_register_16(ISP_REG_ADDRESS, 0); isp_write_register_16(ISP_REG_OTG_CONTROL_CLEAR, ISP_OTGC_DP_PULLUP_MASK); break; case USB_STATE_POWERED: isp_write_register_16(ISP_REG_MODE, ISP_MODE_CLOCK_ALWAYS_ON_MASK | ISP_MODE_GLOBAL_INTERRUPT_ENABLE_MASK); isp_write_register_32(ISP_REG_INTERRUPT_ENABLE, ISP_INTE_VBUS_MASK | ISP_INTE_BUS_RESET_MASK); isp_write_register_16(ISP_REG_ADDRESS, ISP_ADDR_DEVICE_ENABLE_MASK); isp_write_register_16(ISP_REG_OTG_CONTROL_SET, ISP_OTGC_DP_PULLUP_MASK); break; case USB_STATE_POWERED: isp_write_register_16(ISP_REG_MODE, ISP_MODE_GLOBAL_INTERRUPT_ENABLE_MASK | ISP_MODE_CLOCK_ALWAYS_ON_MASK); isp_read_register_16(ISP_REG_INTERRUPT_CONFIGURATION, &tmp); isp_write_register_16(ISP_REG_INTERRUPT_CONFIGURATION, tmp | (1 << ISP_INTC_DATA_DEBUG_MODE_OUT_POS) | (1 << ISP_INTC_DATA_DEBUG_MODE_IN_POS) | (1 << ISP_INTC_CONTROL_0_DEBUG_MODE_POS)); isp_write_register_32(ISP_REG_INTERRUPT_ENABLE, ISP_INTE_VBUS_MASK | ISP_INTE_BUS_RESET_MASK | ISP_INTE_SETUP_TOKEN_MASK | ISP_INTE_ENDPOINT0_RECEIVE_MASK | ISP_INTE_ENDPOINT0_TRANSMIT_MASK); break; } }
  3. ISP1763A

    Оказалось, что на пин VBUS нужно подавать не 3.3, а 5 вольт. Иначе все время читается 0 в VBUSSTAT и поскольку подключение не обнаруживается, то и BUS RESET не приходит и прочее и прочее. Завтра напишу более менее корректную инициализацию этой микросхемы.
  4. ISP1763A

    Делаю так: uint16_t tmp; uint32_t id; GICR_INT0 = 0; MCUCR |= (1 << ISC01) | (1 << ISC00); // Сброс микросхемы PORTD_Bit4 = 0; __delay_cycles((unsigned long) (FREQUENCY * 1.1E-2)); PORTD_Bit4 = 1; isp_write_register_32(ISP_REG_CHIP_ID, &id); __delay_cycles((unsigned long) (FREQUENCY * 1.1E-2)); // Инициализация интерфейса tmp = ISP_HMC_EDGE_TRIGGERED_INTERRUPT_MASK | ISP_HMC_ACTIVE_HIGH_INTERRUPT_MASK | ISP_HMC_ACTIVE_HIGH_DREQ_MASK | ISP_HMC_ACTIVE_HIGH_DACK_MASK | ISP_HMC_COMMON_DMA_MASK | ISP_HMC_COMMON_INT_MASK | ISP_HMC_DEVICE_DMA_MASK; isp_write_register_16(ISP_REG_HW_MODE_CONTROL, tmp); tmp |= ISP_HMC_INTERFACE_LOCK_MASK; isp_write_register_16(ISP_REG_HW_MODE_CONTROL, tmp); isp_write_register_16(ISP_REG_UNLOCK_DEVICE, ISP_UNLOCK_DEVICE_CODE); isp_write_register_16(ISP_REG_MODE, ISP_MODE_SOFT_RESET_MASK); isp_write_register_16(ISP_REG_MODE, 0); // Основная инициализация isp_write_register_16(ISP_REG_OTG_CONTROL_CLEAR, 0xFFFF); isp_write_register_16(ISP_REG_OTG_CONTROL_SET, ISP_OTGC_HC2_DISABLE_MASK | ISP_OTGC_DP_PULLUP_MASK | ISP_OTGC_SOFT_SELECT_HC_DC_MASK); isp_write_register_16(ISP_REG_INTERRUPT_CONFIGURATION, ISP_INTC_ACTIVE_HIGH_INTERRUPT_MASK | ISP_INTC_PULSED_INTERRUPT_MASK | (1 << ISP_INTC_DATA_DEBUG_MODE_OUT_POS) | (1 << ISP_INTC_DATA_DEBUG_MODE_IN_POS) | (1 << ISP_INTC_CONTROL_0_DEBUG_MODE_POS)); isp_write_register_16(ISP_REG_INTERRUPT_PULSE_WIDTH, 0x0F); isp_write_register_32(ISP_REG_INTERRUPT_ENABLE, ISP_INTE_BUS_RESET_MASK | ISP_INTE_HIGH_SPEED_MASK | ISP_INTE_VBUS_MASK); isp_write_register_16(ISP_REG_ADDRESS, ISP_ADDR_DEVICE_ENABLE_MASK); // Включение прерывания GICR_INT0 = 1; isp_write_register_16(ISP_REG_MODE, ISP_MODE_CLOCK_ALWAYS_ON_MASK | ISP_MODE_GLOBAL_INTERRUPT_ENABLE_MASK | ISP_MODE_CLOCK_ALWAYS_ON_MASK); isp_read_register_16(ISP_REG_HW_MODE_CONTROL, &tmp); tmp |= ISP_HMC_GLOBAL_INTERRUPT_ENABLE_MASK; isp_write_register_16(ISP_REG_HW_MODE_CONTROL, tmp); Но бит VBUSSTAT в регистре MODE не работает. То есть, что есть на пине VBUS напряжение, что нет - ничего не меняется. Ставил бит OTG_DISABLE как сказано в даташите, но VBUS по прежнему не детектируется. Плюс ко всему энумерация не начинается, если OTG_DISABLE установлен. Знающие люди, подскажите пожалуйста правильную последовательность инициализации периферийного контроллера.
  5. А каким образом можно в maxII обновлять прошивку? Есть JBC player, то он очень требовательный к ресурсам, на AVR не пойдет.
  6. Помогите с HDLC

    Спасибо за ответ. Использую PEF2256, там три канала HDLC. Была мысль, соответствующая первому варианту. В принципе это можно реализовать, хотя и придется делать бит-стаффинг тоже на уровне ПК. Поскольку с HDLC раньше не работал, боюсь подводных камней. Поэтому решил поручить это дело фалку, а в него передавать сами данные. В итоге пока сделал так: в дсп сделал буферы для HDLC, такие чтобы при максимальной разнице скоростей записи в буфер и считывания можно было передать один пакет на 8к. Если буфер переполнился, то удаляем из буфера переполнивший буфер пакет, либо если он занимает весь буфер, то останавливаем передачу и очищаем буфер.
  7. Помогите с HDLC

    Знающие люди, подскажите, пожалуйста, по HDLC. Ситуация такая. Устройство работает по USB, два FALCа на борту. Работаю с E1. Наш драйвер поддерживает всего один поток Bulk, по нему и нужно организовать всю передачу данных. Все бы хорошо, если бы все передаваемые данные были бы синхронные - отсчеты голосовых каналов. Но к этим данным добавляются HDLC, скорость передачи которых отличается от скорости передачи голосовых данных. Чтобы быть точным, она может быть равна этой скорости (для E1 это 8 кГц), либо быть меньшей (поскольку фреймер добавляет сам контрольную сумму и делает битстаффинг). Данные нужно подсовывать фреймеру непрерывно иначе он оборвет передачу. Есть идея рассмотреть ситуацию как коммутацию двух разноскоростных каналов. В случае переполнения буфера просто забить на потерявшиеся пакеты. Но в HDLC кажется нет органичения по размеру кадра, я не знаю какой буфер делать, чтобы гарантированно уметь передавать самый большой пакет. Либо если есть возможность фрагментировать пакеты, то может просто их еще в компе разделять допустим на 1кбайтные части. Это решение вообще корректно? Или может есть более рациональные решения?
  8. falc56

    По поводу буфера HDLC подскажите, пожалуйста, не совсем понятно. Написано в даташите, что доступ к фифо может быть как 8и, так и 16и битный. На схеме битность шины выбирается раз и навсегда. Каким же образом передавать по HDLC нечетное количество байт? Или таких случаев не бывает?
  9. Тему можно закрывать. Разобрался. Выводы: 1. Прежде чем паниковать, проверь софт хоста. 2. Если не уверен, не передавай в функции указатели на локальные массивы. 3. Не доверяй софту, сделанному на коленке. Тупо асинхронная операция не завершилась, а локальный массив уже был уничтожен и заполнен другими данными в стеке.
  10. Проверил на другой плате - все повторяется. Что примечательно. Я думал это происходит перманентно. Но! Посылаю 256 байт несколько раз. Время от времени присылаются верные посылки. Может прийти первые 128 байт правильными, может только первые 64 байта, может вообще вся посылка быть верной. Есть мысли куда копать? Грешу на глючность isp1583
  11. И опять вопрос про isp1583. Возникла необходимость принимать по Control Pipe данные длиной более 64 байт, т.е. состоящие более чем из одного пакета данных. Проблема в том, что первый пакет принимается правильно, а в остальных находится мусор. Посылаю убывающую последовательность 0xFF ... 0x00 из 256 байт, умещается в 4 пакета по 64 байта. Алгоритм как описан в Programming Guide: приходит setup token, обрабатываем, устанавливаем DSEN указывая на стадию данных, ждем прерывания EP0RX, в прерывании получаем размер буфера, считываем указанное количество байт, выходим из прерывания и так все пакеты, в конце подтверждаем передачу. Контрольные точки как указано в мануале никак не инициализирую. Подскажите, пожалуйста, в чем может быть загвоздка? Приходят такие данные:
  12. ищу работу

    ищу работу о себе: студент МИФИ, 5й курс, факультет Автоматики и электроники навыки: - работа с микроконтроллерами семейства AVR и PIC, умение программировать под них на языках Assembler (если нужно, научись и на С) - знание языков программирования: Assembler, C, C++ - знание программ: P-CAD, OrCAD - небольшой опыт программирования ПЛИС Xilinx - знание разговорного и технического английского опыта работы по специальности, к сожалению, не имею.. Олег [email protected]
×
×
  • Создать...