|
I2C, некоторые тонкости |
|
|
|
May 20 2010, 13:11
|

Профессионал
    
Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877

|
Имеем два контроллера - LPC213x и ATmega, сопряжённые по I2C. LPC - мастер, мега - слейв. Для простоты будем считать, что других устройств на шине нету (могут быть ещё слейвы, но пока - без них). Протокол обмена: мастер отправляет команду слейв её обрабатывает, кладёт ответ в буфер мастер считывает ответ Есть мысль на период обработки команды подвешивать шину - прижимать SCL к земле. То, что в этот момент вешается обмен с остальными устройствами, нас не волнует - мастер всё равно ждёт ответ от атмеги. Вопрос: когда бы это по хорошему сделать? По приёму последнего байта посылки (состояние TWSR 0x80) я не сбрасываю бит TWINT - нога SCL в нуле. Проблема в том, что мастер видит, что байт приняли, ACK ответили, и выставляет флаг SI, что всё нормально. Дальше также спокойно мы можем отправить стоп (хотя лучше не отправлять, пожалуй). Только на старте чтения мастер осознаёт, что что-то пошло не так, и долго выставляет SI на условие передачи старта. Так вот, вопрос: это нормально для LPC, что он не видит этого "растянутого" обмена? В документации сказано, что данный приём можно использовать как для каждого бита, так и после передачи всего байта. Вот интересно, отправленный ACK - это "after complete byte transfer" или нет?
--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
|
|
|
|
|
 |
Ответов
(1 - 9)
|
May 20 2010, 23:53
|

pontificator
     
Группа: Свой
Сообщений: 3 055
Регистрация: 8-02-05
Из: страны Оз
Пользователь №: 2 483

|
Цитата(esaulenka @ May 20 2010, 22:41)  Проблема в том, что мастер видит, что байт приняли, ACK ответили, и выставляет флаг SI, что всё нормально. Дальше также спокойно мы можем отправить стоп (хотя лучше не отправлять, пожалуй). Дальше мастер должен послать ре-START (или STOP+START, без разницы) и начать чтение. А Мега после приема команды на чтение должна притянуть SCL к нулю, пока не будет готов ответ. После этого мастер "подвиснет" на выдаче первого клока в первом читаемом байте.
|
|
|
|
|
May 29 2010, 16:06
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Цитата(esaulenka @ May 20 2010, 17:11)  Есть мысль на период обработки команды подвешивать шину - прижимать SCL к земле. То, что в этот момент вешается обмен с остальными устройствами, нас не волнует - мастер всё равно ждёт ответ от атмеги.
Вопрос: когда бы это по хорошему сделать? Как я понял, мастер всегда передает команду, после чего читает ответ от атмеги. Следовательно, передача будет комбинированной: сначала мастер передает адрес со сброшенным седьмым битом (запись), затем передает один или несколько байт команды, затем передается рестарт, после него опять передается тот же адрес, но с установленным седьмым битом (чтение), после чего мастер выдает клоки пытаясь прочитать байт от слейва. Вот тут-то его и надо тормозить. Цитата(esaulenka @ May 20 2010, 17:11)  По приёму последнего байта посылки (состояние TWSR 0x80) я не сбрасываю бит TWINT - нога SCL в нуле. Именно таким способом. Когда данные будут готовы, записываете их в TWDR и сбрасываете TWINT - атмега отпускает SCL и начинает передачу.
|
|
|
|
|
May 29 2010, 20:55
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(=AK= @ May 21 2010, 12:38)  Просто задержка ответа после приема команды "read", как я предлагал, в точности соответствует Fig.6 спецификации шины. Тут уж не ошибешься, и другим объяснить легче: ткнул носом в доку - и все, пусть читают. А заодно больше соответствует логике работы. Цитата мастер отправляет команду И не нужно его тормозить в конце отправки. Пока Цитата слейв её обрабатывает, кладёт ответ в буфер он может чем-то полезнм заняться, не сейчас, так при модификации программы. А если ему нечего делать, то сразу Цитата мастер считывает ответ и вот тут, если слейв не готов, он задерживает. Или не задерживает, если за время (STOP+START или RESTART) + передача адреса он уже успел всё сделать. Кстати, тут по соседству обсуждаются другие проблемы, но решение тут может быть таким же -- вообще уйти от операции чтения на шине. http://electronix.ru/forum/index.php?s=&am...st&p=765090
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|