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

Непонятки с Vivado, Zynq, AXI IP...

Начинаю осваивать работу с Zync SoC и столкнулся с необьяснимой проблемой.

Создал систему с процессорным ядром и DDR памятью, добавил I2C IP блок на шине AXI.

Коммуникация с внешним I2C устройством работает. Т.е. запускается отладка проекта из Vitis, возможно

посылать данные по I2C шине и получат правильный ответ.

Далее решено добавить AXI DMA блок, чтобы получать данные от внешнего устройства и записывать их в память. DMA не получилось запустить, как ожидалось.

Стал исследовать в чем дело, правильно ли записываются конфигурационные регистры DMA.

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

Т.е., например, имееются два регистра для задания адреса в памяти, куда DMA должен складывать данные. Пишешь туда 32-х разрядные числа, а когда читашь их обратно сохраняетя только младший байт, как записано. Остальные байты нулевые.

Тогда меня заинтересовало, а как же работает I2C блок? Оказалось, что практически все конфигурационные регистры используют только младшие восемь бит. Имеется несколько 32-х разрядных регистров для параметров тайминга, но их тоже невозможно записать, а потом прочитать полность. Но они в моем случае и не задействованы.

 

Решил я посмотреть, что же происходит в синтезированной схеме. И там действительно во входной шине данных и выходной шине часть линий занулено (фрагмент схемы прилагается). Т.е. конфигурационные регистры IP блока в принципе не могут быть записаны и прочитаны, как 32-х значащие числа.

В заключении я создал свой блок с AXI-Lite шиной. Из моего блока регистры пишутся и читаются полностью.

 

Анализ синтезированной схемы схемы DMA блока тоже показывает, что часть разрядов шин данных также зануляется. Оптимизация что ли какая?

 

Кто-то может подсказать почему так происходит и куда копать?

 

 

iic.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть подозрение что у вас axi subsystem неправильно подключен. но увидеть это можно только на полной картинке)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот схема проекта. Все главным образом подключалось через Connection Automation

Сам код выглядит, например, вот так

    XIic_WriteReg(XPAR_IIC_0_BASEADDR, 0x128, 0x12345678);
    u32 reg = XIic_ReadReg(XPAR_IIC_0_BASEADDR, 0x128);

Здесь 0x128 - смещение до 32-битного регистра. Читается только 0x00000078

 

system.PNG

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Pavel_Iя прежде занимался всякими этими вашими программированиями. Вижу — Вы уже не нуб. Можно и подсказать )) Опишу собственный опыт. В подобных случаях, как мне подсказывает практика, искать причину нужно совершенно в другом месте. Отключите «Туннельное зрение» и разберётесь. Обычно причина, зачастую бывает, — тупая очепятка. Да, может и месяцами тормозиться проект, пока она там )) Если не получится — в личку напишите, бесплатно попробую помочь разобраться в ситуации. Сам уже давно в другую сферу перешёл, просто ностальгия долбанула )) Как наркотик, йо-маййоО! ))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 hours ago, Pavel_I said:

Вот схема проекта. Все главным образом подключалось через Connection Automation

хмм, вроде у меня корректно все было в похожей системе. я бы раскрыл параметры/интерефейсы ps7_0_axi_perif и посмотрел что он там наделал на интерфейсах. может он какие свойства наследовал или поставил их не корректно при наборе проекте автоматом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всем спасибо, разобрался.

DMA в итоге запустился. Его регистры все-таки читаются как надо через функции XIic_WriteReg/XIic_ReadReg. С I2C блоком отдельная история, уже не столь интересная.

Думал, что регистры AXI IP блока должны быть доступны через Memory Browser. Но как раз там только младший байт отображается.

Как обычно "сам дурак" )) Надо было глубже вникать прежде, чем просить помощи.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, gosha-z said:

А прерывание почему в воздухе повисло??

До него руки еще не дошли )) Все будет в процессе развития проекта.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

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