سلام
می خواستم i2c رو یاد بگیرم، گفتم یه eeprom با رابط i2c راه بندازم.
میکرو مگا 32 هست و حافظه 24c64 مال شرکت ST
به تاپیک های زیر نگاه کردم، ولی هیچ کدوم به نتیجه نرسیده بودند.
تاپیک اول
تاپیک دوم
تاپیک سوم
یه سرچ زدم چیز زیادی نبود، فقط اینو پیدا کردم که به زبان C بود.
Easy 24C I2C Serial EEPROM Interfacing with AVR
مداری که تو لینک بالا بود رو بستم (البته با کریستال داخلی ) و برنامه ی پائینی رو که توی هلپ بسکام بود را داخل atMega32 ریختم، اما فقط 255 بر میگردونه
در ضمن e0,e1و e2 آیسی eeprom رو همش به 5 ولت وصل کردم. یعنی:
یعنی آدرس 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]