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

 
 
> Траблы с контроллером IIC от Xilinx, Пока что контроллер побеждает!
Koluchiy
сообщение Feb 18 2014, 14:53
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 972
Регистрация: 12-04-09
Из: Москва
Пользователь №: 47 543



Здравствуйте, уважаемые гуру.

Имеем девайс IIC (датчик температуры), висящий на Kintex 7.
Все это подключается к стандартному контроллеру IIC в XPS и Microblaze.

И вроде как все оно работает, НО.
Если попробовать сделать обмен типа "прочитать температуру":
1. Записать адрес датчика температуры
2. Записать регистр датчика температуры (0 - MSB темперетары)
3. Repeated Start
4. Записать адрес датчика температуры
5. Прочитать температуру
6. Стоп

То до п. 4 включительно все нормально, а потом контроллер IIC вылетает с ошибкой "потеря арбитража".
При этом, если вместо "Repeated Start" поставить "Stop", а затем "Start", то все нормально работает.

Внимание, вопрос: кто-нибудь сталкивался с подобным?
Какие могут быть причины, и как бороть?

Соединение точка-точка, никаких других мастеров на этой шине нет. Датчик мастером быть не умеет и не пытается. На Чипскопе и осцилле до п. 4 включительно все выглядит как надо.

Всем заранее спасибо за помощь.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Koluchiy
сообщение Feb 19 2014, 08:27
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 972
Регистрация: 12-04-09
Из: Москва
Пользователь №: 47 543



Если читать Ваши комментарии так, как они написаны, то после записи адреса регистра Вы делаете стоп. Мне надо добиться, чтобы работал Repeated start, т.е. без стопа между записью номера регистра и чтением данных.
Go to the top of the page
 
+Quote Post
alexadmin
сообщение Feb 19 2014, 08:34
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 572
Регистрация: 17-11-05
Из: СПб, Россия
Пользователь №: 10 965



Цитата(Koluchiy @ Feb 19 2014, 12:27) *
Если читать Ваши комментарии так, как они написаны, то после записи адреса регистра Вы делаете стоп. Мне надо добиться, чтобы работал Repeated start, т.е. без стопа между записью номера регистра и чтением данных.


Где?

Xil_Out32((baseaddr + 0x108), (0x100 | (daddr & 0xFE))); // send slave address for write
Xil_Out32((baseaddr + 0x108), raddr); // send register address

Вот тут идет рестарт с отправкой физического адреса устройства
Xil_Out32((baseaddr + 0x108), (0x101 | (daddr & 0xFE))); // send slave address for read

А теперь идет чтение (в данном случае одного байта) и после этого стоп
Xil_Out32((baseaddr + 0x108), 0x201); // set stop after 1 data byte
Go to the top of the page
 
+Quote Post



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

 


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


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