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

I2C малко помощ
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=14991
Страница 1 от 19

Автор:  MAX_PG [ Вто Яну 17, 2017 2:15 pm ]
Заглавие:  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?

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

Автор:  Desert Leo [ Вто Яну 17, 2017 2:53 pm ]
Заглавие:  Re: I2C малко помощ

Що от всички интерфейси i2c набара?

Автор:  stoyanoff [ Вто Яну 17, 2017 7:11 pm ]
Заглавие:  Re: I2C малко помощ

Desert Leo написа:
Що от всички интерфейси i2c набара?

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

Автор:  Desert Leo [ Вто Яну 17, 2017 7:27 pm ]
Заглавие:  Re: I2C малко помощ

Абе не, че i2c не става за целта. Който е брал ядове по темата търси уърараунди. Ама и ти пък де го фърли в SPI... Най-добре си е UARTa.

Автор:  stoyanoff [ Вто Яну 17, 2017 8:57 pm ]
Заглавие:  Re: I2C малко помощ

Desert Leo написа:
Най-добре си е UARTa.

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

Автор:  ToHu [ Вто Яну 17, 2017 9:58 pm ]
Заглавие:  Re: I2C малко помощ

Най-добре УАРТ разбира се, евентуално и SPI става, а пък ако имаш пинове защо не и паралелно ;)

Автор:  slav4o.com [ Вто Яну 17, 2017 10:34 pm ]
Заглавие:  Re: I2C малко помощ

Не е казано да зависва. Слага се таймаут. Цикли се на проверка за определено време. Или пък си чака, а таймаута генерира прекъсване. Ако мастъра е определен като I2C явно няма как да се смени. Но ако има възможност RS-a си е най-прост. Пък може и някакъв модифициран протокол. Само някаква проверка на данните няма да е лошо да има... CRC..

Автор:  MAX_PG [ Сря Яну 18, 2017 12:03 am ]
Заглавие:  Re: I2C малко помощ

Благодаря за мненията ,но аз питам конкретни неща ,ако някой има тези познания да отговори,ще съм благодарен.
Направил съм платките и на двете у-ва и съм налепил елементите и няма вариант да ги сменям,защото ми костваха доста усилия за чертане,работа с киселини и т. н.
Става дума за 2 у-ва ще си комуникират само ,а именно зарядно у-во за LI-ION и BMS (batery menagement system) .
Зарядното ми е главното у-во ,а платката в корпуса на батерията е подчиненото у-во.

Автор:  Desert Leo [ Сря Яну 18, 2017 10:56 am ]
Заглавие:  Re: I2C малко помощ

Добре де, що не проиграеш въпросните ситуации, като поставиш брекпойнти където трябва и видиш през дебъгера състоянието на тези битове.

Автор:  ig_ivanov [ Сря Яну 18, 2017 11:44 am ]
Заглавие:  Re: I2C малко помощ

Имам една подобна тема малко по-надолу. Виж дали ще ти свърши работа.

Автор:  MAX_PG [ Сря Яну 18, 2017 6:48 pm ]
Заглавие:  Re: I2C малко помощ

Все още нямам решение на проблема,имам PICKIT 3 за дебъгер , но не съм много наясно как става точно работата с него.

Автор:  Desert Leo [ Сря Яну 18, 2017 7:39 pm ]
Заглавие:  Re: I2C малко помощ

В мплаба в меню дебъгер избераш пиккит3 и след това при спиране на програмата от view/watch избираш кой регистър да гледаш. Много не ми стана ясно какво точно целиш с четенето на тези битове. То вярно, че пиша на С и много не се заглеждам, но специално на i2c следя i2c_write да ми връща ACK...

Автор:  MAX_PG [ Сря Яну 18, 2017 8:30 pm ]
Заглавие:  Re: I2C малко помощ

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

Автор:  CarBeta [ Сря Яну 18, 2017 11:46 pm ]
Заглавие:  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 го нулираш ако не си сигрен дали ще успееш да набуташ навреме в буфера каквото се иска, щото мастъра си клоква без да те чака, освен ако не го накараш да почака.

Автор:  MAX_PG [ Чет Яну 19, 2017 12:48 am ]
Заглавие:  Re: I2C малко помощ

Благодаря на CarBeta за отговора.Добих някаква представа за нещата,но изглежда аз не задавам правилно въпроса.Ще се опитам да се изразя по друг начин.
Намирам се в SLAVE режим,в кода на алгоритъма за този режим.
Искам да разбера след като съм получил съвпадащ адрес и съм влязъл в прекъсването вече ,вида на ACK което съм изпратил към MASTER, защото ако SSPOV=1 или буфера не е бил прочетен преди това ACK=1 към MASTER,който от своя страна ще отчете това и ще опита още 1 път да ме адресира или ще генерира условие стоп.
Реално аз трябва да заредя данни за пращане към MASTER в прекъсването,което от своя страна ще напълни буфера,като по този начин при нов опит на MASTER да ме адресира ,моят хардуер пак ще изпрати ACK=1 ,защото след като е приет адреса буфера е бил пълен и така до безкрай.
Идеята ми е следната след като вляза в прекъсване да проверявам дали е било изпратено от мен ACK=0 след получаване на съвпадащ адрес и едва тогава да освободя буфера от данните с адреса и да го заредя с данните за изпращане.
Ако ACK=1 след получаване на съвпадащ адрес само да освободя буфера без да го зареждам с данни за изпращане ,като по този начин,при повторно адресиране ,тогава вече моя хардуер ще изпрати ACK=0 и всичко ще е наред.

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