ايران ويج

نسخه‌ی کامل: راه اندازی 24c64 با AVR
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
سلام
می خواستم i2c رو یاد بگیرم، گفتم یه eeprom با رابط i2c راه بندازم.
میکرو مگا 32 هست و حافظه 24c64 مال شرکت ST

به تاپیک های زیر نگاه کردم، ولی هیچ کدوم به نتیجه نرسیده بودند.
تاپیک اول

تاپیک دوم

تاپیک سوم

یه سرچ زدم چیز زیادی نبود، فقط اینو پیدا کردم که به زبان C بود. Biggrin
Easy 24C I2C Serial EEPROM Interfacing with AVR

مداری که تو لینک بالا بود رو بستم (البته با کریستال داخلی ) و برنامه ی پائینی رو که توی هلپ بسکام بود را داخل atMega32 ریختم، اما فقط 255 بر میگردونه Biggrin
[attachment=5518]
در ضمن e0,e1و e2 آیسی eeprom رو همش به 5 ولت وصل کردم. یعنی:

[attachment=5517]
یعنی آدرس eeprom برای خواندن 10101111 معادل عدد 175 در مبنای 10 و آدرس برای نوشتن 10101110 معادل عدد 174 در مبنای 10 است.

مقدار pullup ها هم روی خطوط scl و sda ، را طبق نقشه 4.7 کیلو گذاشتم.

WC (همان Write Protect) را هم زمین کردم(GND) تا بتونم بنویسم.

------------
حالا مشکل من:

هر کاری می کنم ، نمی تونم بنویسم یا بخونم.
با مقاومت های pullup ، مقدار های خوانده شده، برابر 255 و بدون pullup ها 0 هستند(بعضی وقت ها هم اعدادی میان 0 و 255)

کسی تجربه ای با این eeprom ها داره، به منم کمک کنه، گیرم.

این برنامه:
کد:
$regfile = "m32def.dat"
$crystal = 1000000
$baud = 1200
Config Scl = Portb.4
Config Sda = Portb.5

Config Lcdpin = Pin , Db4 = Porta.2 , Db5 = Porta.3 , Db6 = Porta.4 , Db7 = Porta.5 , E = Porta.1 , Rs = Porta.0
Config Lcd = 16 * 2

Declare Sub Write_eeprom(byval Adres As Byte , Byval Value As Byte)
Declare Sub Read_eeprom(byval Adres As Byte , Value As Byte)


Const Addressw = 174 'slave write address
Const Addressr = 175

Dim B1 As Byte , Adres As Byte , Value1 As Byte , Value2 As Byte 'dim byte






Value1 = 101
Value2 = 102


Call Write_eeprom(2 , 170) 'write value of three to address 1 of EEPROM
Call Read_eeprom(2 , Value1)
Call Read_eeprom(2 , Value2)

Home
Lcd Value1
Locate 2 , 1
Lcd Value2






End




Sub Write_eeprom(byval Adres As Byte , Byval Value As Byte)

I2cstart 'start condition

I2cwbyte Addressw 'slave address

I2cwbyte Adres 'asdress of EEPROM

I2cwbyte Value 'value to write

I2cstop 'stop condition

Waitms 10 'wait for 10 milliseconds

End Sub





'sample of reading a byte from EEPROM AT2404

Sub Read_eeprom(byval Adres As Byte , Value As Byte)

I2cstart 'generate start

I2cwbyte Addressw 'slave adsress

I2cwbyte Adres 'address of EEPROM

I2cstart 'repeated start

I2cwbyte Addressr 'slave address (read)

I2crbyte Value , Nack 'read byte

I2cstop 'generate stop

End Sub

اینم دیتاشیت 24c64 شرکت ST:
[attachment=5519]
دوباره سلام.

1. اینکه به سوال من جواب نمی دید 2 حالت داره:-سوالم خیلی سخته(که نیست) - سوالم خیلی چرته

نصف شبه، الان فهمیدم... دو بایت!!

2. اشکال برنامه ی بالا، در قسمت فرستادن آدرس داخلی هست.

طبق دیتاشیت، سایز آدرس داخلی معادل دو بایت هست(16 بیت)
پس باید آدرس داخلی رو به جای یک بایت در دو بایت بفرستیم.

برای مثال:
اگر آدرس داخلی 0 مدنظر باشد، پس به جای یک بار فرستادن 0، آنرا دوبار پشت سر هم میفرستیم.(البته چون صفر است، اگر نبود با شیفت ، بغلش صفر می گذاشتیم بعد در قالب 2 بایت ارسال می کردیم.)
(یکم فکر کنید می فهمید چی میگم. چون می دونم خیلی بد توضیح دادم :-[O) )