| Автор |
Съобщение |
|
the_real_maniac
Ранг: Почетен член
Регистриран на: Пет Авг 19, 2005 11:38 am Мнения: 978 Местоположение: Europe -> BG
|
 I2C ACK въпрос
1.
Нещо не мога да разбера. Или по-точно намеря като информация.
Ако не получа ACK , т.е получа NOACK
SCL = H
SDA = stable H
какво трябва да направя, на едни диаграми пише , почнете предаването от начало , ама на кое ЦЯЛОТО ??? или само на последният байт за който не съм получил ACK
Пример веднага, то и най-логичният:
EEPROM.
възможност за PAGE WRITE -> 64 bytes
стигнал съм 30-тият , но не получавам ACK , поради _НЯКАКВА СИ ПРИЧИНА_
как трябва да постъпя ?
Да почна от начало или да предам чисто и просто последният байт , докато не получа ACK
----------------------
2. доп. информация, моля първо разгледайте горната част и отговорете, после вижте това , че да не ви объркам нещо  С това чувствително I2C
Прочетох почти цялата I2C specification на/от филипс, но не намерих отговор на въпроса си или съм го пропуснал.
Единствено имам описани едни три случея свързани с non-ack бла-бла , но там се казва МОЖЕ да прекратите пращането като master изпрати STOP.
А ако не искам да пращам STOP
----
3/Също така намерих форумили , най-вече от спецификациите от филипс за смятане на изтеглящите резистори, но нещо не ми се виждат достатъчно ясни.
Може ли да се намери / направи таблица със стойности спрямо брой-ува и скорости
В момента ползвам 2kОма за 100kHz с 24LC128, но ще има поне още едно навързано у-во.
|
| Пет Фев 03, 2006 12:26 am |
|
 |
|
BrainStorm
Ранг: Почетен член
Регистриран на: Пон Юли 04, 2005 11:51 pm Мнения: 651 Местоположение: София
|
Ако трябва да получиш ACK (щото понякога предаването на баит може да завършва и с NACK) .... но не го получиш, повтаряш последния изпратен БАИТ ....
_________________ От наше село са види връо, ама от връо се невиди наше село ... що така и я незнам .. ?!?
|
| Пет Фев 03, 2006 12:51 am |
|
 |
|
the_real_maniac
Ранг: Почетен член
Регистриран на: Пет Авг 19, 2005 11:38 am Мнения: 978 Местоположение: Europe -> BG
|
Чакай сега.
В крайна сметка трябва да има на мястото на ACK , NACK / i.e. NOACK / преди STOP, така ли ?
Визирам и стандартният случей пак EEPROM:
Там пише , че след като мастър получави байта, мастър НЕ ГЕНЕРИРА ACK , а генерира STOP. (нали освен ако не иска следващ байт)
На диаграмата обаче дават
... NOACK STOP
т.е че се генерира NOACK (т.е бит SDA=1 стабилно , по време на SCL=1 ) и след това се генерира STOP bit-а.
|
| Пет Фев 03, 2006 1:08 am |
|
 |
|
BrainStorm
Ранг: Почетен член
Регистриран на: Пон Юли 04, 2005 11:51 pm Мнения: 651 Местоположение: София
|
Да не генерира ACK значи да генерира NACK  ... няма значение така и така ти ще го игнорираш (или устроиството ) .... но ACK присъства ... просто е в ниво 1 (тоезт NACK) ... 
_________________ От наше село са види връо, ама от връо се невиди наше село ... що така и я незнам .. ?!?
|
| Пет Фев 03, 2006 1:26 am |
|
 |
|
ДедоБоре
Ранг: Форумен бог
Регистриран на: Нед Ное 21, 2004 11:31 pm Мнения: 10088
|
да ти го кажа още по-ясно:
NAK е липса на ACK. т.е. не е активен отговор, а пасивен. по някаква причина, слейва не приема това, което си му пратил и не ти отговаря отвърдително. NAK е липса на съгласие или несъгласие по премълчаване.
как трябва да се реагира на NAK няма да го намериш в I2C протокола, защото зависи в коя част на обмена не си получил ACK и най-вече зависи от конкретния слейв. трябва да четеш неговата документация.
|
| Пет Фев 03, 2006 9:48 am |
|
 |
|
the_real_maniac
Ранг: Почетен член
Регистриран на: Пет Авг 19, 2005 11:38 am Мнения: 978 Местоположение: Europe -> BG
|
Ясно.
Иначе NACK го дават много често и като инвертирано ACK , т.е. (горе пак съм го написал):
SDA=1 по време на високата част от такта.
Същото , което сте написали и Вие двамата.
Благодаря за отговорите, момчета ! 
|
| Пет Фев 03, 2006 10:23 am |
|
 |
|
Dimiter
Ранг: Популярен
Регистриран на: Пет Фев 04, 2005 3:18 pm Мнения: 309 Местоположение: Sofia
|
Не е зле да си следиш собствения клок,слейв има право да ти го задържи в нула заради някяква времеотнемаща вътрешна операция и ти трябва да почакаш ,това също е сериозна причина да не получиш ACK и да търсиш
проблема там където няма да го намериш.
|
| Пет Фев 03, 2006 10:56 am |
|
 |
|
the_real_maniac
Ранг: Почетен член
Регистриран на: Пет Авг 19, 2005 11:38 am Мнения: 978 Местоположение: Europe -> BG
|
Да , а доколкото разбрах този момент Slave да ми смъкне SCL на low се случва , ако се случи , ЧАК след като е предаден байт.
т.е S CONTROLBYTE (ACK) BYTE (ACK) BYTE (ACK) BYTE (ACK)*
и вместо това ACK slave ми издърпва клока към low, което означава да изчакам , а след това като я пусне , чакам за ACK-то
т.е един вид преди да чакам за ACK трябва да проверя дали линията SCL не ми е low
Правилно ли съм разбрал ?
edit: да си го кажа честно , ако английският ми беше малко по-добър нямаше да се налагам да проверявам дали правилно съм разбрал написаното , но уви засега е така 
|
| Пет Фев 03, 2006 11:40 am |
|
 |
|
Dimiter
Ранг: Популярен
Регистриран на: Пет Фев 04, 2005 3:18 pm Мнения: 309 Местоположение: Sofia
|
Първо дай накъсо клока с друг пин конфигуриран като вход.
И когато вдигаш клока във 1 проверявай дали наистина е успял да се
установи в 1 ако не чакай.
Просто го направи за теста, може и да му бързаш на устройството.
Можеш да туриш и тайм-аут при изчакването и въобще да го хванеш точно къде се дъни.
Понякога 100 кхц са възможни само в PDF-а
|
| Пет Фев 03, 2006 11:52 am |
|
 |
|
Bezmozachen
Ранг: Популярен
Регистриран на: Сря Апр 27, 2005 2:47 pm Мнения: 349 Местоположение: Varna
|
Няма нужда да ползва друг пин. Просто когато вдига SDA или SCL прави пина вход и оставя изтеглящите резистори да установят линията в 1. Обратно когато ги сваля прави пина изход с активна '0'.
|
| Пет Фев 03, 2006 12:29 pm |
|
 |
|
Dimiter
Ранг: Популярен
Регистриран на: Пет Фев 04, 2005 3:18 pm Мнения: 309 Местоположение: Sofia
|
@Bezmozachen
Дал съм му идея за тест не е нужно да се изброяват всички начини
за реализация. (и сам ще се сети)
пс.
Ако се напъна мога и по сложно да го измисля 
|
| Пет Фев 03, 2006 12:47 pm |
|
 |
|
the_real_maniac
Ранг: Почетен член
Регистриран на: Пет Авг 19, 2005 11:38 am Мнения: 978 Местоположение: Europe -> BG
|
Абе определено това с още един крак да отделя за тест е просто по механизъм решение, което ми харесва, но някои път човек може и да няма цял Крак  на разполоцение.
като цяло мисля ,че е хубаво ако някои има желание да сподели нещо да не му се пречи , т.е
безмозъчен благодаря, че го каза, като цяло съм го мислил точно така.
И с отделен крак също, но се чудех кое е по-добрият вариант, май с отделен по-простичко.
Благодаря за отговорите. 
|
| Пет Фев 03, 2006 2:27 pm |
|
 |
|
¶
Ранг: Форумен бог
Регистриран на: Пет Фев 25, 2005 1:58 pm Мнения: 4585 Местоположение: US
|
Както казва @Bezmozachen така трябва да се прави, защото ако си в МултиМастер I2C шина, няма друг начин, 1-цата се генерира от резисторите, те са точно за това. защото може някой друг Мастер в този момент да заеме шината с 0-ла и ако се срещнат изход с 1-ца и изход с 0-ла, ще надделее по-силния, по-слабия може и да изгори.
По същия начин се прави проверката за SCL на Мастера, ако имаш бавни Слейв I2C устройства, а пък Мастер бичи на висока скорост. След всеки байт Слейва може да сваля SCL в ниско ниво и по този начин да усмирява бързия Мастер.
_________________ Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....
|
| Пет Фев 03, 2006 2:35 pm |
|
 |
|
Dimiter
Ранг: Популярен
Регистриран на: Пет Фев 04, 2005 3:18 pm Мнения: 309 Местоположение: Sofia
|
Ако не се бях обадил щяхте ли така изчерпателно да помогнете на младежа?
това ми прилича на мерене...
|
| Пет Фев 03, 2006 2:54 pm |
|
 |
|
the_real_maniac
Ранг: Почетен член
Регистриран на: Пет Авг 19, 2005 11:38 am Мнения: 978 Местоположение: Europe -> BG
|
Dimiter нали важното е да вървим напред
Поне на мен ми се струва , че търсиш под вола теле.
Ако не забелязваш ваще отговори се допълват и се получи чудесен пълен цял отговор.
Поне за мен де. 
|
| Пет Фев 03, 2006 3:11 pm |
|
|