|
Виж темите без отговор | Виж активните теми
Дата и час: Вто Юли 28, 2026 1:31 am
|
Страница 1 от 1
|
[ 10 мнения ] |
|
| Автор |
Съобщение |
|
Nikolay_90
Ранг: Минаващ
Регистриран на: Пет Дек 07, 2007 1:21 pm Мнения: 31 Местоположение: Varna
|
 Проблем с i2c шина
Здравейте. Имам странен проблем с шината и не ми идва нищо на ум затова моля ако някой се е сблъсквал с такъв проблем или ако има идея да помага. Използвам MSSP модул в режим I2C за връзка с външен EEPROM. Микроконтролерът е PIC18F45K80, OSC - HS 16MHz х 4PLL тактова честота 64MHz. Паметта е 24LC64. Проблемът е следния. Записвам в EEPROM-а без проблем, но чета от него вярно единствено когато докосна с пръст(или със сондата на осцилоскопа) SCL линията на магистралата. Иначе програмата зацикля до момента в който се чака приемането на битовете от slave и съответно установяването в единица на бит SSPIF bcf PIR1,SSPIF bsf SSPCON2,RCEN btfss PIR1,SSPIF bra $-2 Регистър SSPADD е зареден с константа 0х09. 16000000/4*(9+1) = 400000 = 400KHz. Интересното е,че когато променя стойността на тази константа това не влияе на записа в паметта. Записва вярно (което е странно). При четене обаче, при стойност различна от 0х09 програмата не зацикля, но винаги чета 0xFF. Другото странно нещо при стойност 0х09 е че с осцилоскопа на линия SCL виждам импулси с период 1 микро секунда (1MHz), а не 2.5 (400KHz) както би трябвало да бъде. При стойност 0х24 периода вече е 2.5 микро секунди, но тогава не чета вярно. Пробвах с различни стойност на изтеглящите резистори: 10к, 5к, 2,2к, и 1,5к. резултата е същия. Също така програмата работи само при забранен Slew Rate Control, SSPSTAT,SMP = 1. PORTC,3 и PORTC,4 са конфигурирани като входове, а в регистър SSPCON1 е записана константа В'00101000'. От къде може да идва проблемът? Благодаря!
|
| Чет Окт 24, 2013 10:09 pm |
|
 |
|
Dimitar
Ранг: Форумен бог
Регистриран на: Пет Ное 12, 2004 3:38 pm Мнения: 9103 Местоположение: Chicago, IL
|
 Re: Проблем с i2c шина
Свали първо честотата на клока на нещо от сорта на 100kHz за да се убедиш, че всичко работи на бавна скорост и после вдигай постепенно. Ако наистина я мъчиш на 1MHz най-вероятно е това и естествено опроводяването на самата платка може да не е както трябва. Затова първо свали клока и като тръгне стабилно всичко тогава вдигай и търси къде е ключа за бараката  .
|
| Чет Окт 24, 2013 10:18 pm |
|
 |
|
amdatlon
Ранг: Почетен член
Регистриран на: Чет Мар 19, 2009 8:33 pm Мнения: 804
|
 Re: Проблем с i2c шина
И аз имам подобно предположение. Нещо между пътечките/пиновете на елементите. Презапои ги, и почисти с нещо ( ацетон/кореселин). Скоро имах подобен проблем с памет. Като пипна с пръст започва да дава данни. Или като я намокря с ацетон. После като поизсъхне , пак за забутват данните. Минах с тънка игла, м/у пиновете и се оправи работата.
|
| Чет Окт 24, 2013 11:46 pm |
|
 |
|
sparkybg
Ранг: Форумен бог
Регистриран на: Вто Авг 23, 2005 12:02 pm Мнения: 3070 Местоположение: София
|
 Re: Проблем с i2c шина
С почти същия процесор и със съвсем същата памет, на около 10 сантиметра от процесора, навързана на обща шина с един DAC + 2 потенциометъра. Никакви грижи. Всичко си тръгна от раз. Търси някакъв хардуерен проблем според мен.
|
| Пет Окт 25, 2013 12:04 am |
|
 |
|
Desert Leo
Ранг: Форумен бог
Регистриран на: Чет Фев 10, 2005 3:25 pm Мнения: 5677 Местоположение: София
|
 Re: Проблем с i2c шина
|
| Пет Окт 25, 2013 7:22 am |
|
 |
|
Nikolay_90
Ранг: Минаващ
Регистриран на: Пет Дек 07, 2007 1:21 pm Мнения: 31 Местоположение: Varna
|
 Re: Проблем с i2c шина
Благодаря за бързите отговори. Оказа се, че като забраня PLL всичко работи нормално. Чете и записва на 100KHz при SSPADD = 0х27 и на 400KHz при SSPADD = 0х09 както е по таблицата. Да....сметките не излизат вярно така е. В началото си мислех че Baud Rate генератора взима такт от тактовия генератор, преди множителя, а не е така. Те хората са го написали но кой да види: "The BRG count is decremented twice per instruction cycle (TCY) on the Q2 and Q4 clocks." Дори и така, ако не бъркам при SSPADD = 0х27 и разрешен PLL трябва да имам честота 400KHz(64000000/(4*(39+1))), при SSPADD = 0х9F и разрешен PLL трябва да имам честота 100KHz(64000000/(4*(159+1))). Само че при четене получавам 0xFF. Спойките по платката ги презапоих и почистих. Другото странно нещо (а може и да не е странно само на мен така да ми се струва  ) е че като намалям стойността на изтеглящите резистори предния фронт на импулса не става по стръмен ами точно обратното. Това нормално ли е?
|
| Пет Окт 25, 2013 12:02 pm |
|
 |
|
sparkybg
Ранг: Форумен бог
Регистриран на: Вто Авг 23, 2005 12:02 pm Мнения: 3070 Местоположение: София
|
 Re: Проблем с i2c шина
Е то за да няма такива обърквации, първоначално може да ползваш микрочипските библиотеки, и чак после ако нещо не ти каресва да си правиш собствени, или да пишеш директно по регистри. Мисля че имаше функция, на която задаваш в параметър честотата на I2C-то, и тя си прави останалото например. После, като тръгне по тоя начин, поне си сигурен че хардуера не е проблем.
Друго - прочети внимателно даташита на паметта. Има там едни изчаквания след писане, че да може да четеш. Има и начин за проверка кога чипа е готов. и т.н.
На мен ми трябваше едно внимателно прочитане и на двата чаршафа, и всичко си тръгна от раз, първо на 100, а после и на 400khz. Хем ми беше сефтето с I2C шина въобще. Първо подкарах DAC-а и потенциометрите, че там е само писане, а накрая и паметта, където е и писане и четене.
Ако се не лъжа - като подадеш команда за четене, паметта трябва да ти върне ACK, ако е готова за това. Не знам какво връща като прочетени данни и дали връща въобще нещо или зависва. Просто при мен тръгна от първия път, та не съм експериментирал.
Трябва да предвидиш и някакъв механизъм за "отпушване" на шината след зависване, иначе докато дебъгваш ще береш ядове и постоянно ще трябва да включваш/изключваш захранване.
|
| Пет Окт 25, 2013 12:58 pm |
|
 |
|
Nikolay_90
Ранг: Минаващ
Регистриран на: Пет Дек 07, 2007 1:21 pm Мнения: 31 Местоположение: Varna
|
 Re: Проблем с i2c шина
Там е работата, че аз пиша на Асемблер и не мога да ползвам готови библиотеки. А иначе след като се подаде команда за четене, паметта връща ACK Следващата стъпка е master да разреши четенето. След като последния получи данните не се генерира ACK. Това само че важи ако се чете един байт от паметта. Ако се четат повече от един след всеки байт master трябва да генерира ACK. То е описано подробно в datasheet-а на паметта
|
| Пет Окт 25, 2013 1:41 pm |
|
 |
|
Desert Leo
Ранг: Форумен бог
Регистриран на: Чет Фев 10, 2005 3:25 pm Мнения: 5677 Местоположение: София
|
 Re: Проблем с i2c шина
Nikolay_90, гледам, че си активирал PLL-а. Скорости ли гониш или сбит код, че караш на Асемблер?
|
| Пет Окт 25, 2013 8:11 pm |
|
 |
|
Nikolay_90
Ранг: Минаващ
Регистриран на: Пет Дек 07, 2007 1:21 pm Мнения: 31 Местоположение: Varna
|
 Re: Проблем с i2c шина
Правя един четец за RFID карти на 125KHz. Кодът на картата се записва във външен EEPROM. Капацитетът е 1200 карти. Понеже за пръв път се занимавам с четене на манчестър код, реших че бързодействието е много важно. А днес след упорити проби да прочета EEPROM-а вярно при включен PLL и при неуспех, реших да променя референтните времена на синхронизацията с кода така че да работи с такт 16MHz и сега е ОК. А що се отнася до Асемблера, на него започнах да пиша преди близо 6 години и до ден днешен все с него си продължавам.
|
| Пет Окт 25, 2013 9:07 pm |
|
|
|
Страница 1 от 1
|
[ 10 мнения ] |
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 1 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|