Миландр

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

Часовой пояс: UTC + 3 часа




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

Зарегистрирован: 2018-янв-19 07:44
Сообщения: 39
Использую демо-плату 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
Сообщения: 1155
Откуда: Тула
оффтоп: для 1986ВЕ3 максимальная тактовая 80 МГц (вероятно из-за опасности перегрева).
Вложение:
Комментарий к файлу: Предельно-допустимые характеристики микросхемы
2018-05-17_12-39-30.png
2018-05-17_12-39-30.png [ 32.43 КБ | Просмотров: 259 ]

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


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

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

Это к чему?


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

Зарегистрирован: 2018-янв-19 07:44
Сообщения: 39
Я вот смотрю на ассемблерный код и понять не могу - почему когда я пишу в регистр напрямую, записывается 32-битное слово:
Вложение:
Комментарий к файлу: Запись в регистр напрямую
_reg.png
_reg.png [ 22.73 КБ | Просмотров: 254 ]

а в функции PORT_Init та же команда делается за четыре раза побайтно:
Вложение:
Комментарий к файлу: PORT_Init из SPL
_spl.png
_spl.png [ 25.67 КБ | Просмотров: 254 ]

Как-то странно это.
-----------------------------------------------------------
Посмотрел как делается в старом проекте, а там PORT_Init делает правильно! Вот так:
Вложение:
Комментарий к файлу: PORT_Init в старом проекте.
_spl_old.png
_spl_old.png [ 24.72 КБ | Просмотров: 254 ]

Вот это да! Кажется нащупал, надо понять как лечить.


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

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


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

Часовой пояс: UTC + 3 часа


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

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


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

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB