مهندس کاشکی قبل پست زدن یه سرچ میکردی !!!
از کتاب سعید یه نفر :
ارتباط سريال i2c يا 2-wire
ويژگي هاي اين ارتباط به شرح زير است:
1-
در اين ارتباط از دوسيم همرا با گراند و VCC ، که درمجموع چهار سيم مي شود ، براي انتقال ديتا استفاده مي شود
2-
بالا ترين فرکانس کلاک 400 کيلو هرتز است
3-
در اين ارتباط ميتوان تعداد نامحدود وسيله جانبي با آدرس سخت افزاري مختلف را به هم متصل کرد
4-
حداکثر طول کابل ارتباطي باسيم شيلد 80 سانتي متر است
5-
کلاک ارتباط I2C به شدت به کلاک سيستم (فرکانس کريستال ) وابسته است
براي ارتباط I2C از دو پايه SCL و SDA (PORTC.0 و PORTC.1 ميگرو مگا 16) استفاده مي شود که پايه SDA پايه داده و پايه SCL پايه کلاک ميباشد.( دو پايه مزکور پايه هاي پيش فرض ميباشند ، شما ميتوانيد با دستوراتي که گفته مي شود آنها را به پايهاي دلخواه خود تغيير دهيد)
دستورات مربوط به راه اندازي I2C :
تعيين کلاک I2C :
X ميتواند از 1 تا 255 باشد ، رابطه اي بين کلاک و عدد وجود ندارد ، مثلا براي عدد 10 کلاک 100 کيلو وبراي عدد 5 کلاک 200 کيلو و براي عدد 1 کلاک 400 کيلو هرتز است ( کلاک I2C به فرکانس کريستال وابسته است ، در اين ارتباط بايد کريستال نوشته شده در برنامه با کريستال استفاده شده يکي باشد ، همچنين کلاک هر دو دستگاه بايد مساوي باشد)
تعيين پايه هاي داده و کلاک I2C :
با دستور زير پايه SCL (پايه کلاک) تعيين مي شود :
Pin نام يکي از پايه هاي دلخواه ميکرو ميباشد .
با دستور زير پايه SDA (پايه داده) تعيين مي شود :
Pin نام يکي از پايه هاي دلخواه ميکرو ميباشد
بعد از انکه I2C پيکر بندي شد با استفاده از دستور زير ميتوان ارتباط را اغاز کرد
با اين دستور ارسال ودريافت داده شروع مي شودشما همچنين ميتوانيد با دستور زير به ارسال ودريافت داده خاتمه دهيد:
با استفاده از دستور زير ميتوان داده اي را به باس I2C فرستاد:
کد php:
I2CSEND slave, var
I2CSEND slave, var , bytes
Slave :آدرس گيرنده اطلاعات است که ميتواند به فرم يک عدد ثابت يا متغيير باشد
Var : عدد ثابت يا متغييري است که ميخواهيسم آن را ارسال کنيم
: bytesبا اين گزينه شما ميتوانيد تعداد بايت دلخواه را به باس ارسال کنيد (اين گزينه اختياري است)
فرم خلاصه شده اين دستور به شکل زير است:
Val : عدد ثابت يا متغييري است که کد دريافت شده در آن قرار ميگيرد .
مثال:
برنامه فرستنده:
کد php:
$regfile = "m32def.dat"
$crystal = 1000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Pinb.2 , Db5 = Pinb.3 , Db6 = Pinb.4 , Db7 = Pinb.5 , Rs = Pinb.0 , E = Pinb.1
Config Kbd = Porta
Config I2cdelay = 5
Config Sda = Portc.1
Config Scl = Portc.0
Dim A As Byte
I2cstart
W:
A = Getkbd()
If A > 15 Then
Goto W
End If
I2csend &H40 , A
Locate 2 , 1
Lcd A
Goto W
End
در مثال با کلاک I2C ، 200کيلو هرتز انتخاب شده است همچنين پايهSCL (پايه کلاک)به پورت c.0 ( پايه22 مگا16)و پايه SDA (پايه داده) به پين c.1 (پايه 23 مگا 16) متصل شده است.
با دستور I2cstartپروتکل i2c شروع به کار کرده وعدد گرفته شده از کيپد را بخ باس i2c ميفرستد ، براي گيرنده آدرس &h40 در نظر گرفته شده است ، براي درک بيشتر موضوع متغير ارسالي بر روي يک lcd به نمايش در ميايد.
با استفاده از دستور زير ميتوان داده اي را از باس I2C دريافت کرد:
کد php:
I2CRECEIVE slave, var
I2CRECEIVE slave, var , b2W, b2R
Slave :آدرس فرستنده اطلاعات است که ميتواند به فرم يک عدد ثابت يا متغيير باشد.
Var : عدد ثابت يا متغييري است که کد دريافت شده در آن قرار ميگيرد
: bytesبا اين گزينه شما ميتوانيد تعداد بايت دلخواه را از باس دريافت کنيد (اين گزينه اختياري است).(توجه داشته باشيد که تعداد بايت دريافتي و ارسالي بايد با هم برابر باشند در غير اينصورت اطلاعات دريافتي ناقص خواهد بود.)
فرم خلاصه شده اين دستور به شکل زير است:
Var : عدد ثابت يا متغييري است که کد دريافت شده در آن قرار ميگيرد
ack/nack :زماني که بخواهيم بيشتر از يک بايت را از باس بخوانيم بايد از ack استفاده کنيم و زماني که ميخواهيم اخرين بايت را از باس بخوانيم از nack استفاده ميکنيم.
مثال:
اين برنامه مربوط به گيرنده مداري است که برنامه آن را در بالا مشاهده فرموديد:
کد php:
$regfile = "m32def.dat" : $crystal = 1000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Pina.0 , Db5 = Pina.1 , Db6 = Pina.2 , Db7 = Pina.3 , Rs = Pina.4 , E = Pina.5
Config I2cdelay = 5
Config Sda = Portc.1
Config Scl = Portc.0
Dim A As Byte
I2cstart
W:
I2creceive &H40 , A
If A < 16 Then : Locate 1 , 1 : Lcd A : End If
Goto W
End
در مثال بالا کلاک I2C ، 200 کيلو هرتز(Config I2cdelay = 5) انتخاب شده است همچنين پايهSCL (پايه کلاک)به پورت c.0 ( پايه22 مگا16)و پايه SDA (پايه داده) به پين c.1 (پايه 23 مگا 16) متصل شده است.
با دستور I2cstartپروتکل i2c شروع به کار کرده وعدد گرفته شده از باس را بر روي lcd نمايش ميدهد ، براي فرستنده آدرس &h40 در نظر گرفته شده است .