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

esaulenka

Свой
  • Постов

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

  • Посещение

  • Победитель дней

    2

Сообщения, опубликованные esaulenka


  1. zheka, покажите, пожалуйста, где в 158-й строке выложенного diskio.c слово "__inline"

     

    igorenja, Вы не правы. CARM умер, надо искать в документации на RealView'шный компилятор. Я делал подобное через объявление секции кода в ОЗУ и соответствующую прагму (всё есть в документации).

  2. Спасибо за ответы.

    С практикой понятно. Теперь осталось подтянуть теорию :)

     

    Разглядывание даташитов на ATmega, на LPC и спецификации на шину не прояснило, почему нельзя "задерживать" отправку stop.

  3. Предложение первое.

    Прочитать про inline (разве неочевидно, что ругается на него?), заменить на __inline

     

    Предложение второе. Разобраться, что там накручено с дефайнами регистров. За минуту я не понял, где в этом diskio.c подключены определения регистров процессора.

  4. Насколько я понимаю, правильней говорить "перед передачей ACK", т.к. в момент этого ACK SCL должен быть в единице.

     

    Вот только никак не соображу, что надо сделать с регистрами TWI, чтобы такого добиться.

    Махинации с soft-I2C мне не очень нравятся...

  5. Имеем два контроллера - LPC213x и ATmega, сопряжённые по I2C.

     

    LPC - мастер, мега - слейв. Для простоты будем считать, что других устройств на шине нету (могут быть ещё слейвы, но пока - без них).

     

    Протокол обмена:

    мастер отправляет команду

    слейв её обрабатывает, кладёт ответ в буфер

    мастер считывает ответ

     

    Есть мысль на период обработки команды подвешивать шину - прижимать SCL к земле. То, что в этот момент вешается обмен с остальными устройствами, нас не волнует - мастер всё равно ждёт ответ от атмеги.

     

    Вопрос: когда бы это по хорошему сделать?

     

    По приёму последнего байта посылки (состояние TWSR 0x80) я не сбрасываю бит TWINT - нога SCL в нуле.

     

    Проблема в том, что мастер видит, что байт приняли, ACK ответили, и выставляет флаг SI, что всё нормально.

    Дальше также спокойно мы можем отправить стоп (хотя лучше не отправлять, пожалуй).

    Только на старте чтения мастер осознаёт, что что-то пошло не так, и долго выставляет SI на условие передачи старта.

     

    Так вот, вопрос: это нормально для LPC, что он не видит этого "растянутого" обмена?

    В документации сказано, что данный приём можно использовать как для каждого бита, так и после передачи всего байта. Вот интересно, отправленный ACK - это "after complete byte transfer" или нет? :)

  6. должен ли кусок кода, вызывающий функцию IAP, располагаться за пределами стираемого сектора?

     

    Если Вам не важно, что будет делать контроллер после стирания - не должен.

    Стирает-то IAP, он в отдельном секторе лежит. Ну а то, что потом он передаст управление на FF - это мелкий побочный эффект :)

     

    На остальное вроде б ответили.

  7. это из области бреда сумасшедшего

     

    Вы знаете, я б с Вами согласился.

    Только, блин, я видел это собственными глазами!

     

    Зря, наверное, отписался - доказать-то толком не могу, исследований тоже хороших не проводил.

    Постараюсь избавиться от текучки (мечты, эх...) и попробую ещё раз.

    Проверяли, правда, всего на двух процессорах, ревизию уже тоже не скажу...

     

    регистр(ы) исказило прерывание

    Без прерываний, к сожалению, проект работать не хочет, а отдельный тестовый проект собрать руки не дошли.

    Против этой теории (самая очевидная, да) говорит то, что а) падает в одном и том же месте и б) во всех остальных местах не падает.

     

     

    Update: старая тема - вот тут: http://electronix.ru/forum/index.php?showtopic=65449

    Там ещё капелька чудесатости, про которую я уже забыл.

  8. А что в этом коде удивительного? Там реально происходит попытка записи во флэш из-за чего и вылетает дата аборт. Причём тут МАМ?

    Штука вся в том, что адрес в регистре подменяется самостоятельно.

     

    Копирование идёт не по какому-то хитрому указателю, а в локальный буфер, который компилятор в стек кладет (я и строку вызова этой функции привёл).

    Более того, копирование с адресов, отличающегося от "глючного" замечательно проходит.

    Вот MAM я в том случае отключить не догадался...

  9. проблема проявлялась, если код обращался к данным вблизи того места, где этот код лежит.

     

    вот, у меня даже записано

    0x000388F8  E12FFF1C  BX        R12
    0x000388FC  00038901  DD        0x00038901
                     strlen:
    0x00038900  2100      MOV       R1,#0x00
    0x00038902  E000      B         0x00038906
    0x00038904  3101      ADD       R1,#0x01
    0x00038906  1C02      ADD       R2,R0,#0
    0x00038908  3001      ADD       R0,#0x01
    0x0003890A  7812      LDRB      R2,[R2,#0x00]
    0x0003890C  2A00      CMP       R2,#0x00
    0x0003890E  D1F9      BNE       0x00038904
    0x00038910  1C08      ADD       R0,R1,#0
    0x00038912  4770      BX        LR
    
    0x00038914  E59FC000  LDR       R12,[PC]
    0x00038918  E12FFF1C  BX        R12
    0x0003891C  00038921  DD        0x00038921
                     memcpy:
    0x00038920  B430      PUSH      {R4-R5}
    0x00038922  1C03      ADD       R3,R0,#0
    0x00038924  1C18      ADD       R0,R3,#0
    0x00038926  E005      B         0x00038934
    0x00038928  1C0C      ADD       R4,R1,#0
    0x0003892A  7825      LDRB      R5,[R4,#0x00]
    0x0003892C  1C04      ADD       R4,R0,#0
    0x0003892E  7025      STRB      R5,[R4,#0x00]
    0x00038930  3101      ADD       R1,#0x01
    0x00038932  3001      ADD       R0,#0x01
    0x00038934  1C14      ADD       R4,R2,#0
    0x00038936  3A01      SUB       R2,#0x01
    0x00038938  2C00      CMP       R4,#0x00
    0x0003893A  D1F5      BNE       0x00038928
    0x0003893C  1C18      ADD       R0,R3,#0
    0x0003893E  BC30      POP       {R4-R5}
    0x00038940  4770      BX        LR
    
    
    вызов 
    memcpy (0x40002390, 0x00038910, 0x10)
    
    
    ;    data abort:
    R0 = 0x0000008A
    R1 = 0x00038911
    R2 = 0x0000000D
    R3 = 0x40002390
    R4 = 0x0000008A
    R5 = 0x0000001C
    
    R13 (SP) = 0x40002524
    R14 (LR) = 0x00038936
    SPSR =     0x00000030

     

     

    С разнообразными const char array[] = {}, константными строками и т.д. проблем и у меня не возникало.

     

     

    на одной из ревизий

    2138 всех ревизий, 2138/01 одной (из двух) ревизий

     

    Почему сильно позже? Errata появилась быстро.

    Потому что наизусть не помню, а привычки "что-то работает не так? иди читай errata" до сих пор не завёл...

  10. с проблемой сталкивался два раза.

     

    Первый раз, на 2134, кусочек кода, который считал контрольную сумму прошивки побайтным сложением, при определённом расположении в памяти выдавал дата аборт. Лечилось "методом научного тыка", изменением уровня оптимизации - код "уходил" из проблемного места.

     

    Второй раз, на 2138, memcpy (buff, адрес вблизи memcpy, N) стабильно вылетала в аборт. Реализация memcpy тупая, просто побайтное копирование. Вылечил изменением memcpy.

    Я даже писал об этом с год назад, но понял, в чём проблема, сильно позже.

     

    Мнение NXP на этот счёт:

    Under certain conditions when the MAM is fully enabled (Mode 2) code execution from internal Flash can fail. The conditions under which the problem can occur is dependent on the code itself along with its positioning within the Flash memory.

    If the above problem is encountered then Mode 2 should not be used.

  11. Описание проблемы не понял, но...

     

    Попробуйте MAM отключить. На вопрос "зачем" читайте errata.

     

    На 2138 (ревизию не помню) была проблема с побайтным чтением, процессор попадал в data abort. Чтение dword'ами ситуацию исправило.

  12. Спрошу здесь.

    Нельзя ли убрать № пользователя?

    Степень "уважаемости" вполне можно оценить и по дате регистрации, а особо дотошные могут посмотреть таковой номер в ссылке на профиль.

    Хочется форум чуть-чуть ужать по высоте, чтоб побольше влезало...

  13. Есть у нас старые проекты, разработанные N лет назад под старый компилятор CARM.

     

    А у меня есть неуёмное стремление обновиться... :)

     

    Итого, имеем.

    Keil 4.10 с местного ФТП.

    аддон - компилятор CARM с keil.com

     

    Запускаем первый раз - компилируется, запускается, всё хорошо.

    Сохраняем проект, получаем окошко "мы придумали новый формат хранения проектов, сейчас всё сконвертируем". OK.

    Запускаем второй раз - неправильные параметры вызова компилятора; при попытке поменять настройки проекта IDE помирает.

     

    Что б такое сделать?

    Не трогать, раз работает, и вернуть старую версию? (тем более к новым вкладкам я не привык :) )

  14. Идея порочна потому что избыточна. Мезонины уходят в прошлое.

    А куда деваться-то?

    Вот у нас маленький мезонин 6 слоёв (память, процессор, флеш) и здоровая плата (почти с лист А4) с кучей разъёмов и всевозможной рассыпухой - 2 слоя.

    Делать 6 слоёв на всю плату дорого...

    Да и переделывать нижнюю плату приходится раз в полгода (изменения периферии, всевозможные проблемы...). А это выльется в заказ опытной партии многослойки (долго, не дёшево), монтаж BGA...

     

    Хотя, конечно, разъём (SODIMM) нашу техподдержку уже достал, периодически смещается при транспортировке...

  15. Процессоров этих не видел, но проверьте настройки Project - Options - Target и Linker. Там указываются адреса флеша и ОЗУ.

    Во вкладке линкера также стоит проверить файл scatter, если он используется (подробное описание - в хелпе).

    Для простых случаев все адреса указываются только во вкладке target.

     

    Для выяснения, куда деваются 0x04B8 байт, стоит посмотреть файл map (Options - Listing - Linker listing).

  16. Господа, где б почитать

    - про подбор жидкости

    - про подбор мощности

     

    Собственно, проблема: плохо отмыты платы.

    Производство (китайцы) утверждает, что они не могут их мыть в ультразвуке ввиду наличия "big capacitors on the power circuit" (самый габаритный - 4700 мкФ * 6.3 В).

    При этом на наличие на той же плате пары дросселей, десятка микросхем, пьезо-пищалки и проч. они не жалуются.

  17. ISA это хорошо, да. Небыстро, драйвера разобраны в мильёне источников. Одна проблема - в недорогих мат.платах её уже несколько лет как нельзя найти, и в дальнейшем ситуация уж точно не улучшится.

     

    Лучше по PCI что-нибудь насоветуйте :)

  18. Рассматриваем идею устройства на плате mini/micro ITX и нашей плате расширения.

     

    На нашей плате будет 2-3 уарта и 20-25 ног для "дрыганья", требования по скорости обмена - небольшие (уарты на 115200 не будут упираться в межплатный интерфейс - и хорошо). Всё это будет упаковано в один корпус.

     

     

    Собственно, требуются идеи, как это дело соединить в единое целое:

     

    - USB. Самый правильный, пожалуй, вариант: скорости достаточно, широкий выбор компонентов с обеих сторон (на мат.платах выведен всегда, выбор процессора для нашей платы тоже большой). Минус - если одной из операционок будет ДОС (вопрос прорабатывается, но наличие ДОСа со всеми драйверами является плюсом), получаем проблему с написанием стека драйверов.

     

    - UART. Плюсы - стандартно и просто. Минусы - скорость небольшая, да и уартов нам надо много (занимать один жалко).

     

    - софт-SPI. На большинстве плат есть несколько GPIO, на которых можно реализовать SPI. Минусы - решение кривовато, GPIO есть не везде, возможны проблемы со скоростью.

     

    - PCI / PCI-Express. Плюсы - скорость обмена, не очень сложные драйверы. Минусы - я слабо себе представляю аппаратную часть. Какую минимальную ПЛИС нужно использовать?

     

     

    Итак, расскажите, какие грабли меня ждут? ;)

  19. Не работает.

    АЦП умеет мерять только относительно входа VREF. Следовательно, раз напряжение питания плавает, туда нужен источник опорного напряжения.

    Цепь стабилитрон/резистор я не понял. Чаще используется обычный делитель из двух резисторов.

     

    Кто и что тут отключает, также непонятно.

  20. D5 дает посадку напряжения, R7 ограничевает ток в цепи заряда батареи (идея конечно не очень, но лучшего пока не придумал).

    Ага, не очень. Чуть-чуть лучше - завести напряжение на аккумуляторе на АЦП и сигнализировать о конце зарядки. Ещё чуть-чуть лучше - самостоятельно её прекращать. Ещё лучше - соорудить хитрый ограничитель тока и напряжения на регулируемом LDO. Самый правильный вариант (он же - самый дорогой) поискать спец. микросхемы у Maxim и Texas.

     

    Кнопка ВТ1 управляет включено/выключено устройство

    Точно, выключить устройство, если один транзистор выкинуть, не получится. Хотя... Надо б подумать.

     

    хотел так: сдвоеный свето диод красный питание есть, зеленый устр.включено, но как это сделать

    Какое питание? Внешнее? Ну так на внешнее и надо сажать :) Но, так ведь устройство всегда включено, если есть внешнее питание... Вы в итоге-то что хотите, не понимаю...

    Да, для этого гораздо лучше использовать светодиоды с тремя выводами (с общим коллектором или эмиттером), чем двухвыводные (два противовключенных диода).

     

    Посмотрите пожалуста Vbus правилно подключил, вроди у него высокий уровень, активность хоста?

    VBUS - это ВХОД. Сообщает контроллеру, что на шине возможна некоторая активность. Типовая схема включения, если не ошибаюсь, есть в electric manual.

     

    Еще такой вопросик, обычно картридеры которые устанавливают в подобного рода конструкциях имеют 2 микропереключателя, а у меня есть в наличии только с одним. Вопрос: зачем их два?

    Честно говоря, с MicroSD не возился, а в обычных - один контакт наличия карточки, другой - защита от записи. Но на micro рычажка защиты нету...

  21. Поворчать всегда готов ;)

     

    Как-то неочевидно сделано питание от USB (где стабилизатор?)

    Какая-то непонятная схема зарядки батарейки (D5 R7 - это ведь оно?)

    D7 светится всегда. Так задумано?

    Наличие Q2 и Q3 неочевидно. Или я не понимаю идеи, или нужен только один транзистор.

    Схема вокруг JP3 странная. R17 и R29 образуют делитель. Вообще, подумайте, может и не нужна эта "автоматическая" перепрошивка? На наших изделиях пользователь ручками переставляет джампер, включает питание и только потом перешивает...

    Питание VBAT в даташите требуют заводить на кристалл всегда. 2366 при попытке чтения RTC без питания падал в аборт.

    USB. Заведите VBUS, не помешает смотреть, когда к хосту подключились. А вот мегаомные резисторы я не понял. Зачем?

    Джитаг отличается от стандартного. Место критично, что-ли?

     

     

    И ещё. Не надо так экономить место на схеме. Когда питание сверху, земля снизу, а блоки разделяет хоть какое-то свободное пространство, ориентироваться (мне, во всяком случае) проще.

     

    PS демоплаты делают куча производителей. Может, будет проще воспользоваться их услугами? :)

×
×
  • Создать...