Полная версия этой страницы:
NIOS+I2C
Evired
Dec 23 2010, 06:50
Доброго времени суток!
Вот уже месяц не могу поднять i2c мастер под ниос. Версия квартуса 10.1. Пробовал опенкоровский вариант, не заводится(. Вот такой вот код:
#include <stdio.h>
#include "system.h"
#include "opencores_i2c.h"
int main()
{
printf("Hello from Nios II!\n");
I2C_init(OPENCORES_I2C_0_BASE,ALT_CPU_FREQ,400000);
// now right to the leds
I2C_start(OPENCORES_I2C_0_BASE,0xE0,0);
I2C_write(OPENCORES_I2C_0_BASE,0x0,0);
I2C_write(OPENCORES_I2C_0_BASE,0x51,1);
return 0;
}
Дает ответ NOACK постоянно. То есть не отвечает слейв устройство, хотя его адрес (0xE0) и адрес нужного порта (0x0) я ввожу правильно. Есть у кого-нибудь гарантированно рабочий i2c под nios (т.е. с tcl-скриптом для SOPC) ? А то я уже отчаялся почти... Как можно проверить работоспособность i2c без внешнего устройства? Может какие еще полезные советы? SDA и SCL завожу на двунаправленные пины правильно ли это?
Stewart Little
Dec 23 2010, 07:21
А что Вы с опенкоровским вариантом делали? Распишите Ваши действия подробнее.
Новый компонент на его основе создавали сами или как?
HAL API для него писали?
Evired
Dec 23 2010, 07:31
Я взял портированную для SOPC версию:
http://www.alterawiki.com/wiki/OpenCores_I2c , встроил ее в систему при помощи SOPC билдера и вперед) Все нормально скомпилилось, вот только не работает ) Создание нового компонента прям из сорцев я пока не осилил. Может у Вас есть готовый рабочий компонент или пример? Я был бы очень благодарен.
Stewart Little
Dec 23 2010, 08:47
В какой версии квартуса Вы работаете?
Попадает ли информация об этом устройстве в BSP?
Для завершения создания HAL API устройства нужно в корневой папке (т.е. там, где находится скрипт opencores_i2c_hw.tcl) создать свой скрипт opencores_i2c_sw.tcl, где прописать создание драйвера устройства, добавления его в BSP и инициализации устройства во время работы statup-кода.
См. пример скрипта.
В противном случае Вам придется работать с этим устройством на низком уровне - обращаться его регистрам макросами IOWR/IORD.
Evired
Dec 23 2010, 10:06
- Работаю в версии квартуса 10.1
- Информация в BSP попадает
по поводу скрипта сейчас попробую)
А если не писать этот скрипт а просто добавить инклудом нужные сорцы я же смогу с таким же успехом использовать высокоуровневые функции или я не прав?
Короче я запутался опять. Неужели ни у о кого нет готового решения?
Я использовал I2C опенкоровский. Все работает. Завтра с работы могу дать файлы проекта.
Evired
Dec 31 2010, 09:56
Огромное спасибо) Прям подарок на новый год) как только опробую, отпишусь) Вопрос сразу, как SDA и SCL подключать? Обе к bidirectional пинам или SDA к bidirectional а SCL к output ?
Shtirlits
Dec 31 2010, 12:34
там есть каталог с документацией Docs, и судя по i2c_cpecs.pdf, нужно оба к bidirectional продключать.
Прикрутил предложенный COMA вариант i2c и сделал скрипт как говорил Stewart Little. Все равно не работает =( Выкладываю свой проект и скрипт:
Нажмите для просмотра прикрепленного файлаЕсли есть время и не очень лень, гляньте пожалуйста. Может все и работает на стороне ПЛИС, а проблема в слейв устройстве (это у меня сонар). Последнему нужно 5V TTL уровень а с ПЛИС идет 3,3V LVTTL. Сопряжение по уровням делаю при помощи такого девайса:
http://www.sparkfun.com/products/8745Так что тонких мест много, а возможности проверить на другом девайсе нет. Но я все-таки грешу на ПЛИС... Где-то что-то я упустил в проекте походу.
Serhiy_UA
Jan 4 2011, 03:14
Цитата(Evired @ Jan 3 2011, 15:42)

Так что тонких мест много, а возможности проверить на другом девайсе нет. Но я все-таки грешу на ПЛИС... Где-то что-то я упустил в проекте походу.
А что Вы наблюдаете с помощью осциллографа? Все ли сигналы и биты на месте?
В свое время, при работе с шиной I2C, осциллограф мне очень помог... Запускайте цикл обращения по I2C, сформируйте синхросигнал и все будет видно... Смотрите до и после преобразователя уровня…
Все, задача решена =) Всем огромное спасибо за помощь) Проект от COMA оказался полностью рабочим, скрипт предложенный Stewart Little позволяет автоматизировать процесс подключения необходимых модулей и инициализации компонента. Моя проблема была связана с ошибкой в документации на используемое slave устройство (швейцарцы не всегда так точны как их часы, перепутали SCL и GND на схеме подключения). Надеюсь эта тема поможет желающим подключить i2c ip к своему проекту, все необходимые для этого файлы в данном топике есть)
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.