| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| Проблем с 24LC0x памети на Microchip http://mcu-bg.com/mcu_site/viewtopic.php?f=2&t=1408 |
Страница 1 от 1 |
| Автор: | Vanko [ Нед Дек 11, 2005 8:49 pm ] |
| Заглавие: | Проблем с 24LC0x памети на Microchip |
Здравейте, За първи път пиша във форум и то по проблем който от 10 месеца ще ми изяде главата. Та значи, имам си едно устройство което пише чат-пат в EEPROM (24LC01,04) по I2C. Софта за управлението на I2C е от 2000 година (за Atmel 89C52), но този април забелязах необясним проблем върху някои екземпляри чипове памет: ако се наложи в EEPROM-a да се запише стойност по-голяма от 127 (7FH), всички следващи байтове които четя, са твърдо 255 (FFH). Гледах кода, чудех се, маех се, променях времена та белкем докарам всички възможни и невъзможни режими на работа, но за тези екземпляри този проблем оставаше в сила. Веднага установих че не е endurance проблем, защото ако сменях адреса на байта > 127, то проблемите започваха оттам. Стигнах до там че си поръчах DSO+LA от Dynon (ELAB-080 - може лесно да се намери описание+free soft в нет-а). Гледам му диаграмките - приказка. Обаче при четене... от първия байт в който съм бил записал 255(или > 127) до последния - все 255-ци. И това от април месец насам. Чиповете са купувани от Комет-а (Comet) горе-долу малко преди април. Интересно, но старите устройства правени преди да купя тези чипове от 2000 година насам, са железни. Същевременно закупих всякакви I2C Microchip-ски памети от комет-а с различни дати на производство, но все се появяваше този проблем. Дори взех 33 MIPS-ов процесор (DS89C420). Най-голямата гадост обаче е че ако един чип днес работи, нищо не ми гарантира че след (макс. до) 2 месеца няма да започне да прави тази магария. А аз, време да поддържам устройството в другия край на страната нямам, затова и не го развивам. Но държа клиентите да са доволни и да нямат проблеми. Та има ли някой подобен проблем? Ако някой може да помогне, много ще ме зарадва защото вече нямам идеи време и нерви да го чопля. Мога да приложа и диаграми на сигналите в случай на "добра" памет и "лоша" за моя уред ELAB-080). При изтегляне на софта, може лесно да се разгледат сигналите. Поздрави, Иван. |
|
| Автор: | ¶ [ Нед Дек 11, 2005 10:56 pm ] |
| Заглавие: | |
... |
|
| Автор: | Цецо [ Пон Дек 12, 2005 12:03 pm ] |
| Заглавие: | |
Прилича ми на софтуерен бъг или бъг в хардуера на процесора. I2C памети се ползват вече 10 години къде ли не, няма начин подобен проблем да остане скрит. А и както го описваш не е само на конкретен тип. Така, че съм склонен да оневиня паметите в твоя случай. |
|
| Автор: | Vanko [ Пон Дек 12, 2005 3:36 pm ] |
| Заглавие: | |
Току що минах през Futurel-a и взех памети на Atmel и SGS Tompson. Да ги видя те как ще се държат. А иначе възможно е и софта да не е наред, но сравнявах версиите от 2001,2 година - същото, не съм пипал тази част от кода изобщо. Тази вечер ще сложа във форума диаграмите които свалих с ELAB-a. За да ги рагледате и Вие ще Ви е нужно само да изтеглите софт-а от сайта на производителя. Дано някой нещо забележи. За мен са добри. Докарвах и на честота и на времена... Според мен са добри сигналите. Протокола мисля също че е спазен. Не знам - лудост някаква. Седя и си мисля дали пък не е нещо от рода: изморена памет |
|
| Автор: | ¶ [ Пон Дек 12, 2005 4:20 pm ] | |||||||||
| Заглавие: | ||||||||||
Нещо не мога да разбера, как така ще записваш 145 байта наведнъж ? Най-големите памети позволяват запис на 128 байта буфер наведнъж, т.е. ако искаш повече от 128 байта, трябва първо да генерираш стоп сигнала, да полираш до края на записа или просто да изчакаш няколко милисекунди и тогава да продължиш със следващия запис. Ако I2C-то ти е софтуерно и е на C, постни ако не е проблем кода, оттам най-лесно може да се ориентира човек. Значи аз използвам следния код и нямам дертове:
|
||||||||||
| Автор: | Vanko [ Пон Дек 12, 2005 5:22 pm ] |
| Заглавие: | |
Точно това правя: на микрочип паметите имат буфер 8 или 16 байта (LC04 e 16). Пиша в него започвайки от хххх0000 за младшите битове и при превъртане пращам Stop. След което пуулвам докато АСК-а ми се потвърди (свали), след което продължавам със следващата порция от 16 байта. И това се върти докато завърша с буфера. Изял съм им даташеет-а до последната буква. Инак малко по-нататък ще погледна кода който си постнал да видя дали няма да изкочи някой заек Благодаря за отзивчивостта. |
|
| Автор: | Vanko [ Пон Дек 12, 2005 5:25 pm ] |
| Заглавие: | |
На Паскал е кода, но чак довечера ще мога да го постна. |
|
| Автор: | Vanko [ Вто Дек 13, 2005 3:17 pm ] |
| Заглавие: | |
Пустите му ланки, нямах нет снощи. Ето резултатите от теста на паметите на Atmel, SGS-Thomson ИИИИИ победителя отзад напред Microchip: 1. Участници: по 10 броя от всяка марка, устройство с CPU DS89C420+Reset схема, индикатори-12 броя. 2. Начин на тестване: 2.1. Нормален - Запис на 145 байта с пуулинг (буфер 16) - Последователно четене на 145 байта. 2.2. Стресов - шашкане на захранването, статично напрежение, магнитно поле - от демагнетизатор на кинескопи - Запис на 145 байта с пуулинг (буфер 16) - Последователно четене на 145 байта. Резултати. Демагнетизатора шашка всички, но в най-малка степен SGS-Thomson. Този тест специално не ми се струва много коректно да съотнасям само към паметите, защото CPU-то и RESET схемата особено най-много се шашкат. По другите показатели : 1. Атмел: Нито един чип който да откаже, или да извърши некоректна операция. Средно време за запис на буфера [/b]1.349 мс[b] 2. SGS-Thomson: Нито един чип който да откаже, или да извърши некоректна операция. Средно време за запис на буфера 2.4 мс 3. Out of order-Мicrochip: от 10 чипа, само 4 отказоха да се справят с FF проблема. Държа да отбележа обаче че информацията записана до преди FF беше и остана коректна на цели 4 от "останалите работещи" 6. Разликата от 2 чипа дойде от стресовия тест-там не издържаха завалиите. Та за моите нужди най-добър се оказа Атмелския чип. Ако мога да съм полезен, ето и маркировката на Микрочипския звяр: 24LC04BI/P28K 0426 За останалите... просто не си ги записах но са все 2004 година произведени. В заключение: 1. Не съм тествал чиповете на RHOM, които могат да се вземат от Комет-а. Но не се съмявам че ще работят коректно. Те обаче са с по-слаби характеристики: време на запис около 10мс, брой записи макс 100 000. 2. За моментното състояние на пазара в БГ аз лично препоръчвам Атмел и SGS-Thomson. И да не правя реклама, но май бях постнал от къде съм ги взел. 3. Както бях обещал ще публикувам листинга на кода писан на паскал за 8051. Имам един допотопен компилатор Специални благодарности на всички които се отзоваха по този проблем! |
|
| Автор: | Цецо [ Вто Дек 13, 2005 3:51 pm ] |
| Заглавие: | |
Ей това е полезна информация. Тестове - резултати, статистика. Браво. Естествено всеки може да подложи на съмнение Микрочипския провал, ама при положение че цената на паметите е в един порядък, що да си вкарва човек излишни проблеми. |
|
| Автор: | ¶ [ Вто Дек 13, 2005 5:08 pm ] |
| Заглавие: | |
... |
|
| Автор: | Реконструктор [ Вто Дек 13, 2005 6:17 pm ] |
| Заглавие: | |
Знам ли, аз използвах в Устройството памет тип 24LC515 на Майкрочип, забележки не са се появявали. Даже при четене стигнах до скорост от около 800 KHz. |
|
| Автор: | Vanko [ Вто Дек 20, 2005 1:30 am ] |
| Заглавие: | |
Едни проблеми ме утрепаха, като за капак и Windows-a ми искаше да активирам копието си съвместно с Microsoft... Само бели... Та, ето го кода на Pascal: -------------------------------- const I2CMask = %00011000; I2CSlave = $A0; I2CRead = I2CSlave or $01; {$IFDEF 04} I2CRollOver = %0000000000001111; { 16 bytes for 24LC04 } I2CRollOverNOT = %1111111111110000; {$ELSE} I2CRollOver = %0000000000000111; { 8 bytes for 24LC01 } I2CRollOverNOT = %1111111111111000; {$ENDIF} var I2Cbit, ByteToSend: byte DATA; I2CAddr, I2CBegin: word DATA; procedure PD; begin GA:=GA; GA:=GA; { Fictive. } {$IFDEF CheckStack} if SP > MaxSP then MaxSP:=SP; {$ENDIF} end; procedure Start; begin Port_OR(P3, I2CMask); PD; { SCLSDA(1, 1); } { SDA:=true; SCL:=true; PD;} SDA:=false; PD; PD; PD; PD; SCL:=false; PD; end; { Start } procedure StartInit; begin Port_OR(P3, I2CMask); PD; { SCLSDA(1, 1); } while not SDA do begin SCL:=false; PD; SCL:=true; PD; end; SDA:=false; PD; PD; PD; PD; SCL:=false; PD; end; { StartInit } procedure Stop; begin Port_AND(P3, not I2CMask); PD; { SCLSDA(0, 0); } { SDA:=false; PD;} SCL:=true; PD; PD; PD; PD; SDA:=true; PD; end; { Stop } procedure StopInit; begin Port_AND(P3, not I2CMask); PD; { SCLSDA(0, 0); } SCL:=true; PD; PD; PD; PD; SDA:=true; PD; end; { StopInit } procedure OneCycle; begin SCL:=true; PD; PD; PD; PD; SCL:=false; PD; end; { OneCycle } procedure GetAck; begin { Port_OR(P3, I2CMask); PD; { SCLSDA(1, 1); } SDA:=true; PD; SCL:=true; PD; PD; PD; PD; GA:=SDA; SCL:=false; PD; end; { GetAck } procedure SendAck; begin { Port_AND(P3, not I2CMask); PD; { SCLSDA(0, 0); } SDA:=false; PD; OneCycle; end; { SendAck } procedure NoAck; begin { Port_OR(P3, I2CMask); PD; { SCLSDA(1, 1); } SDA:=true; PD; SCL:=true; PD; SCL:=false; PD; end; { NoAck } procedure SendByte; begin for I2Cbit:=1 to 8 do begin ACC:=ByteToSend; SDA:=ACC.7; ByteToSend:=ByteToSend shl 1; OneCycle; end; end; { SendByte } const mo = 0 {3*48}; procedure SetI2CSlave; begin ByteToSend:=Hi(I2CAddr + mo) and %00000001; ByteToSend:=I2CSlave or (ByteToSend shl 1); SendByte; GetAck; end; { SetI2CSlave } procedure SetI2CRead; begin ByteToSend:=Hi(I2CAddr + mo) and %00000001; ByteToSend:=I2CRead or (ByteToSend shl 1); SendByte; GetAck; end; { SetI2CRead } procedure Load; var i: byte XDATA; begin { I2CAddr:=0;} if I2CAddr > MaxBuffPerSave-1 then exit; repeat ResetWDT; Start; SetI2CSlave; if not GA then begin ByteToSend:=Lo(I2CAddr +mo); SendByte; GetAck; if not GA then begin Start; SetI2CRead; end; end; if GA then begin Stop; end; until not GA; for i:=I2CAddr to MaxBuffPerSave-1 do begin B:=0; for I2Cbit:=1 to 8 do begin Port_OR(P3, I2CMask); { SCLSDA(1, 1); } B:=B shl 1; B:=B + ord(SDA); SCL:=false; PD; end; if i = MaxBuffPerSave then NoAck else SendAck; Buff[i]:=B; end; Stop; ResetWDT; end; { Load } procedure Save; begin { I2CAddr:=$00;} if I2CAddr > MaxBuffPerSave-1 then exit; I2CBegin:=I2CAddr; repeat ResetWDT; Start; SetI2CSlave; if not GA then begin ByteToSend:=Lo(I2CAddr +mo); SendByte; GetAck; if not GA then begin repeat ByteToSend:=Buff[I2CAddr]; SendByte; GetAck; if not GA then inc(I2CAddr); until (I2CAddr and I2CRollOver = %0000000000000000) or (I2CAddr >= MaxBuffPerSave) or GA; if not GA then Stop else if I2CBegin > (I2CAddr and I2CRollOverNOT) then I2CAddr:=I2CBegin else I2CAddr:=I2CAddr and I2CRollOverNOT; end; end; { if not GA then } until (I2CAddr >= MaxBuffPerSave); ResetWDT; HaveToSave:=false; end; { Save } ---------------------------------------------------------------------------------------------------- Може нещо да съм изпуснал но бързо ще се разбере като се разгледа добре. Коментирания код на I2C примитивите е резултат от опитите да докарам всички скорости и времена на импулсите. Инак Атмелските памети си работят така както и Микрочипските преди да ги развалят. А и се сетих че за някой може да е интересен DSO-то който си купих. Малко е дървено откъм интерфейс но инак става: http://www.dynoninstruments.com/index.html Още веднъж благодаря на всички които взеха присърце терзанията ми. Много нерви щях да спестя ако се бях поразтърсил по-отрано и бях купил някакви други памети... но така разбрах че има и други доставчици на този свят |
|
| Страница 1 от 1 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|