| Микроконтролери и електроника 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 малко помощ | |||||||||
+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 малко помощ | |||||||||
Дискусионен въпрос! Аз го предложих, защото 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 малко помощ | |||||||||||||||||||||||||||
В слейв режим тоя бит индикира дали мастера иска да чете или да пише и си остава непроменен до следващата заявка от мастера, ако има такава. NACK означава, че те отсвирват и отиваш да "спиш" или да чакаш следващо повикване. SSPOV=1 означава, че имаш непрочетени данни в буфера, а мастера праща нови. Само че мастера ще праща нови ако му подадеш ACK. А ако си потвърдил, пък не си прочел... да си прочел или да не си потвърждавал, че си прочел(виж си сифтуера).
Слейвът не може да не изпрати АСК, ако адресът му е извикан. Протоколът го изисква и той не може да се ослушва, освен ако няма смущения/проблеми в линията и адресът не е приет коректно. Тогава мастера го търси пак, ако иска.
Не! Ако искаш да знаеш дали имаш 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/ |
|