Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

I2C ACK въпрос
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=1734
Страница 1 от 2

Автор:  the_real_maniac [ Пет Фев 03, 2006 12:26 am ]
Заглавие:  I2C ACK въпрос

1.
Нещо не мога да разбера. Или по-точно намеря като информация.

Ако не получа ACK , т.е получа NOACK

SCL = H
SDA = stable H

какво трябва да направя, на едни диаграми пише , почнете предаването от начало , ама на кое ЦЯЛОТО ??? или само на последният байт за който не съм получил ACK :?

Пример веднага, то и най-логичният:

EEPROM.

възможност за PAGE WRITE -> 64 bytes

стигнал съм 30-тият , но не получавам ACK , поради _НЯКАКВА СИ ПРИЧИНА_

как трябва да постъпя ?

Да почна от начало или да предам чисто и просто последният байт , докато не получа ACK :?


----------------------

2. доп. информация, моля първо разгледайте горната част и отговорете, после вижте това , че да не ви объркам нещо :-P С това чувствително I2C :-D

Прочетох почти цялата I2C specification на/от филипс, но не намерих отговор на въпроса си или съм го пропуснал.
Единствено имам описани едни три случея свързани с non-ack бла-бла , но там се казва МОЖЕ да прекратите пращането като master изпрати STOP.

А ако не искам да пращам STOP :?


----

3/Също така намерих форумили , най-вече от спецификациите от филипс за смятане на изтеглящите резистори, но нещо не ми се виждат достатъчно ясни.

Може ли да се намери / направи таблица със стойности спрямо брой-ува и скорости :-?

В момента ползвам 2kОма за 100kHz с 24LC128, но ще има поне още едно навързано у-во.

Автор:  BrainStorm [ Пет Фев 03, 2006 12:51 am ]
Заглавие: 

Ако трябва да получиш ACK (щото понякога предаването на баит може да завършва и с NACK) .... но не го получиш, повтаряш последния изпратен БАИТ ....

Автор:  the_real_maniac [ Пет Фев 03, 2006 1:08 am ]
Заглавие: 

Чакай сега.

В крайна сметка трябва да има на мястото на ACK , NACK / i.e. NOACK / преди STOP, така ли ?

Визирам и стандартният случей пак EEPROM:

Там пише , че след като мастър получави байта, мастър НЕ ГЕНЕРИРА ACK , а генерира STOP. (нали освен ако не иска следващ байт)

На диаграмата обаче дават

... NOACK STOP

т.е че се генерира NOACK (т.е бит SDA=1 стабилно , по време на SCL=1 ) и след това се генерира STOP bit-а.

Автор:  BrainStorm [ Пет Фев 03, 2006 1:26 am ]
Заглавие: 

Цитат:
Там пише , че след като мастър получави байта, мастър НЕ ГЕНЕРИРА ACK , а генерира STOP. (нали освен ако не иска следващ байт)

На диаграмата обаче дават

... NOACK STOP

т.е че се генерира NOACK (т.е бит SDA=1 стабилно , по време на SCL=1 ) и след това се генерира STOP bit-а.


Да не генерира ACK значи да генерира NACK :) ... няма значение така и така ти ще го игнорираш (или устроиството ) .... но ACK присъства ... просто е в ниво 1 (тоезт NACK) ... :)

Автор:  ДедоБоре [ Пет Фев 03, 2006 9:48 am ]
Заглавие: 

да ти го кажа още по-ясно:
NAK е липса на ACK. т.е. не е активен отговор, а пасивен. по някаква причина, слейва не приема това, което си му пратил и не ти отговаря отвърдително. NAK е липса на съгласие или несъгласие по премълчаване.

как трябва да се реагира на NAK няма да го намериш в I2C протокола, защото зависи в коя част на обмена не си получил ACK и най-вече зависи от конкретния слейв. трябва да четеш неговата документация.

Автор:  the_real_maniac [ Пет Фев 03, 2006 10:23 am ]
Заглавие: 

Ясно.

Иначе NACK го дават много често и като инвертирано ACK , т.е. (горе пак съм го написал):

SDA=1 по време на високата част от такта.

Същото , което сте написали и Вие двамата.

Благодаря за отговорите, момчета ! :supz:

Автор:  Dimiter [ Пет Фев 03, 2006 10:56 am ]
Заглавие: 

Не е зле да си следиш собствения клок,слейв има право да ти го задържи в нула заради някяква времеотнемаща вътрешна операция и ти трябва да почакаш ,това също е сериозна причина да не получиш ACK и да търсиш
проблема там където няма да го намериш.

Автор:  the_real_maniac [ Пет Фев 03, 2006 11:40 am ]
Заглавие: 

Да , а доколкото разбрах този момент Slave да ми смъкне SCL на low се случва , ако се случи , ЧАК след като е предаден байт.


т.е S CONTROLBYTE (ACK) BYTE (ACK) BYTE (ACK) BYTE (ACK)*

и вместо това ACK slave ми издърпва клока към low, което означава да изчакам , а след това като я пусне , чакам за ACK-то ;-)

т.е един вид преди да чакам за ACK трябва да проверя дали линията SCL не ми е low

Правилно ли съм разбрал ?

edit: да си го кажа честно , ако английският ми беше малко по-добър нямаше да се налагам да проверявам дали правилно съм разбрал написаното , но уви засега е така :roll:

Автор:  Dimiter [ Пет Фев 03, 2006 11:52 am ]
Заглавие: 

Първо дай накъсо клока с друг пин конфигуриран като вход.
И когато вдигаш клока във 1 проверявай дали наистина е успял да се
установи в 1 ако не чакай.

Просто го направи за теста, може и да му бързаш на устройството.
Можеш да туриш и тайм-аут при изчакването и въобще да го хванеш точно къде се дъни.
Понякога 100 кхц са възможни само в PDF-а

Автор:  Bezmozachen [ Пет Фев 03, 2006 12:29 pm ]
Заглавие: 

Цитат:
Първо дай накъсо клока с друг пин конфигуриран като вход.
И когато вдигаш клока във 1 проверявай дали наистина е успял да се
установи в 1 ако не чакай.

Няма нужда да ползва друг пин. Просто когато вдига SDA или SCL прави пина вход и оставя изтеглящите резистори да установят линията в 1. Обратно когато ги сваля прави пина изход с активна '0'.

Автор:  Dimiter [ Пет Фев 03, 2006 12:47 pm ]
Заглавие: 

@Bezmozachen
Дал съм му идея за тест не е нужно да се изброяват всички начини
за реализация. (и сам ще се сети)

пс.
Ако се напъна мога и по сложно да го измисля 8)

Автор:  the_real_maniac [ Пет Фев 03, 2006 2:27 pm ]
Заглавие: 

Абе определено това с още един крак да отделя за тест е просто по механизъм решение, което ми харесва, но някои път човек може и да няма цял Крак :-) на разполоцение.

като цяло мисля ,че е хубаво ако някои има желание да сподели нещо да не му се пречи , т.е
безмозъчен благодаря, че го каза, като цяло съм го мислил точно така.

И с отделен крак също, но се чудех кое е по-добрият вариант, май с отделен по-простичко.

Благодаря за отговорите. :wink: :)

Автор:  [ Пет Фев 03, 2006 2:35 pm ]
Заглавие: 

Bezmozachen написа:
Цитат:
Първо дай накъсо клока с друг пин конфигуриран като вход.
И когато вдигаш клока във 1 проверявай дали наистина е успял да се
установи в 1 ако не чакай.

Няма нужда да ползва друг пин. Просто когато вдига SDA или SCL прави пина вход и оставя изтеглящите резистори да установят линията в 1. Обратно когато ги сваля прави пина изход с активна '0'.


Както казва @Bezmozachen така трябва да се прави, защото ако си в МултиМастер I2C шина, няма друг начин, 1-цата се генерира от резисторите, те са точно за това. защото може някой друг Мастер в този момент да заеме шината с 0-ла и ако се срещнат изход с 1-ца и изход с 0-ла, ще надделее по-силния, по-слабия може и да изгори.
По същия начин се прави проверката за SCL на Мастера, ако имаш бавни Слейв I2C устройства, а пък Мастер бичи на висока скорост. След всеки байт Слейва може да сваля SCL в ниско ниво и по този начин да усмирява бързия Мастер.

Автор:  Dimiter [ Пет Фев 03, 2006 2:54 pm ]
Заглавие: 

Ако не се бях обадил щяхте ли така изчерпателно да помогнете на младежа?
това ми прилича на мерене...

Автор:  the_real_maniac [ Пет Фев 03, 2006 3:11 pm ]
Заглавие: 

Dimiter нали важното е да вървим напред ;-)

Поне на мен ми се струва , че търсиш под вола теле.

Ако не забелязваш ваще отговори се допълват и се получи чудесен пълен цял отговор.
Поне за мен де. :roll: :oops:

Страница 1 от 2 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/