Jump to content

    

Intel4004

Участник
  • Content Count

    63
  • Joined

  • Last visited

Community Reputation

0 Обычный

About Intel4004

  • Rank
    Участник
  • Birthday 11/06/1973

Контакты

  • Сайт
    http://www.gstar.ru/
  • ICQ
    4976219

Информация

  • Город
    Наб.Челны
  1. Буду думать. PS. 24 байта (непонятно(0), указатель на свободное место, указатель на heap, указатель на мутекс, непонятно(0), свободное место(0)).
  2. Тогда второй вопрос: а как к этому отнесется Keil RTX ?
  3. Я бы с удовольствием. Но сторонние библиотеки (JSON например) эту кучу пользуют со страшной силой. И компилять из одного комплекта исходников пару десятков разных бинарников? И иметь геморрой с производством, которое все перепутает и будет, как вы говорите, сношать мне мозги что ничего не работает? Лучше я отмучаюсь один раз, написав универсальную прошивку, чем пару раз в неделю заново объяснять что и в каком случае из этого зоопарка надо прошивать.
  4. Этот вариант я знаю. Проблема в том, что конфигурацию платы я могу прочитать только после запуска RTOS.
  5. Поясняю: на плате могут распаять SRAM разного размера, могут вообще не распаивать. Конфигурация платы будет прошита в EEPROMке. В зависимости от конфигурации настраиваю heap (адрес/размер), и в зависимости от размера блокирую некоторые функции программы, чтобы не выжрать весь heap.
  6. Проблема в том, что на этапе компиляции я еще не знаю какие именно микросхемы SRAM будут распаяны на плате. Достаточно ли для этого по новому адресу прописать пустую HEAP-структуру, и подменить указатель на heap по адресу __user_libspace()+8 ? Или ссылки на heap еще где-то присутствуют?
  7. USBD. Битые пакеты...

    Я же UDP отлаживал, соответственно у меня открыто окно с регистрами UDP (Peripherals->System Viewer->UDP). И галочка "periodic update" стоит. Вот он и портил FIFO. Достаточно убрать галочку или закрыть окошко с регистрами - все нормально.
  8. USBD. Битые пакеты...

    Такого в моей практике еще не было. Больше недели трахался с абсолютно рабочим исходником. Кстати, как оказалось бит DTGLE вполне можно использовать для определения какой банк сбрасывать (RX_DATA_BK0 или RX_DATA_BK1). status = UDP->UDP_CSR[ep_num]; ... if ((status & (UDP_CSR_RX_DATA_BK0 | UDP_CSR_RX_DATA_BK1)) != (UDP_CSR_RX_DATA_BK0 | UDP_CSR_RX_DATA_BK1)) status &= UDP_CSR_RX_DATA_BK0 | UDP_CSR_RX_DATA_BK1; else { if (status & UDP_CSR_DTGLE) status = UDP_CSR_RX_DATA_BK1; else status = UDP_CSR_RX_DATA_BK0; } UDP_CSR_CLEAR(ep_num, status); Интересно, почему во всех фреймворках используют не DTGLE, а программный флаг, полностью эмулирующий поведение DTGLE? Кстати, кейловский CMSIS MSC оказался не таким тормозным как я ожидал. С SD-флешкой 600Kb/s на запись, 750Kb/s на чтение.
  9. USBD. Битые пакеты...

    МамаМиа! Деру себя за волосы! Выдернул JLink, ребутнул железяку. ОНО РАБОТАЕТ!!! Поехал водку пить...
  10. USBD. Битые пакеты...

    Собрал по быстрому MSC пример в Atmel Studio. Оказалось достаточно просто... Он работает! С теми-же настройками PMC, на тех-же частотах. Железо в порядке. Прошелся по обоим проектам от начала и до прихода первого SETUP пакета. Ничем не отличаются (я на ASF и поглядывал, когда писал). Те-же самые записи, в те-же регистры, в том-же порядке. У них работает, у меня пакет регулярно приходит битым. Поставил брейкпоинт в обоих проектах на прерывание SETUP(когда все уже давно отконфигурировано) и сравнил настройки кеша, EFC, PMC. Привел в соответствие, теперь они идентичны. У прерывания UDP - самый высокий приоритет, но на всякий случай завернул все функции в запретить/восстановить. Даже понатыкал __DMB() где надо и где не надо. Пофигу. Ничего не помогает.
  11. USBD. Битые пакеты...

    А их нет. Когда атмел был еще атмелом - примеры были на каждый чих, как он стал микрочипом - примеры исчезли как класс. Есть Atmel Studio и Atmel Software Framework (ASF), на них можно собрать что-то вроде примера, с минимальным написанием собственного кода - но с ними еще разбираться надо...
  12. USBD. Битые пакеты...

    Пишу CMSIS UDBD драйвер для ATSAM4E. Не могу найти источник глюка. SETUP пакет регулярно приходит с потерей байт. Причем размер пакета (RXBYTECNT в UDP_CSR[0]) правильный, 8 байт, но сам пакет считанный из FIFO сдвинут на один/два байта и дополнен мусором до 8 байт. Например должно прийти: 80 06 00 01 00 00 40 00 приходит: -- 06 00 01 00 00 40 00 dd должно прийти: 00 05 01 00 00 00 00 00 приходит: -- 05 01 00 00 00 00 00 eb должно прийти: 02 01 00 00 84 00 00 00 приходит: -- 01 00 00 84 00 00 00 06 или: -- -- 00 00 84 00 00 00 06 1d Глюк проявляется случайным образом примерно на одном пакете из десяти. Исходник проверил, вылизал и практически уверен, что проблема не в нем. Железяка пока в единственном экземпляре, т.ч. проверить на другой возможности нет. Никто с подобным не сталкивался? В чем может быть источник проблемы? UPD. Причем проблема только с SETUP пакетами. Когда дело доходит до CBW - то OUT транзакции с CBW пакетами проблем не имеют... UPD2. Нет, это я поторопился. bulk транзакции так-же корежатся: INQUIRY H TX 55 53 42 43 d0 1b bc 0d 24 00 00 00 80 00 06 12 00 00 00 24 00 00 00 00 00 00 00 00 00 00 00 D RX 55 53 42 43 d0 1b bc 0d 24 00 00 00 80 00 06 12 00 00 00 24 00 00 00 00 00 00 00 00 00 00 00 D TX 00 80 00 02 1f 00 00 00 4b 65 69 6c 20 20 20 20 44 69 73 6b 20 30 20 20 20 20 20 20 20 20 20 20 31 2e 30 20 H RX 00 80 00 02 1f 00 00 00 4b 65 69 6c 20 20 20 20 44 69 73 6b 20 30 20 20 20 20 20 20 20 20 20 20 31 2e 30 20 D TX 55 53 42 53 d0 1b bc 0d 00 00 00 00 00 H RX 55 53 42 53 d0 1b bc 0d 00 00 00 00 00 READ FORMAT CAPACITIES H TX 55 53 42 43 d0 6b b1 0d fc 00 00 00 80 00 0a 23 00 00 00 00 00 00 00 fc 00 00 00 00 00 00 00 D RX 55 53 42 43 d0 6b b1 0d fc 00 00 00 80 00 0a 23 00 00 00 00 00 00 00 fc 00 00 00 00 00 00 00 D TX -- 00 00 00 08 00 ee 20 00 02 00 02 00 H RX 00 00 00 00 08 00 ee 20 00 02 00 02 00 D TX 55 53 42 53 d0 6b b1 0d f0 00 00 00 00 H RX 55 53 42 53 d0 6b b1 0d f0 00 00 00 00 INQUIRY H TX 55 53 42 43 d0 6b b1 0d ff 00 00 00 80 00 06 12 01 80 00 ff 00 00 00 00 00 00 00 00 00 00 00 D RX -- -- 42 43 d0 6b b1 0d ff 00 00 00 80 00 06 12 01 80 00 ff 00 00 00 00 00 00 00 00 00 00 00 62 f3
  13. ATSAM4E16E PDC не запускается

    Стоило сюда написать, как сразу все заработало. Хреново я из asf-master выдирал, невнимательно. Interface->TWI->TWI_PTCR = TWI_PTCR_RXTDIS | TWI_PTCR_TXTDIS; Interface->TWI->TWI_RNPR = (unsigned int)Buffer; Interface->TWI->TWI_RNCR = Size; Interface->TWI->TWI_PTCR = TWI_PTCR_RXTEN | TWI_PTCR_TXTEN; Interface->TWI->TWI_CR = TWI_CR_START; while ((Interface->TWI->TWI_SR & TWI_SR_ENDRX) == 0); Interface->TWI->TWI_PTCR = TWI_PTCR_RXTDIS | TWI_PTCR_TXTDIS; Interface->TWI->TWI_CR = TWI_CR_STOP; while ((Interface->TWI->TWI_SR & TWI_SR_TXCOMP) == 0);
  14. ATSAM4E16E PDC не запускается

    Не могу понять почему не запускается PDC. В данный момент мучаюсь с TWI, но с остальными модулями(USART, SPI) - такая-же история. Есть рабочий код (выдран из asf-master): if (Size == 1) { TWI0->TWI_CR = TWI_CR_START | TWI_CR_STOP; StopSent = 1; } else { TWI0->TWI_CR = TWI_CR_START; StopSent = 0; } while (Size) { Status = TWI0->TWI_SR; if (Status & TWI_SR_NACK) return Board_Error_Ext(ERROR(ERROR_OBJECT_CPU, ERROR_MODULE_CPU_I2C, 0, ERROR_CODE_READ), TypeCast(Interface, int), Address, Size, 0); if (Size == 1 && !StopSent) { TWI0->TWI_CR = TWI_CR_STOP; StopSent = 1; } if (Status & TWI_SR_RXRDY) { *((unsigned char*)Buffer) = TWI0->TWI_RHR; Buffer = (unsigned char*)Buffer + 1; Size--; } } while (!(TWI0->TWI_SR & TWI_SR_TXCOMP)); TWI0->TWI_SR; С ним все прекрасно. Oн работает. Пытаюсь перевести его на PDC (тоже выдрано из asf-master): TWI0->TWI_PTCR = TWI_PTCR_RXTDIS | TWI_PTCR_TXTDIS; TWI0->TWI_RPR = (unsigned int)Buffer; TWI0->TWI_RCR = Size; TWI0->TWI_PTCR = TWI_PTCR_RXTEN; TWI0->TWI_CR = TWI_CR_START; while ((TWI0->TWI_SR & TWI_SR_ENDRX) == 0); TWI0->TWI_PTCR = TWI_PTCR_RXTDIS; while ((TWI0->TWI_SR & TWI_SR_RXRDY) == 0); TWI0->TWI_CR = TWI_CR_STOP; while ((TWI0->TWI_SR & TWI_SR_TXCOMP) == 0); Вешается на первом же while. ENDRX не взводится, RCR не уменьшается, т.е. PDC даже не начинает работать. С USART и SPI такие-же проблемы, т.е. PDC не работает вообще. В даташите ничего про то, что PDC надо где-то отдельно разрешать не нашел. Нашел регистры MATRIX_MCFG и MATRIX_SCFG, но они не влияют. Перерыл asf-master - там их и не трогают. Голова уже опухла, куда дальше копать - не знаю...