Миландр

Ключевым подразделением нашей компании
является Центр Проектирования интегральных микросхем
Текущее время: 2020-дек-05 00:09

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 5 сообщений ] 
Автор Сообщение
СообщениеДобавлено: 2018-май-17 10:35 
Не в сети

Зарегистрирован: 2018-янв-19 07:44
Сообщения: 47
Организация: АО "Равенство"
Использую демо-плату 1986ВЕ3 версии 2. Есть два проекта, старый и новый. В старом контроллеры Ethernet работать не захотели (делал всё руками). В новом использовал SPL и контроллеры Ethernet заработали. В программе используются все светодиоды, восемь в линейке и по два в RJ-45. Новый проект довёл почти до конца и тут вдруг заметил, что светодиоды в разъёмах RJ-45 светиться перестали. Мне это показалось странным, ибо в обоих проектах после сброса есть тест свечения всех светодиодов на пол секунды и код практически один и тот же. Начал разбираться, оказалось, что инициализация портов функцией PORT_Init даёт разное содержимое в регистрах портов в двух проектах. В старом проекте (маленьком) регистры портов пишутся корректно, а в новом проекте (большом) пишется не пойми что. Причём, хотя в новом проекте линейка светодиодов светится так же, содержимое регистров PORTB отличается от старого проекта, просто оно не мешает светиться светодиодам. Пошаговое прохождение кода PORT_Init показало, что значения регистров в переменных tmpreg_XX вычисляются правильно, ошибка возникает именно при выполнении записи этих значений в регистры! Например, в PORTB->PWR вместо 0x5555 оказывается 0x55555555, в PORTE->OE и PORTE->ANALOG вместо 0x420 оказывается 0x2020 и т.д.
Попробовал написать тупой код без использования SPL, где записываю регистры напрямую конкретными значениями и он работает! Отладчик показывает содержимое регистров именно то, что я записывал. Чтобы не напрягать мозг, значения регистров взял из отладчика при запуске старого проекта, в котором функции SPL работали нормально. Вот этот код, он зажигает на 500мс светодиоды демо-платы:
    MDR_PORTB->OE       = 0xFF;
    MDR_PORTB->ANALOG   = 0xFF;
    MDR_PORTB->PWR      = 0x5555;

    MDR_PORTE->OE       = 0x420;
    MDR_PORTE->ANALOG   = 0x420;
    MDR_PORTE->PWR      = 0x100400;

    MDR_PORTI->OE       = 0xC000;
    MDR_PORTI->ANALOG   = 0xC000;
    MDR_PORTI->PWR      = 0x50000000;

    MDR_PORTB->SETTX    = 0xFF;
    MDR_PORTE->SETTX    = 0x420;
    MDR_PORTI->SETTX    = 0xC000;

    time_delay(500);

    MDR_PORTB->CLRTX    = 0xFF;
    MDR_PORTE->CLRTX    = 0x420;
    MDR_PORTI->CLRTX    = 0xC000;
Отличия между новым и старым проектами перед тестом светодиодов есть в функции инициализации частот. Новый проект работает на частоте 128 МГц против 80 МГц у старого. Но сброс частоты до 80 в новом проекте ничего не изменил. Есть ещё отличие в содержимом PER_CLOCK: у нового проетка 0xA400018, а у старого 0x2400010, но это лишь периферия BKP и EEPROM. Приведение к равенству тоже ничего не дало.
В чём может быть дело? Второй день туплю! Мистика какая-то.


Вернуться к началу
СообщениеДобавлено: 2018-май-17 12:41 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1530
Откуда: Тула
оффтоп: для 1986ВЕ3 максимальная тактовая 80 МГц (вероятно из-за опасности перегрева).
Вложение:
Комментарий к файлу: Предельно-допустимые характеристики микросхемы
[ attachment ]
2018-05-17_12-39-30.png [ 32.43 КБ | 1729 просмотров ]

_________________
сочувствующий…


Вернуться к началу
СообщениеДобавлено: 2018-май-17 12:50 
Не в сети

Зарегистрирован: 2018-янв-19 07:44
Сообщения: 47
Организация: АО "Равенство"
prostoRoman писал(а):
оффтоп: для 1986ВЕ3 максимальная тактовая 80 МГц (вероятно из-за опасности перегрева).
Это к чему?


Вернуться к началу
СообщениеДобавлено: 2018-май-17 13:15 
Не в сети

Зарегистрирован: 2018-янв-19 07:44
Сообщения: 47
Организация: АО "Равенство"
Я вот смотрю на ассемблерный код и понять не могу - почему когда я пишу в регистр напрямую, записывается 32-битное слово:
Вложение:
Комментарий к файлу: Запись в регистр напрямую
[ attachment ]
_reg.png [ 22.73 КБ | 1724 просмотра ]
а в функции PORT_Init та же команда делается за четыре раза побайтно:
Вложение:
Комментарий к файлу: PORT_Init из SPL
[ attachment ]
_spl.png [ 25.67 КБ | 1724 просмотра ]
Как-то странно это.
-----------------------------------------------------------
Посмотрел как делается в старом проекте, а там PORT_Init делает правильно! Вот так:
Вложение:
Комментарий к файлу: PORT_Init в старом проекте.
[ attachment ]
_spl_old.png [ 24.72 КБ | 1724 просмотра ]
Вот это да! Кажется нащупал, надо понять как лечить.


Вернуться к началу
СообщениеДобавлено: 2018-май-17 13:40 
Не в сети

Зарегистрирован: 2018-янв-19 07:44
Сообщения: 47
Организация: АО "Равенство"
Нашёл! Подозрение пало на заголовочные файлы, что с ними что-то не так. Так и оказалось!
У меня в MDR32F9Qx_config.h были добавлены свои заголовки, в которых были объявлены макросы для управления светодиодами (в частности) на демо-плате и для другой платы (моей), чтобы проект собирался для разного железа. Мои заголовки были включены ДО строчки с включением файла MDR1986VE3.h. И это оказалось критическим для нового проекта, поскольку новый проект был переделан под SPL. А в старом проекте это не влияло, поскольку там макросы работали через регистры напрямую.
После перестановки включения своих заголовков после MDR1986VE3.h, всё заработало (и код в PORT_Init стал писать регистры 32-битными словами).
Фух! Вопрос исчерпан.


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 5 сообщений ] 

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти: 

Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB