roboforum.ru

Технический форум по робототехнике.

Как правильно работать с протоколом I2c (TWI)?

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Как правильно работать с протоколом I2c (TWI)?

Сообщение sky-walker » 07 окт 2012, 01:43

Всем доброго времени суток!

Хочется разобраться с протоколом I2C (он же TWI, он же IIC). Никак не получается осилить...
1) Сначала попробовал напрямую - через регистры. Установил скорость (TWBR=0x20; TWSR=0x00; // F_CPU=8Mhz, F_SCL=100Khz), написал функцию отправки байта. В мастере через каждые 500мс слал этой функцией байт 0x0F. В протеусе I2C Debugger пишет что все хорошо, так и есть. Но! Засада началась с написанием слэйва - никакой документации на эту тему я не нашел, так и не получилось заставить его принять байт... (Протеус в i2c дебаггере каждому посланному байту ставил NACK, да и в осциллографе видно...)
2) И решил я воспользоваться готовым решением - библой twi.h (а пишу я в cvAVR на С). Но... Как решил воспользоваться, так и раздумал. Вообще ничего не понял... В ней какие-то 3 непонятные функции (ну, init-то понятен...).
Вообще мне это нужно для чтения данных с нунчака (от Nintendo Wii, там 3осевой акселерометр, 2осевой джойстик и 2кнопки), но хочу полностью освоить, так как на этом протоколе куча всего...

Подскажите пожалуйста, как можно реализовать код слэйва, и код мастера на прием (т.е. когда надо считать данные со слэйва). Мой уровень - сильно новичок (Занимаюсь этим делом буквально неделю, из реализованного - рулежка pwm-мом моторами через l293b, Bluetooth-удлинитель UART-а, каскад из 2 сдвиговых регистров).
Заранее спасибо.
Аватара пользователя
sky-walker
 
Сообщения: 40
Зарегистрирован: 29 сен 2012, 14:41
прог. языки: C\C++, AutoIt, PHP

Re: Как правильно работать с протоколом I2c (TWI)?

Сообщение Angel71 » 07 окт 2012, 02:24

на форуме http://roboforum.ru/forum86/topic9719.html, http://roboforum.ru/forum86/topic11672.html. если примерно так "wii nunchuk atmega" озадачить поисковик, получите в выдаче примерно такое http://arduino.org/m/articles/view/Read-wii-nunchuck-data-into-arduino, http://www.nerdkits.com/forum/thread/972/
что объяснять, что бы вам стало всё понятно с i2c/twi, нужно сначала понять что вам не понятно и где в коде косячите.
п.с. на форуме этот интерфейс неоднократно обсуждался, хотя бы пытались в этих обсуждениях найти ответы на свои вопросы?
Аватара пользователя
Angel71
 
Сообщения: 10668
Зарегистрирован: 18 апр 2009, 22:18
Предупреждения: -1

Re: Как правильно работать с протоколом I2c (TWI)?

Сообщение sky-walker » 07 окт 2012, 12:04

Я пытался пробить в поиске TWI, I2C, IIC - в результатах 0. Как работать с нунчаком в ардуино я знаю, но там есть либа для i2c (Wire), и опять-таки нет примера слэйва. Немного подумал ночью, понял как реализовать чтение для мастера, а вот слэйв так и остался в потемках...

В данный момент мне непонятно: как слэйву отловить обращение по его адресу, ответить АСКом, послать свой байт. То есть в данный момент мне интересна не столько работа в нунчаком, сколько вообще работа с TWI для мастера и слэйва.

UPD: вот моя полная программа для мастера. 2 функции (writeByte, readByte), вторая не работает (скорее всего ошибка в 44 строке, не знаю чем заменить, в протеусе видно бесконечное ожидание). Обработка ошибок следующая: если все корректно - HIGH на PB0, если ошибка старта - на PB1, если нет подтверждения (именно она у меня и горит, т.к. слэйва-то нету...) - на PB2.
Аватара пользователя
sky-walker
 
Сообщения: 40
Зарегистрирован: 29 сен 2012, 14:41
прог. языки: C\C++, AutoIt, PHP

Re: Как правильно работать с протоколом I2c (TWI)?

Сообщение Madf » 07 окт 2012, 13:34

На сколько я помню, в Баскоме такой проблемы нет. Да и информация об этой теме не раз поднималась. Подглядывать код как там реализовано - думаю сложно, много воды будет..
Madf
 
Сообщения: 3298
Зарегистрирован: 03 янв 2012, 12:55
Откуда: Москва
прог. языки: VB6, BASCOM, ASM...

Re: Как правильно работать с протоколом I2c (TWI)?

Сообщение sky-walker » 07 окт 2012, 14:29

Переходить ради этого на баском (т.е. на бейсик, который мне "немножко" не по душе), как-то не хочется... А информацию - ну нигде не нахожу для слейва...
Аватара пользователя
sky-walker
 
Сообщения: 40
Зарегистрирован: 29 сен 2012, 14:41
прог. языки: C\C++, AutoIt, PHP

Re: Как правильно работать с протоколом I2c (TWI)?

Сообщение Drunya » 07 окт 2012, 15:13

Нужен Slave Transmitter или Slave Receiver?
Я для себя TWI изучал по примеру из библиотеки WinAVR. Там есть классный включаемый файл "util/twi.h", в котором все комбинации битов TWSR доходчиво расписаны.
Глюк по-немецки означает "счастье"...
Аватара пользователя
Drunya
 
Сообщения: 196
Зарегистрирован: 05 июн 2007, 12:20
Откуда: Киев
прог. языки: C/C++, ASSEMBLER

Re: Как правильно работать с протоколом I2c (TWI)?

Сообщение sky-walker » 07 окт 2012, 15:31

Насколько я понимаю, Transmitter. То есть он будет отсылать n байт при запросе мастера. Но узнать про Receiver было бы тоже неплохо, для общего развития (например, 3 меги будут общаться по 1 шине).

За ссылку спасибо. В принципе, обозначения TWSR у меня тоже есть, но я не знаю правильный порядок действий...

С чтением для мастера разобрался, без проверок на подтверждения читает 0xff (т.е. линия в HIGH все время).
Аватара пользователя
sky-walker
 
Сообщения: 40
Зарегистрирован: 29 сен 2012, 14:41
прог. языки: C\C++, AutoIt, PHP

Re: Как правильно работать с протоколом I2c (TWI)?

Сообщение Angel71 » 07 окт 2012, 15:40

это мрак какой-то. есть нунчак ака рабочий слейв. ааааааааааааа, знаю я как это делать и не доделав мастер побежал лепить ещё и своего слейва. кртуть огребать вместо одного нерабочего сразу два? хоть догадались TWBR=0x20 на TWBR = 32 заменить. ещё раз даю ссыль на один из вариантов рабочего кода. хотите и дальше галопом по европпе скакать, не вопрос.
что бы найти, как слейв сделать, наверно поисковику нужно ввести примерно такое "atmega8 i2c twi slave". я конечно ошибаюсь, но такие ссылки тыц, тыц выплёлвывет аж бегом. что я делаю не так?
Аватара пользователя
Angel71
 
Сообщения: 10668
Зарегистрирован: 18 апр 2009, 22:18
Предупреждения: -1

Re: Как правильно работать с протоколом I2c (TWI)?

Сообщение sky-walker » 07 окт 2012, 17:32

Цитирую свое старое сообщение:
sky-walker писал(а):То есть в данный момент мне интересна не столько работа в нунчаком, сколько вообще работа с TWI для мастера и слэйва.

Мастера доделал - все красиво (для себя) оформил и привел работу с ним к виду библы Wire в Arduino + обработка почти всех ошибок... Но проверить пока не на чем (нунчаку пока из принципа не трогаю, хочу разобраться в протоколе полностью + там инициализация дурацкая, поэтому и есть огромное желание слепить своего слэйва), если вырубить обработку ошибок то все вроде корректно (по данным I2C Debugger в протеусе).

Насчет 0x20 и 32 - а это разве не одно и то же? Специально сейчас проверил на 2 конвертерах + руками перевел - одинаково...

Насчет галопа - вот именно, что не хочу галопом, хочу основательно все понять и сам реализовать (да велосипед, зато буду знать что куда чем и как шлется\обрабатывается\считывается).

По поводу ссылок. На первой я уже давно сижу, коды TWSR именно оттуда и беру, а пользоваться его конечным автоматом - для меня это пока синхрофазотрон... Порядок действий для слэйва я примерно представляю, но как это реализовать... Вторую не видел, спасибо, но там используется библа twi.h. В cvAVR есть такая, но я про нее написал еще в пером посте (п.2)...
Аватара пользователя
sky-walker
 
Сообщения: 40
Зарегистрирован: 29 сен 2012, 14:41
прог. языки: C\C++, AutoIt, PHP

Re: Как правильно работать с протоколом I2c (TWI)?

Сообщение Angel71 » 07 окт 2012, 18:14

так доделали или проверить не на чем? с 0x20 и 32 это шутка такая, на понимание. хз, что там сложного. а вот в вашем коротеньком коде да, одни загадки. проверяете адекватность эмулятора протеуса? так он неадекватный, а убедиться в этом можно только на рабочем коде и то не во всех ситуациях. или я не прав? тогда :pardon: хз, что вы этим
unsigned char readByte(unsigned char byte)
...
byte=TWDR; // записали принятый байт

вообще пытаетесть сделать? :sorry: "unsigned char readByte(unsigned char* b)" или "unsigned char readByte(unsigned char*& b)"? если вы её вообще приводите, где и как вы её используете. где дефайн с частотой проца (у вас делей вообще работает правильно), в настройках проекта? зачем вы в ф-и чтения и записи пихаете какую-то левую фигню? и т.д.
Аватара пользователя
Angel71
 
Сообщения: 10668
Зарегистрирован: 18 апр 2009, 22:18
Предупреждения: -1

Re: Как правильно работать с протоколом I2c (TWI)?

Сообщение sky-walker » 07 окт 2012, 19:54

Это старый код, не смотрите на него... Там я пытался сделать возвращаемым значением статус (читать: ошибки), а в функцию readByte передавать параметром буфер. Сейчас у меня совсем по-другому - функции i2c_start(адрес, режим), i2c_writeByte(байт), unsigned char i2c_readByte(), i2c_stop() и глобальная переменная i2c_err со статусом. Код не покажу, ибо страшный...

Мучения со слэйвом продолжаются. Теперь на пачку с адресом и режимом отвечает ACK и уходит в прерывание с кодами 0x60 и 0x80 - а что в них делать, не пойму...

Сейчас все выглядит так:
Код: Выделить всёРазвернуть
Мастер: | Start | SLA+W |     | Byte |      | Stop |
Слэйв : |       |       | ACK |      | NACK |      |

Причем nack-ает он сам, я в прерывании кроме вкл. ног ничего не делаю...
В регистр TWDR капает совсем не мой байт 0b00001111, а 0b10100000...
Аватара пользователя
sky-walker
 
Сообщения: 40
Зарегистрирован: 29 сен 2012, 14:41
прог. языки: C\C++, AutoIt, PHP

Re: Как правильно работать с протоколом I2c (TWI)?

Сообщение sky-walker » 08 окт 2012, 15:19

Фух, вроде получилось... Пока реализовал самое простейшее - передача 1 байта. Сейчас алгоритм такой:
Код: Выделить всёРазвернуть
Мастер: | Start | SLA+W |     | Byte |      | Stop |
Слэйв : |       |       | ACK |      |  ACK |      |
Прерывания слэйва:      | 0x60|      | 0x80 |      |

Вечером попробую с нунчакой пообщаться...
Аватара пользователя
sky-walker
 
Сообщения: 40
Зарегистрирован: 29 сен 2012, 14:41
прог. языки: C\C++, AutoIt, PHP

Re: Как правильно работать с протоколом I2c (TWI)?

Сообщение SkyZi » 09 окт 2012, 13:10

Ух тыж!Быстрее меня разобрался)
Project "Hexxx" (in progress...)
Аватара пользователя
SkyZi
 
Сообщения: 133
Зарегистрирован: 27 окт 2011, 22:32
Откуда: Ростов-на-Дону
Skype: skyzi007
прог. языки: Python, Си (МК)
ФИО: Святослав Игоревич


Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5