Отговори на тема  [ 255 мнения ]  Отиди на страница 1, 2, 3, 4, 5 ... 17  Следваща
I2C малко помощ 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Май 26, 2009 7:49 pm
Мнения: 37
Мнение I2C малко помощ
Здравейте,захванал съм се с намерението да създам комуникация между 2 устройства,като използвам MSSP модул в микроконтролер PIC16F1786,който ще работи в 7 битов SLAVE режим.Тук оставям у-вото MASTER настрана,като не го коментираме,тоест имам някои неясноти само към SLAVE у-вото.
След като изчетох datasheet на гореспоменатия контролер (по-специално инфото за MSSP в него) и редица други източници на данни като AN734 на MICROCHIP не ми стана ясно следните неща:

1.)бит RW на SSPSTAT какво състояние заема при NACK от MASTER и какво състояние заема,когато се получи съвпадащ адрес,но SLAVE не изпрати ACK(тоест ACK=1),примерно бит SSPOV=1?
Раздвоен съм по този въпрос,защото в AN734 се казва,че този бит е валиден след получаване на адрес до следващият START бит ,STOP бит или NACK бит и след тях се нулира,но в описанието на модула в контролера ,и по-точно във времедиаграмата се вижда,че този бит RW запазва състоянието си от получаване на съвпадащ адрес до следващият такъв(тоест остава непроменен дори при настъпване на NACK,старт,стоп условия).

2.)Clock streching ми е разрешено винаги.
Хардуера винаги ли ще нулира CKP бит след 9 тактов импулс,или само ако преди това се е получило ACK=0 от MASTER
и CKP=0? , ако след приемане на съвпадащ адрес не е било изпратено ACK=0 към MASTER.

Накратко идеята ми е следната мога ли да проверявам CKP бит и и по него да съдя дали е имало от и към SLAVE
потвърждение ACK=0?

Ако някой може да помогне,ще съм много благодарен.


Вто Яну 17, 2017 1:15 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 10, 2005 2:25 pm
Мнения: 4979
Местоположение: София
Мнение Re: I2C малко помощ
Що от всички интерфейси i2c набара?


Вто Яну 17, 2017 1:53 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Чет Юни 25, 2009 12:01 pm
Мнения: 2202
Мнение Re: I2C малко помощ
Desert Leo написа:
Що от всички интерфейси i2c набара?

+1
I2C не е подходящ за комуникация м/у контролери. I2C се използва за връзка м/у контролер и някакъв сензор или нещо подобно - контролера да ти е мастър. Главната опасност идва от това, че в Slave режим, при команда за четене контролерът ти увисва - застава и чака(не прави нищо друго). Ако не дойде нищо или ще ти блокира така или ще ти се ресетне! Ако това е някаква университетска задача ОК, но в реална ситуация горният недостатък е много неприятен!
Смени на SPI.

_________________
www.elkran.com


Вто Яну 17, 2017 6:11 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 10, 2005 2:25 pm
Мнения: 4979
Местоположение: София
Мнение Re: I2C малко помощ
Абе не, че i2c не става за целта. Който е брал ядове по темата търси уърараунди. Ама и ти пък де го фърли в SPI... Най-добре си е UARTa.


Вто Яну 17, 2017 6:27 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Чет Юни 25, 2009 12:01 pm
Мнения: 2202
Мнение Re: I2C малко помощ
Desert Leo написа:
Най-добре си е UARTa.

Дискусионен въпрос! Аз го предложих, защото PIC използват еднакви пинове за I2C и SPI, и е сравнително лесно да се мине от едното на другото!
Не е ясно какво точно ще се предава и колко контролера ще участват и т. н.

_________________
www.elkran.com


Вто Яну 17, 2017 7:57 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 8:21 pm
Мнения: 27997
Местоположение: София
Мнение Re: I2C малко помощ
Най-добре УАРТ разбира се, евентуално и SPI става, а пък ако имаш пинове защо не и паралелно ;)


Вто Яну 17, 2017 8:58 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Яну 01, 2012 7:04 pm
Мнения: 2586
Местоположение: Велико Търново / София
Мнение Re: I2C малко помощ
Не е казано да зависва. Слага се таймаут. Цикли се на проверка за определено време. Или пък си чака, а таймаута генерира прекъсване. Ако мастъра е определен като I2C явно няма как да се смени. Но ако има възможност RS-a си е най-прост. Пък може и някакъв модифициран протокол. Само някаква проверка на данните няма да е лошо да има... CRC..

_________________
https://github.com/slav4ocom/


Вто Яну 17, 2017 9:34 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Май 26, 2009 7:49 pm
Мнения: 37
Мнение Re: I2C малко помощ
Благодаря за мненията ,но аз питам конкретни неща ,ако някой има тези познания да отговори,ще съм благодарен.
Направил съм платките и на двете у-ва и съм налепил елементите и няма вариант да ги сменям,защото ми костваха доста усилия за чертане,работа с киселини и т. н.
Става дума за 2 у-ва ще си комуникират само ,а именно зарядно у-во за LI-ION и BMS (batery menagement system) .
Зарядното ми е главното у-во ,а платката в корпуса на батерията е подчиненото у-во.


Вто Яну 17, 2017 11:03 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 10, 2005 2:25 pm
Мнения: 4979
Местоположение: София
Мнение Re: I2C малко помощ
Добре де, що не проиграеш въпросните ситуации, като поставиш брекпойнти където трябва и видиш през дебъгера състоянието на тези битове.


Сря Яну 18, 2017 9:56 am
Профил
Online
Ранг: Напреднал
Ранг: Напреднал
Аватар

Регистриран на: Съб Май 21, 2016 8:47 pm
Мнения: 476
Местоположение: Бургас
Мнение Re: I2C малко помощ
Имам една подобна тема малко по-надолу. Виж дали ще ти свърши работа.


Сря Яну 18, 2017 10:44 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Май 26, 2009 7:49 pm
Мнения: 37
Мнение Re: I2C малко помощ
Все още нямам решение на проблема,имам PICKIT 3 за дебъгер , но не съм много наясно как става точно работата с него.


Сря Яну 18, 2017 5:48 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 10, 2005 2:25 pm
Мнения: 4979
Местоположение: София
Мнение Re: I2C малко помощ
В мплаба в меню дебъгер избераш пиккит3 и след това при спиране на програмата от view/watch избираш кой регистър да гледаш. Много не ми стана ясно какво точно целиш с четенето на тези битове. То вярно, че пиша на С и много не се заглеждам, но специално на i2c следя i2c_write да ми връща ACK...


Сря Яну 18, 2017 6:39 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Май 26, 2009 7:49 pm
Мнения: 37
Мнение Re: I2C малко помощ
Вижте хора не искам да обидя никой със следващото ми изказване .
Език "С" и други подобни използват готови библиотеки и компилатори ,като по този начин не се знае какво точно става вътре и някои случаи стават едни бози,които и най-големите инженери сигурно немогат да обяснят.
Аз си пиша на асемблер,както се знае с него може да се постигне най-голяма дълбочина на програмата,поради факта ,че той е най-близък до машинният език на контролерите.
Аз незнам всичко ,което е нормално все пак съм човек,но когато се заема с нещо влагам цялата си енергия и мисля за такива неща,за които на други въобще няма да им мине през акъла.Мисля за най-критични ситуации ,които могат да настъпят и у-вото да зацикли или не разчете правилно състоянието в което се намира и съответно да изпълни погрешни действия,които пък от своя страна хептен да прецакат нещата тотално.
В описанието на МИКРОЧИП са дадени само 5 състояния,но реално е възможно да се получат повече ,и ако не се отчитат ще се получи или зацикляне или невярни деиствия от страна на подчиненото у-во.
Все пак искам у-вото ми да работи стабилно във времето.


Сря Яну 18, 2017 7:30 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Май 01, 2009 3:01 pm
Мнения: 1438
Мнение Re: I2C малко помощ
MAX_PG написа:
1.)бит RW на SSPSTAT какво състояние заема при NACK от MASTER и какво състояние заема,когато се получи съвпадащ адрес,но SLAVE не изпрати ACK(тоест ACK=1),примерно бит SSPOV=1?

В слейв режим тоя бит индикира дали мастера иска да чете или да пише и си остава непроменен до следващата заявка от мастера, ако има такава. NACK означава, че те отсвирват и отиваш да "спиш" или да чакаш следващо повикване. SSPOV=1 означава, че имаш непрочетени данни в буфера, а мастера праща нови. Само че мастера ще праща нови ако му подадеш ACK. А ако си потвърдил, пък не си прочел... да си прочел или да не си потвърждавал, че си прочел(виж си сифтуера).

MAX_PG написа:
2.)Clock streching ми е разрешено винаги.
Хардуера винаги ли ще нулира CKP бит след 9 тактов импулс,или само ако преди това се е получило ACK=0 от MASTER и CKP=0? , ако след приемане на съвпадащ адрес не е било изпратено ACK=0 към MASTER.

Слейвът не може да не изпрати АСК, ако адресът му е извикан. Протоколът го изисква и той не може да се ослушва, освен ако няма смущения/проблеми в линията и адресът не е приет коректно. Тогава мастера го търси пак, ако иска.

MAX_PG написа:
Накратко идеята ми е следната мога ли да проверявам CKP бит и и по него да съдя дали е имало от и към SLAVE
потвърждение ACK=0?

Не! Ако искаш да знаеш дали имаш ACK от мастъра гледаш бит ACKSTAT. Идеята на CKP е съвсем различна - ако мастъра много бърза, слейва задържа клок линията, за да покаже, че е зает в момента и мастъра трябва да го изчака да освободи линията(CKP=1), за да пробължи мастъра да му налива. CKP го нулираш ако не си сигрен дали ще успееш да набуташ навреме в буфера каквото се иска, щото мастъра си клоква без да те чака, освен ако не го накараш да почака.


Сря Яну 18, 2017 10:46 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Май 26, 2009 7:49 pm
Мнения: 37
Мнение Re: I2C малко помощ
Благодаря на CarBeta за отговора.Добих някаква представа за нещата,но изглежда аз не задавам правилно въпроса.Ще се опитам да се изразя по друг начин.
Намирам се в SLAVE режим,в кода на алгоритъма за този режим.
Искам да разбера след като съм получил съвпадащ адрес и съм влязъл в прекъсването вече ,вида на ACK което съм изпратил към MASTER, защото ако SSPOV=1 или буфера не е бил прочетен преди това ACK=1 към MASTER,който от своя страна ще отчете това и ще опита още 1 път да ме адресира или ще генерира условие стоп.
Реално аз трябва да заредя данни за пращане към MASTER в прекъсването,което от своя страна ще напълни буфера,като по този начин при нов опит на MASTER да ме адресира ,моят хардуер пак ще изпрати ACK=1 ,защото след като е приет адреса буфера е бил пълен и така до безкрай.
Идеята ми е следната след като вляза в прекъсване да проверявам дали е било изпратено от мен ACK=0 след получаване на съвпадащ адрес и едва тогава да освободя буфера от данните с адреса и да го заредя с данните за изпращане.
Ако ACK=1 след получаване на съвпадащ адрес само да освободя буфера без да го зареждам с данни за изпращане ,като по този начин,при повторно адресиране ,тогава вече моя хардуер ще изпрати ACK=0 и всичко ще е наред.


Сря Яну 18, 2017 11:48 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 255 мнения ]  Отиди на страница 1, 2, 3, 4, 5 ... 17  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 6 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни