Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Затык с i2c
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
Putnik
Здравствуйте!

В общем, все просто - есть модуль i2c_contr, его назначение - запись по i2c в АЦП и ЦАП-е регистры и затем их чтение во внутреннюю память (модуль RAM55B),
Выкладываю последний вариант в котором в железке стабильно работает запись в АЦП, остальное не работает..

В предыдущих вариациях иногда получал запись в ЦАП как требуется

Чтение не работало ни разу, приходит NACK(SDAT == 1) после отправки адреса устройства с 8-м битом в 1(READ),

прикладываю простенький тестбенч, для просмотра линий SCLK и SDAT надо смотреть внутренние sclk и sdat в i2c_contr,
отображающие их поведение на линии, в реальности они собираются в верхнем модуле как
assign sdat = sda_en ? sda_o : 1'bz,
sda_i = sdat;
assign sclk = scl_en ? scl_o : 1'bz,
scl_i = sclk;
(ибо open drain у третьего спартана нет)


подскажите где лажаю, вроде все делал по стандарту I2C и даташитамНажмите для просмотра прикрепленного файла
iosifk
Для начала надо посмотреть аппликухи ксайлинкса. Там I2C рассмотрен подробно и даны исходники...
А потом рекомендую на входе клока поставить цифровой фильтр, чтобы убрать возможный дребезг из-за пологих фронтов.
Удачи!
Putnik
Цитата(iosifk @ Jun 17 2010, 14:56) *
Для начала надо посмотреть аппликухи ксайлинкса. Там I2C рассмотрен подробно и даны исходники...
А потом рекомендую на входе клока поставить цифровой фильтр, чтобы убрать возможный дребезг из-за пологих фронтов.
Удачи!

В верхнем модуле клок clk для i2c_contr идет от входного пина ПЛИС по цеп-ке IBUFG -> DCM(x2) -> BUFG

аппликухи - это application? их на сайте ксайлинкса искать? Спасибо
UPS - нашел application I2C у хилых на сайте
Maverick
Цитата(Putnik @ Jun 17 2010, 14:13) *
UPS - нашел application I2C у хилых на сайте

И произошло чудо! smile.gif
Putnik
Цитата(Maverick @ Jun 17 2010, 15:24) *
И произошло чудо! smile.gif

очень смешно cranky.gif , по делу лучше бы что-то подсказали
sazh
Цитата(Putnik @ Jun 17 2010, 13:14) *
assign sdat = sda_en ? sda_o : 1'bz,
sda_i = sdat;
assign sclk = scl_en ? scl_o : 1'bz,
scl_i = sclk;
(ибо open drain у третьего спартана нет)


Если внешний резистор в наличии, open drain имитируется:
assign sdat = sda_en ? 1'b0 : 1'bz
Putnik
Цитата(sazh @ Jun 17 2010, 15:39) *
Если внешний резистор в наличии, open drain имитируется:
assign sdat = sda_en ? 1'b0 : 1'bz

так и делаю, есть внешние pull-up по 5КОм
Putnik
Скажите, времянки то хоть правильные?

Диаграммы записи(работающая) при моделировании(на осциллографе то же, только с реальными фронтами) -
Нажмите для просмотра прикрепленного файла

- и чтения(неработающая)
Нажмите для просмотра прикрепленного файла
нет аккноледжа после передачи адреса устройства с 8-м битом в 1(чтение)

Частота SCL - 100 КГц(400КГц)
DmitryR
Цитата(Putnik @ Jun 18 2010, 11:14) *
нет аккноледжа после передачи адреса устройства с 8-м битом в 1(чтение)

Для того, чтобы получить ACK, надо SDAT перевести в highZ. На диаграмме этого не видно.
Putnik
Цитата(DmitryR @ Jun 18 2010, 11:20) *
Для того, чтобы получить ACK, надо SDAT перевести в highZ. На диаграмме этого не видно.

так и есть, а в 1-ку SDAT притягивает pull-up, потому-что Slave аккноледжа не дает, и линию SCL при этом тоже не затягивает в низком состоянии(т.е. время ему для обработки больше не требуется)
DmitryR
Тогда вероятно у вас pullup неправильно смоделирован: он должен на диаграмме отображаться иначе, чем сильный сигнал.
Putnik
Собираю sdat и sclk так -
assign sdat = sda_en & !sda_o ? 0 : 1'bz, //немного описался в первом посте - фактически sda_o всегда - 0, иначе переключение
sda_i = sdat; //линии sdat для установки в 1-ку пуллапом
assign sclk = scl_en ? scl_o : 1'bz,//scl_o всегда 0
scl_i = sclk;


Нажмите для просмотра прикрепленного файла
DmitryR
Это все понятно, как pullup-то моделируется?

И еще - почему sda_i всегда единица?
Putnik
на sda_i имитируется входное воздействие по линии sdat, пуллап притягивает ее к 1,
DmitryR
На sda_i ничего имитировать нельзя - он внутри UUT (unit under test), а все тестовые воздействия необходимо прикладывать извне UUT. И вы так и не сказали как у вас pullup симулируется.
Putnik
Цитата(DmitryR @ Jun 18 2010, 20:25) *
На sda_i ничего имитировать нельзя - он внутри UUT (unit under test), а все тестовые воздействия необходимо прикладывать извне UUT. И вы так и не сказали как у вас pullup симулируется.

при работе в железке на осциллографе видно тоже, что показал на модельке, для этого и держу sda_i в 1-ке,
а как вы предлагаете смоделировать pullup?
DmitryR
pullup(sda);
Putnik
У ЦАП не заметил внешнего сброса сначала, на запись теперь он тоже работает, а вот на чтение отказывается.
ЦАП - ADV7171, АЦП - AD9882a - оба от Analog Devices - пишутся, но не читаются по I2C

зато микрочиповская память работает на запись/чтение как надо

видимо что то аналог с чтением намутил unsure.gif
DmitryR
Цитата(Putnik @ Jun 22 2010, 13:01) *
ЦАП - ADV7171, АЦП - AD9882a - оба от Analog Devices - пишутся, но не читаются по I2C

На 100 кГц даже?
aaarrr
Цитата(Putnik @ Jun 22 2010, 13:01) *
видимо что то аналог с чтением намутил unsure.gif

Ага
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.