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

Проблем с i2c шина
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=11852
Страница 1 от 1

Автор:  Nikolay_90 [ Чет Окт 24, 2013 10:09 pm ]
Заглавие:  Проблем с 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'. От къде може да идва проблемът?
Благодаря!

Автор:  Dimitar [ Чет Окт 24, 2013 10:18 pm ]
Заглавие:  Re: Проблем с i2c шина

Свали първо честотата на клока на нещо от сорта на 100kHz за да се убедиш, че всичко работи на бавна скорост и после вдигай постепенно. Ако наистина я мъчиш на 1MHz най-вероятно е това и естествено опроводяването на самата платка може да не е както трябва. Затова първо свали клока и като тръгне стабилно всичко тогава вдигай и търси къде е ключа за бараката :) .

Автор:  amdatlon [ Чет Окт 24, 2013 11:46 pm ]
Заглавие:  Re: Проблем с i2c шина

И аз имам подобно предположение.
Нещо между пътечките/пиновете на елементите.
Презапои ги, и почисти с нещо ( ацетон/кореселин).
Скоро имах подобен проблем с памет. Като пипна с пръст започва да дава данни. Или като я намокря с ацетон. После като поизсъхне , пак за забутват данните.
Минах с тънка игла, м/у пиновете и се оправи работата.

Автор:  sparkybg [ Пет Окт 25, 2013 12:04 am ]
Заглавие:  Re: Проблем с i2c шина

С почти същия процесор и със съвсем същата памет, на около 10 сантиметра от процесора, навързана на обща шина с един DAC + 2 потенциометъра. Никакви грижи. Всичко си тръгна от раз. Търси някакъв хардуерен проблем според мен.

Автор:  Desert Leo [ Пет Окт 25, 2013 7:22 am ]
Заглавие:  Re: Проблем с i2c шина

Nikolay_90 написа:
OSC - HS 16MHz х 4PLL тактова честота 64MHz ........... 16000000/4*(9+1) = 400000 = 400KHz....

Автор:  Nikolay_90 [ Пет Окт 25, 2013 12:02 pm ]
Заглавие:  Re: Проблем с i2c шина

Благодаря за бързите отговори.
Оказа се, че като забраня PLL всичко работи нормално. Чете и записва на 100KHz при SSPADD = 0х27 и на 400KHz при SSPADD = 0х09 както е по таблицата.
Desert Leo написа:
Nikolay_90 написа:
OSC - HS 16MHz х 4PLL тактова честота 64MHz ........... 16000000/4*(9+1) = 400000 = 400KHz....

Да....сметките не излизат вярно така е. В началото си мислех че 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. Спойките по платката ги презапоих и почистих. Другото странно нещо (а може и да не е странно само на мен така да ми се струва :)) е че като намалям стойността на изтеглящите резистори предния фронт на импулса не става по стръмен ами точно обратното. Това нормално ли е?

Автор:  sparkybg [ Пет Окт 25, 2013 12:58 pm ]
Заглавие:  Re: Проблем с i2c шина

Е то за да няма такива обърквации, първоначално може да ползваш микрочипските библиотеки, и чак после ако нещо не ти каресва да си правиш собствени, или да пишеш директно по регистри. Мисля че имаше функция, на която задаваш в параметър честотата на I2C-то, и тя си прави останалото например. После, като тръгне по тоя начин, поне си сигурен че хардуера не е проблем.

Друго - прочети внимателно даташита на паметта. Има там едни изчаквания след писане, че да може да четеш. Има и начин за проверка кога чипа е готов. и т.н.

На мен ми трябваше едно внимателно прочитане и на двата чаршафа, и всичко си тръгна от раз, първо на 100, а после и на 400khz. Хем ми беше сефтето с I2C шина въобще. Първо подкарах DAC-а и потенциометрите, че там е само писане, а накрая и паметта, където е и писане и четене.

Ако се не лъжа - като подадеш команда за четене, паметта трябва да ти върне ACK, ако е готова за това. Не знам какво връща като прочетени данни и дали връща въобще нещо или зависва. Просто при мен тръгна от първия път, та не съм експериментирал.

Трябва да предвидиш и някакъв механизъм за "отпушване" на шината след зависване, иначе докато дебъгваш ще береш ядове и постоянно ще трябва да включваш/изключваш захранване.

Автор:  Nikolay_90 [ Пет Окт 25, 2013 1:41 pm ]
Заглавие:  Re: Проблем с i2c шина

Там е работата, че аз пиша на Асемблер и не мога да ползвам готови библиотеки. А иначе след като се подаде команда за четене, паметта връща ACK Следващата стъпка е master да разреши четенето. След като последния получи данните не се генерира ACK. Това само че важи ако се чете един байт от паметта. Ако се четат повече от един след всеки байт master трябва да генерира ACK. То е описано подробно в datasheet-а на паметта

Автор:  Desert Leo [ Пет Окт 25, 2013 8:11 pm ]
Заглавие:  Re: Проблем с i2c шина

Nikolay_90, гледам, че си активирал PLL-а. Скорости ли гониш или сбит код, че караш на Асемблер?

Автор:  Nikolay_90 [ Пет Окт 25, 2013 9:07 pm ]
Заглавие:  Re: Проблем с i2c шина

Правя един четец за RFID карти на 125KHz. Кодът на картата се записва във външен EEPROM. Капацитетът е 1200 карти. Понеже за пръв път се занимавам с четене на манчестър код, реших че бързодействието е много важно. А днес след упорити проби да прочета EEPROM-а вярно при включен PLL и при неуспех, реших да променя референтните времена на синхронизацията с кода така че да работи с такт 16MHz и сега е ОК. А що се отнася до Асемблера, на него започнах да пиша преди близо 6 години и до ден днешен все с него си продължавам.

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