реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Затык с i2c
Putnik
сообщение Jun 17 2010, 10:14
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 214
Регистрация: 4-09-07
Из: Зеленоград
Пользователь №: 30 272



Здравствуйте!

В общем, все просто - есть модуль 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 и даташитамПрикрепленный файл  src.rar ( 3.44 килобайт ) Кол-во скачиваний: 91


--------------------
за Навального!
Go to the top of the page
 
+Quote Post
iosifk
сообщение Jun 17 2010, 10:56
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Для начала надо посмотреть аппликухи ксайлинкса. Там I2C рассмотрен подробно и даны исходники...
А потом рекомендую на входе клока поставить цифровой фильтр, чтобы убрать возможный дребезг из-за пологих фронтов.
Удачи!


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
Putnik
сообщение Jun 17 2010, 11:13
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 214
Регистрация: 4-09-07
Из: Зеленоград
Пользователь №: 30 272



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

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

аппликухи - это application? их на сайте ксайлинкса искать? Спасибо
UPS - нашел application I2C у хилых на сайте


--------------------
за Навального!
Go to the top of the page
 
+Quote Post
Maverick
сообщение Jun 17 2010, 11:24
Сообщение #4


я только учусь...
******

Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839



Цитата(Putnik @ Jun 17 2010, 14:13) *
UPS - нашел application I2C у хилых на сайте

И произошло чудо! smile.gif


--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
Putnik
сообщение Jun 17 2010, 11:38
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 214
Регистрация: 4-09-07
Из: Зеленоград
Пользователь №: 30 272



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

очень смешно cranky.gif , по делу лучше бы что-то подсказали


--------------------
за Навального!
Go to the top of the page
 
+Quote Post
sazh
сообщение Jun 17 2010, 11:39
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804



Цитата(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
Go to the top of the page
 
+Quote Post
Putnik
сообщение Jun 17 2010, 11:44
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 214
Регистрация: 4-09-07
Из: Зеленоград
Пользователь №: 30 272



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

так и делаю, есть внешние pull-up по 5КОм


--------------------
за Навального!
Go to the top of the page
 
+Quote Post
Putnik
сообщение Jun 18 2010, 07:14
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 214
Регистрация: 4-09-07
Из: Зеленоград
Пользователь №: 30 272



Скажите, времянки то хоть правильные?

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


- и чтения(неработающая)
Прикрепленное изображение

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

Частота SCL - 100 КГц(400КГц)


--------------------
за Навального!
Go to the top of the page
 
+Quote Post
DmitryR
сообщение Jun 18 2010, 07:20
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 535
Регистрация: 20-02-05
Из: Siegen
Пользователь №: 2 770



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

Для того, чтобы получить ACK, надо SDAT перевести в highZ. На диаграмме этого не видно.
Go to the top of the page
 
+Quote Post
Putnik
сообщение Jun 18 2010, 11:49
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 214
Регистрация: 4-09-07
Из: Зеленоград
Пользователь №: 30 272



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

так и есть, а в 1-ку SDAT притягивает pull-up, потому-что Slave аккноледжа не дает, и линию SCL при этом тоже не затягивает в низком состоянии(т.е. время ему для обработки больше не требуется)


--------------------
за Навального!
Go to the top of the page
 
+Quote Post
DmitryR
сообщение Jun 18 2010, 12:02
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 535
Регистрация: 20-02-05
Из: Siegen
Пользователь №: 2 770



Тогда вероятно у вас pullup неправильно смоделирован: он должен на диаграмме отображаться иначе, чем сильный сигнал.
Go to the top of the page
 
+Quote Post
Putnik
сообщение Jun 18 2010, 12:34
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 214
Регистрация: 4-09-07
Из: Зеленоград
Пользователь №: 30 272



Собираю 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;


Прикрепленное изображение


--------------------
за Навального!
Go to the top of the page
 
+Quote Post
DmitryR
сообщение Jun 18 2010, 12:59
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 535
Регистрация: 20-02-05
Из: Siegen
Пользователь №: 2 770



Это все понятно, как pullup-то моделируется?

И еще - почему sda_i всегда единица?
Go to the top of the page
 
+Quote Post
Putnik
сообщение Jun 18 2010, 13:28
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 214
Регистрация: 4-09-07
Из: Зеленоград
Пользователь №: 30 272



на sda_i имитируется входное воздействие по линии sdat, пуллап притягивает ее к 1,


--------------------
за Навального!
Go to the top of the page
 
+Quote Post
DmitryR
сообщение Jun 18 2010, 16:25
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 535
Регистрация: 20-02-05
Из: Siegen
Пользователь №: 2 770



На sda_i ничего имитировать нельзя - он внутри UUT (unit under test), а все тестовые воздействия необходимо прикладывать извне UUT. И вы так и не сказали как у вас pullup симулируется.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 08:45
Рейтинг@Mail.ru


Страница сгенерированна за 0.01488 секунд с 7
ELECTRONIX ©2004-2016