Внешний порт/GPIO PxD и PxA/Внешняя память

Анисимов Александр
Сообщения: 60
Зарегистрирован: 2019-апр-23 17:27
Организация: НИЯУ МИФИ
Откуда: НИЯУ МИФИ

Внешний порт/GPIO PxD и PxA/Внешняя память

Сообщение Анисимов Александр » 2019-май-20 17:11

Приветствую.
Нужен совет или вектор-направления куда копать.

Кратко о проблеме:
На плате (отладочкая плата TСКЯ 466963.021 вер 2.3 для процессора 1967вн034) подключены 16 тактовых кнопок к порту D. Также это порт данных для внешней шины, к который можно подцепить SDRAM.
Я написал драйвер этой мини-клавиатуры. Всё бы хорошо, но ничего не работает. Халовская функция

Код: Выделить всё

HAL_GPIO_Px_ReadPins(GPIO_PxPort_D, GPIO_PIN_0);
возвращает всегда ноль.

Подробно о проблеме
Кнопки развязаны через микросхемы DD5 и DD4 (первый скрин. Это чипы SN74LVC245A). Эти микросхемы просто сигнал с одного порта перебрасывают на другой порт. У них есть сигнал управления включением и выключением порта выхода (именно этот порт дальше идет к GPIO пинам процессора). На скрине управляющий сигнал называется _CS_KEYS. Этот сигнал, судя по схеме, генерируется микросхемой DD16(2ой скрин. Это LVC138A. Гугл говорит, что это 3-Line to 8-Line Decoders Demultiplexers). Не совсем понял зачем это тут.
Но суть такая, что сигнал _CS_KEYS после включения платы был не того уровня.
Чтобы DD5 и DD4 пропускали сигнал от кнопок надо, чтобы _CS_KEYS был логическим нулем, а он был единицей.
Вследстие чего на пин процессора не приходило изменение сигнала от кнопок. Я подумал, что именно поэтому хал-функция возвращает всегда ноль и выпаял DD16, которая генерировала сигнал _CS_KEYS.

Теперь пин процессора стал чувствовать изменения состояния кнопок. Проверил мультиметром.
Но хал функция по - прежнему всегда возвращает ноль на всё порте D. Что я делаю не так?

Порт по дефолта затактирован после включения проца.
проинициализировал его с помощью

Код: Выделить всё

HAL_GPIO_PxD_Init()
.


В даташите вроде читал, что внешний порт после включения проца по дефолту работает как порт общего назначения.
То есть я не использую контроллер sdram и саму dram, которая тоже есть на плате.
Также про включать pll к внешней шине. Всё равно не работает.
Вложения
2.PNG
2.PNG (21.47 КБ) 1188 просмотров
1.PNG
1.PNG (29.11 КБ) 1188 просмотров

BY_man
Сообщения: 199
Зарегистрирован: 2014-авг-15 11:04
Организация: Миландр
Откуда: Миландр

Re: Внешний порт/GPIO PxD и PxA/Внешняя память

Сообщение BY_man » 2019-май-20 17:32

Есть ли у вас документ со списком багов ВН34?
Потому что описанные вами проблемы рассматриваются в самом начале этого документа.
Там же приведены и возможные решения.

Анисимов Александр
Сообщения: 60
Зарегистрирован: 2019-апр-23 17:27
Организация: НИЯУ МИФИ
Откуда: НИЯУ МИФИ

Re: Внешний порт/GPIO PxD и PxA/Внешняя память

Сообщение Анисимов Александр » 2019-май-20 18:31

BY_man писал(а):Есть ли у вас документ со списком багов ВН34?
Ого. А где можно взять такой док?

BY_man
Сообщения: 199
Зарегистрирован: 2014-авг-15 11:04
Организация: Миландр
Откуда: Миландр

Re: Внешний порт/GPIO PxD и PxA/Внешняя память

Сообщение BY_man » 2019-май-22 08:46

Анисимов Александр писал(а):
BY_man писал(а):Есть ли у вас документ со списком багов ВН34?
Ого. А где можно взять такой док?
я выслал вам свой вариант описания затронутых вами багов в приборе.,
Зря вы выпаяли микросхему DD16. У вас получается, что сейчас приемопередатчики всегда включены
и уже невозможно будет использовать память.

16 контактов можно было читать по адресу 0х38000000 ( если включить поддержку внешней памяти).
Сейчас же вам уже придется использовать порты как GPIO, стараться не активировать микросхемы памяти,
т.к. будет конфликт. В такой конфигурации 16 кнопок порта D можно прочитать так
pd_in = *((int *) 0x08000000); т.е. фиктивное чтение внешней памяти по адресу 0x08000000.

Анисимов Александр
Сообщения: 60
Зарегистрирован: 2019-апр-23 17:27
Организация: НИЯУ МИФИ
Откуда: НИЯУ МИФИ

Re: Внешний порт/GPIO PxD и PxA/Внешняя память

Сообщение Анисимов Александр » 2019-май-22 16:00

BY_man писал(а): Зря вы выпаяли микросхему DD16. У вас получается, что сейчас приемопередатчики всегда включены
и уже невозможно будет использовать память.
Микросхему верну обратно, спасибо.
На плате две памяти: DD3 и DD4. (скрин 1). Кнопки подключены к линияю data0-data15, то есть в параллель с DD3.
Верно ли я понимаю, что при таком случае мне надо включить внешню память и сконфигурировать порт D в 16-битный режим только на линии data16-data31, то есть чтобы работало только DD4?
Но как при таком подходе я смогу читать состояния кнопок я не совсем понял.
Не могли бы прояснить?

И адрес 0х38000000 - это же было бы начало банка-1 sRam. Но на плате стоит sDram, то есть по адрессу 0х38000000 вообще ничего нет, если я верно понимаю? sDram начинается с 0х40000000
(возможно нубский вопрос)
Вложения
1.PNG

BY_man
Сообщения: 199
Зарегистрирован: 2014-авг-15 11:04
Организация: Миландр
Откуда: Миландр

Re: Внешний порт/GPIO PxD и PxA/Внешняя память

Сообщение BY_man » 2019-май-22 17:40

Судя по рисунку , у вас SDRAM с шиной разрядностью 32 бита.
Поэтому вы должны конфигурировать внешний интерфейс в 32-разрядном режиме.
Кнопки, которые подключены к nMS1 (банк SRAM 0х3800_0000)
для процессора видны как память . Только информация у вас будет в младших 16-ти
разрядах. В старших будет мусор при чтении.
У меня на плате была 16-разрядная SDRAM + NAND. Поэтому мои настройки внешнего
интерфейса (функция setup_bus16_NAND) вам не подойдут.

Анисимов Александр
Сообщения: 60
Зарегистрирован: 2019-апр-23 17:27
Организация: НИЯУ МИФИ
Откуда: НИЯУ МИФИ

Re: Внешний порт/GPIO PxD и PxA/Внешняя память

Сообщение Анисимов Александр » 2019-май-23 14:11

BY_man писал(а): Судя по рисунку , у вас SDRAM с шиной разрядностью 32 бита.
Нет, у меня на плате Две микросхемы SDRAM MT48LC16M16A2 (4Meg x 16 x 4 banks). Это как раз те DD3 и DD4.
Они обе 16-ти разрядные.
Шина адресса у них одна. А данные для DD3 - это data0-data15(к этим же пинам к процу подключены 16 кнопок), А для DD4 - это data16-data31(на эти контакты помимо самой SDRAM заведена ещё и NAND. Её в скринах нет).
Выбирается та или иная микросхема ОЗУ с помощью пинов контроллера sdram. А именно пинов: MSSD3-0. То есть, как я понял, если бы на плате было бы 4 микросхемы, то с помощью этих пинов они бы соответствовали бакнкам памяти SDRAM, которые есть внутри проца.

Я полагаю, что платы у нас одинаковые.
Я не использую пока что NAND.

Исходя из того, что у меня две ОЗУ на плате, одна из которых в параллель с кнопками (то есть мешает работе кнопок), то мне надо сконфигурить только одну микросхему ОЗУ. То есть ту, что заведена на data16-data31. То есть сконфигурить только эти пины проца в качестве альтернативной функции SRDAM.

BY_man писал(а): Поэтому вы должны конфигурировать внешний интерфейс в 32-разрядном режиме.
Кнопки, которые подключены к nMS1 (банк SRAM 0х3800_0000) для процессора видны как память .
Не понимаю, откуда взялся адрес 0х3800_0000. Это адрес банка SRAM памяти. Но у меня нет вообще внешней SRAM памяти. У меня только две 16 битных SDRam. Соответственно адреса у них другие. В скрине привожу карту памяти проца.
банк ДРАМ начинается с 0х4000_0000. В ldf-файле 32Мегабайта этого участока памяти разметил, как "внешняя память", ибо микросхема имеет всего 32 мега памяти.

Получается, что если я скионфигурирую только data16-data31(то есть только старшие 16 бит), то контроллер памяти будет общаться только с DD4. А если в SYSCON выставить 19 бит, то как написано в даташите "шина будет как бы 32 битная, но контроллер SDRAM всё равно будет делать два цикла, что бы записать слово через пины data16-data31.
---------
Или я что-то не так понимаю?
И да, я всё равно не понял как в этих условиях мне считать состояния кнопок через контроллер SDRAM.
Откуда взять этот фиктивный адрес, который надо прочесть?
Вложения
1.PNG
1.PNG (43.51 КБ) 1075 просмотров

Анисимов Александр
Сообщения: 60
Зарегистрирован: 2019-апр-23 17:27
Организация: НИЯУ МИФИ
Откуда: НИЯУ МИФИ

Re: Внешний порт/GPIO PxD и PxA/Внешняя память

Сообщение Анисимов Александр » 2019-май-23 14:34

BY_man писал(а): У меня на плате была 16-разрядная SDRAM + NAND.
Получается, что ,чтобы у меня работало только DD4 (она не мешает кнопкам), то мне надо скнофигурить шину на 16 старших бит.
А при чтенении кнопок получается надо переконфигурить шину на 32 бита и читать любой SDRAM адрес, но использовать только 16 первых бит?
Так?

Ха, но получается, что если я захочу ещё и NAND заиспользовать, то придётся отказаться от кнопок.
Ибо только надо будет использовать DD3, а не DD4.
А вместо памяти DD4 использовать NAND

BY_man
Сообщения: 199
Зарегистрирован: 2014-авг-15 11:04
Организация: Миландр
Откуда: Миландр

Re: Внешний порт/GPIO PxD и PxA/Внешняя память

Сообщение BY_man » 2019-май-23 14:38

На плате по адресу 0х3800_0000 подключено 16 кнопок.
Вы их и прочитаете если сделаете чтение внешней памяти по адресу 0х3800_0000.
По любому адресу банка MS1.

2 микросхемы СДРАМ подключены к разным половинам 32-разрядной шины.
Вы не можете использовать только ту микросхему которая подключена к 16-31.
Это не будет работать. Можно работать только с 16-разрядной шиной (тогда используются
разряды 0-15), либо с 32-разрядной (тогда используются разряды 0-31).

Если у вас на плате еще и НАНД, то одновременно с 32-разрядной шиной СДРАМ её использовать нельзя.
Только 16-разрядная. Но тогда CS старшей части СДРАМ должен быть в постоянной отключке.
На плате есть перемычки. Например, nMSSD и nMSSD_H это один и тот же сигнал выборки
на две микросхемы СДРАМ, но соединенный через перемычку. Отрубаете перемычку -
память 16-разрядная (можно использовать НАНД). Соединяете перемычку -
СДРАМ 32-разрядная и НАНД нельзя использовать.
Посмотрите в каком состоянии на вашей плате эти перемычки.
Последний раз редактировалось BY_man 2019-май-25 19:08, всего редактировалось 2 раза.

BY_man
Сообщения: 199
Зарегистрирован: 2014-авг-15 11:04
Организация: Миландр
Откуда: Миландр

Re: Внешний порт/GPIO PxD и PxA/Внешняя память

Сообщение BY_man » 2019-май-23 14:53

Анисимов Александр писал(а):
BY_man писал(а): У меня на плате была 16-разрядная SDRAM + NAND.
Получается, что ,чтобы у меня работало только DD4 (она не мешает кнопкам)
наличие множества устройств на одной шине не означает конфликта.
Вы не в состоянии будете сделать такой конфликт - процессор не даст.
Даже если вы запустите в одной линии команд чтение СДРАМ и чтение кнопок (такое вполне возможно),
j0 = 0x40000000;;
xr0 = [j0+0]; xr1 = [k31+0x38000000];;
то процессор прочитает всё это по очереди.
Сначала в xr0 прочитается СДРАМ *(адрес 0х40000000), а затем в xr1 кнопки.

PS. Всё, написанное мной верно если вы припаяете обратно микросхему DD16.
Если же не припаяете, то верны уже будут ваши утверждения. Если премопередатчики ,
через которые подключены к шине контакты, постоянно активны, то никто уже на эти разряды шины
не должен вылезать. Сгорит :)
Последний раз редактировалось BY_man 2019-май-23 16:52, всего редактировалось 1 раз.

Анисимов Александр
Сообщения: 60
Зарегистрирован: 2019-апр-23 17:27
Организация: НИЯУ МИФИ
Откуда: НИЯУ МИФИ

Re: Внешний порт/GPIO PxD и PxA/Внешняя память

Сообщение Анисимов Александр » 2019-май-23 15:26

BY_man писал(а): Вот вы их и прочитаете если сделаете чтение по адресу 0х3800_0000.
По любому адресу банка MS1.
Вроде у меня всё проясняется.. :)
Осталось последнее.. как Вы поняли, что кнопки подключены к MS1 и читать можно любой его адрес?

BY_man
Сообщения: 199
Зарегистрирован: 2014-авг-15 11:04
Организация: Миландр
Откуда: Миландр

Re: Внешний порт/GPIO PxD и PxA/Внешняя память

Сообщение BY_man » 2019-май-23 16:42

Анисимов Александр писал(а):
BY_man писал(а): Вот вы их и прочитаете если сделаете чтение по адресу 0х3800_0000.
По любому адресу банка MS1.
Вроде у меня всё проясняется.. :)
Осталось последнее.. как Вы поняли, что кнопки подключены к MS1 и читать можно любой его адрес?
DD16, которую вы выпаяли , работает так
CS_KEYS = A0 or A1 or nMS1 or nRD;
Активный 0 на CS_KEYS открывает приемопередатчики , к которым подключены кнопки.
Итого, чтобы прочитать кнопки, нужна команда чтения внешней памяти (nRD==0), области 0х3800_0000 (nMS1==0)
и при этом адрес должен быть такой чтобы младшие два бита(А0 и А1) были равны нулю.

Анисимов Александр
Сообщения: 60
Зарегистрирован: 2019-апр-23 17:27
Организация: НИЯУ МИФИ
Откуда: НИЯУ МИФИ

Re: Внешний порт/GPIO PxD и PxA/Внешняя память

Сообщение Анисимов Александр » 2019-май-25 22:47

BY_man писал(а): DD16, которую вы выпаяли , работает так
CS_KEYS = A0 or A1 or nMS1 or nRD;
Активный 0 на CS_KEYS открывает приемопередатчики , к которым подключены кнопки.
Итого, чтобы прочитать кнопки, нужна команда чтения внешней памяти (nRD==0), области 0х3800_0000 (nMS1==0)
и при этом адрес должен быть такой чтобы младшие два бита(А0 и А1) были равны нулю.
Да, понял.
По даташиту на DD16(впаял её обратно) CS_KEYS может быть нулём только в одном случае. (таблица в скрине).
Чтобы nMS1 было ноль надо читать из первого банка SRAM. (при чтении контроллер срам выставит в ноль и nRD).
А чтобы было нулём А0 и А1 надо задать определённый адрес на порт А. (заскринил схему. DD12 13 14 15 - это такие же микросхемы, как DD16).
Исходя из схемы подсчитал, что нужно считывать с адреса 0x383F9E79.
Младшие 22 бита этого числа выставятся в порт А и теоретически передатчик кнопок "откроется".
В общем сделал так, но пока ничего не заработало.


UPD:
заработали кнопки!!!!!!!!!!!!!!!!
Не учёл, что там рядом с DD12-15 стоят инверторы DD6-11.
В итоге адрес, который надо читать - 0x383FFFFF
Вложения
1.PNG
2.PNG
2.PNG (11.38 КБ) 1008 просмотров

BY_man
Сообщения: 199
Зарегистрирован: 2014-авг-15 11:04
Организация: Миландр
Откуда: Миландр

Re: Внешний порт/GPIO PxD и PxA/Внешняя память

Сообщение BY_man » 2019-май-26 20:49

однако дал я маху с А1,А0 :) не обратил внимание , что сигналы эти непонятно откуда.
Адрес не любой, а один единственный :)
Судя по более полной схеме, могут быть особенности с чтением кнопок
в зависимости от разрядности шины данных (19-бит в SYSCON).

Анисимов Александр
Сообщения: 60
Зарегистрирован: 2019-апр-23 17:27
Организация: НИЯУ МИФИ
Откуда: НИЯУ МИФИ

Re: Внешний порт/GPIO PxD и PxA/Внешняя память

Сообщение Анисимов Александр » 2019-май-28 03:31

В общем SDRAM не работает :(

Шина у меня 16-ти битная. Контроллер srdam настроил в соотетствии с даташитом на микросхему памяти. В регистре статуса SYSTAT выставляется 13ый бит в 1. Это говорит о том, что контроллер проинитиализировался и готов к работе с памятью.

Память у меня объёмом 32 мегабайта. В соответствии с этим разметил в ldf-файле область внешней памяти в 32 мега. В эту область помещаю видеобуфер. И в момент инициализации дисплея заполняю чем-то этот буфер. Судя по дебагеру иногда заполняется, иногда нет.

Далее ещё проявляются следующие артефакты. Проц иногда зависает полность и генерирует прерывание intHW. То есть аппаратная ошибка.
В этом прерывании я решил считать регистр статуса SYSTAT, чтобы понять что вызывает эти прерывания. В этом регистре установлены биты 18 и 19. То есть, судя по даташиту на проц, это "Доступ к отключенной SDRAM." или "Обращение к несуществующему адресному пространству."

Не могу понять с чем это может быть связано.

p.s.
Сейчас я ради теста вообще из кода убрал что-либо связанно с работой внешней SDRAM.
Но данное прерывание всё равно происходит. И, самое интересное, в регистре статуса стоят теже флаги ошибок.

Что это может быть?

Ответить

Вернуться в «32-разрядные процессоры ЦОС (1967ВН028, 1967ВН034)»