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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Вызов мастера в I2C чип LPC2131
Папа Карло
сообщение Jan 9 2009, 23:21
Сообщение #1


Частый гость
**

Группа: Новичок
Сообщений: 176
Регистрация: 15-02-08
Из: Москва
Пользователь №: 35 074



Всем привет!

Настраиваю I2C между 2 устройствами на чипах LPC2131.
Один мастер, а другой ведомый.

Как ведомому сообщить мастеру, что у него есть информация важная ?

Чипы соединены только по I2C и других проводов протянуть нельзя.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 10 2009, 08:06
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Папа Карло @ Jan 10 2009, 02:21) *
Как ведомому сообщить мастеру, что у него есть информация важная ?

Раньше надо было думать sad.gif. Теперь только через заднепроходное отверстие заводя переключение режимов master/slave и наворачивая механизм логического разрешения коллизий. Или без I2C (EINT вместо SDA помнится вешалось) и опять думая о разрешении коллизий. А вообще, поскольку при нормальной реализации I2C затраты на его обслуживание не слишком велеки, то сканируйте slavе до опупения sad.gif.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
MaxEngee
сообщение Jan 10 2009, 08:21
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 120
Регистрация: 17-03-07
Из: Беларусь, Минск
Пользователь №: 26 249



Еще как вариан:
Переключать пины на цифровой вход/выход и использовать их как флаги в две стороны:
--> мастер инициализирует связь
<-- слайф инициализирует связь

инициализация - переключение ног на модуль i2c, сброс флагоф, сеанс общения и опять переключение ног на цифровой вход/выход.
единственное, надо подумать как не попалить порты, т.к i2c sda с открытым коллектором а digital pin - комплементарная пара. Впринципи пожно просто резак включить
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 10 2009, 08:48
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(MaxEngee @ Jan 10 2009, 11:21) *
надо подумать как не попалить порты, т.к i2c sda с открытым коллектором а digital pin - комплементарная пара.

С матчастью LPC ознакомьтесь - это физически честный I2C - всегда OD и не засаживающий шину и при отсутствии питания.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Папа Карло
сообщение Jan 10 2009, 08:50
Сообщение #5


Частый гость
**

Группа: Новичок
Сообщений: 176
Регистрация: 15-02-08
Из: Москва
Пользователь №: 35 074



Пока сделал сканирование, но не прикольно как то.

И в будущем на шине ещё могут устройства появится.
2 устройства - это временно.

Пока мысли попробовать на шине держать всех ведомыми, а для передачи переключать их в Мастер.
При коллизии, просто будет останавливаться передача и заново.
Go to the top of the page
 
+Quote Post
zhevak
сообщение Jan 10 2009, 10:01
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065



Цитата(Папа Карло @ Jan 10 2009, 13:50) *
Пока сделал сканирование, но не прикольно как то.

Существенное ограничение. Даже теории нет по этому вопросу...

Уважаемый, Папа Карло, я бы Вам тоже рекомендовал найти дополнительную ножку у МК и пробросить
на нее МГТФ-ом сигнал со слейва. Решение будет крайне простое, недорогое, абсолютно понятное всем,
кто будет после Вас, и самое главное -- рабочее! А все остальное -- от Лукавого. Намаетесь больше, чем
заработаете денег.

Вам нужно ехать и ли Вам нужно "прикольно"?


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post
Папа Карло
сообщение Jan 10 2009, 10:06
Сообщение #7


Частый гость
**

Группа: Новичок
Сообщений: 176
Регистрация: 15-02-08
Из: Москва
Пользователь №: 35 074



Чтоб не создавать новый топик задам тут вопрос ещё по I2C.

Пытаюсь скачать Ведущем шины у ведомого данные.

Вот статусы ведущего:
08 40 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 58

Вот статусы ведомого:
A8 B8 B8 B8 B8 B8 B8 B8 C8

У ведущего запрос ведомому считать до 20 символов.
У ведомого в буфере строка из 7 символов для отправки ведущему.

Как я заметил, ведущий прекращает приём только после считывания максимальной длинны символов в 20 штук.
А ведомый отправляет, как и положено, 7 символов.

Объясните пожалуйста, как мне сделать, чтоб ведущий прекратил приём при окончании символов в буфере ведомого ?

Цитата(zhevak @ Jan 10 2009, 13:01) *
Вам нужно ехать и ли Вам нужно "прикольно"?


Мне нужно "прикольно".
Я радиолюбитель !
Go to the top of the page
 
+Quote Post
Lelikk
сообщение Jan 10 2009, 11:26
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 81
Регистрация: 15-12-07
Из: Москва
Пользователь №: 33 326



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

P.S. А "радиолюбитель" обязательно предполагает реализацию не по-человечески? maniac.gif maniac.gif

Цитата(Папа Карло @ Jan 10 2009, 13:06) *
Чтоб не создавать новый топик задам тут вопрос ещё по I2C.

Пытаюсь скачать Ведущем шины у ведомого данные.

Вот статусы ведущего:
08 40 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 58

Вот статусы ведомого:
A8 B8 B8 B8 B8 B8 B8 B8 C8

У ведущего запрос ведомому считать до 20 символов.
У ведомого в буфере строка из 7 символов для отправки ведущему.

Как я заметил, ведущий прекращает приём только после считывания максимальной длинны символов в 20 штук.
А ведомый отправляет, как и положено, 7 символов.

Объясните пожалуйста, как мне сделать, чтоб ведущий прекратил приём при окончании символов в буфере ведомого ?



Мне нужно "прикольно".
Я радиолюбитель !
Go to the top of the page
 
+Quote Post
Папа Карло
сообщение Jan 10 2009, 11:43
Сообщение #9


Частый гость
**

Группа: Новичок
Сообщений: 176
Регистрация: 15-02-08
Из: Москва
Пользователь №: 35 074



А разве Ведущий может тактировать шину, если не получен АА.
Я так понял, что Ведущий качает данные, пока сам не прекратить или ведомый не выставит No Ack.

Есть 2 модуля и между ними только I2C шина. Навешивать сопли не мой вариант.
Go to the top of the page
 
+Quote Post
zhevak
сообщение Jan 10 2009, 12:43
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065



Цитата(Папа Карло @ Jan 10 2009, 16:43) *
А разве Ведущий может тактировать шину, если не получен АА.
Я так понял, что Ведущий качает данные, пока сам не прекратить или ведомый не выставит No Ack.

Есть 2 модуля и между ними только I2C шина. Навешивать сопли не мой вариант.

Если без соплей, то тогда остается либо только "неприкольное" сканирование на предмет готовности информации у слейва,
либо еще более "неприкольные" танцы с динамической конфигурацией портов и всеми вытекающими отсюда проблемами.

Что там у Вас происходит на шине и почему после получения бита NOT ACK Ведущий Мастер от Ведомого Слейва продолжает
тактировать, сложно сказать. Возможно, Вы что-то не так написали. Осциллографом не пробовали подловить картинку
передачи седьмого байта?


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post
Папа Карло
сообщение Jan 10 2009, 12:51
Сообщение #11


Частый гость
**

Группа: Новичок
Сообщений: 176
Регистрация: 15-02-08
Из: Москва
Пользователь №: 35 074



Осциллографа нет.
Могу выложить код ведомого:
Код
    case 0xA8://own SLA+R received, ACK returned (slave transmitter)
    case 0xB8://Data transmitted, ACK received
        if(i2c_size--)                  // if not last data byte transmitted
            {
            I2C0DAT = *i2c_data++;      // send next data byte
            I2C0CONSET = 0x04;//
            }
        else
            {
            I2C0CONCLR = 0x04;//
            i2c_stat   = 0;             //
            i2c_size = 0;
            }  
        break;
    case 0xC8://Last data transmitted, ACK received
        I2C0CONCLR = 0x04;//
        break;


Код ведущего:
Код
        case 0x50:
            *i2c_data++ = I2C0DAT;                  //
            i2c_read = 1;
            if(--i2c_size)                          // if not last data byte received
            {
                I2C0CONSET = 0x04;                  // set ACK bit
                I2C0CONCLR = 0x10;                  // clear "STOP" state
                   I2C0CONCLR = 0x20;                  // clear "START" state
            }
            else
            {    
                I2C0CONCLR = 0x04;                  // reset ACK bit
                I2C0CONCLR = 0x10;                  // clear "STOP" state
                   I2C0CONCLR = 0x20;                  // clear "START" state
                i2c_stat   = 0;                     // send transfer end flag
            }
            break;
        case 0x58:                                  // slave address and RD bit transmitted. ACK not received. Data read.
            I2C0CONSET = 0x10;                      // send "STOP" state
            I2C0CONCLR = 0x20;                      // clear "START/RESTART" state
            i2c_stat   = 0;                         // send transfer flag
            break;
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jan 10 2009, 18:35
Сообщение #12


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(zltigo @ Jan 10 2009, 11:48) *
С матчастью LPC ознакомьтесь - это физически честный I2C - всегда OD и не засаживающий шину и при отсутствии питания.
А как же вот это на LPC2103:
I2C1.1I2C1 pins are not bi-directional GPIO pins
Introduction: There are two I2C interfaces, I2C0 and I2C1. I2C0 functions are shared as alternate functions on port pins P0.2 and P0.3. I2C1 functions are shared on port pins P0.17 and P0.18.
Problem: I2C1 pins are currently open-drain output pins but they should be regular bi-directional GPIO pins. I2C0 pins are configured as open-drain output pins (for I2C bus compliance).
Work-around: None.


?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 10 2009, 18:54
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(singlskv @ Jan 10 2009, 21:35) *
?

Вы совсем не поняли что процитировали? Тогда перечитайте то, что отцировали из моего поста - считайте, что это краткий перевод.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jan 10 2009, 19:12
Сообщение #14


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(zltigo @ Jan 10 2009, 21:54) *
Вы совсем не поняли что процитировали? Тогда перечитайте то, что отцировали из моего поста - считайте, что это краткий перевод.
тогда переведите вот эту фразу:
Problem: I2C1 pins are currently open-drain output pins but they should be regular bi-directional GPIO pins. I2C0 pins are configured as open-drain output pins (for I2C bus compliance).

Обясните что значить currently open-drain ...but ... should be regular bi-directional GPIO pins

Если имеется в виду что проблема с ними как с GPIO то тогда почему это озаглавленно как проблема i2c ?

А если это относится к i2с, то следует что там таки не OD на выход...

заметьте что для I2C0 специально указанно "for I2C bus compliance", те все-таки нужно полагать
что для I2C1 эта самая "compliance" просто отсутствует из-за баги...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 10 2009, 19:27
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(singlskv @ Jan 10 2009, 22:12) *
тогда....

Повторяю медленно и печально - это честные OD на выход. Посему они не похожи на остальные "обычные" GPIO, только это не баг а полезная (точнее обязательная) фича. На свежих LPC, правда, разумно (для внутриплатных необязательно) таким сделали только один из 2-3 I2C портов. Точно так-же правильно сделаны I2C, например, у PIC32. В отличие от Atmel-овских чипов.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

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

 


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


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