اطلاعیه

Collapse
No announcement yet.

i2c در کدویژن

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    i2c در کدویژن

    دوستان سلام .
    من میخام با استفاده از پروتکل i2c از یه srf08 ویه ماژول کامپس استفاده کنم . کدهای آماده تو نت بود ولی من خیلی سر در نمیارم که تو کدویژن باید چجوری مقدار اینارو خوند . مثلا تو این کد
    unsigned int SRF(int address)
    {
    //SRF02
    int LSB,MSB;
    i2c_start();
    i2c_write(address);
    i2c_write(0x00);
    i2c_write(0x51);
    i2c_stop();
    i2c_start();
    i2c_write(address);
    i2c_write(0x02);
    i2c_start();
    i2c_write(address+1);
    MSB=i2c_read(0);
    i2c_stop();
    i2c_start();
    i2c_write(0x03);
    i2c_start();
    i2c_write(address+1);
    LSB=i2c_read(0);
    i2c_stop();
    return (256 * MSB) + LSB;
    }

    میخام یکی خط به خطشو بهم بگه تا ببینم چجوری باید با i2c کار کرد
    فقط میدونم هر ماژولی یه آدرس داره که اونم تو دیتاشیتشه . نمیدونم چجوری آدرسو باید فراخوانی کرد و اینا ....... اگه جواب بدین واقعا کمک بزرگی کردین
    تو نت هم خییییلی گشتم تو این سه چهار روز ولی توضیحاتش خیلی اضافس آدم سردرنمیاره

    #2
    پاسخ : i2c در کدویژن

    سلام
    توی I2C اول باید آدرس IC ای که باهاش کار داری رو میدی. چون میتونی چند تا IC رو با I2c به میکرو وصل کنی. 127 تا
    من با EEPROM خارجی که کار کردم، اینجوری بود که 3 تا از پایه های IC به اسم A2، A1، A0 برای آدرس دهی هستن
    مثلا هر سه تا رو اگه 0 کنی، یعنی میشه 000 باینری که میشه عدد 0. یعنی آدرس این IC میشه 0
    پس میای و این رو به صورت Define# تعریف میکنی
    اینجا منظورش این بوده: البته اگه آدرس 000 رو داده باشه (یعنی پایه ها رو اونجوری وصل کرده باشه)
    [code=c]#define address 0x00[/code]

    البته 7 بیت با ارزش بالاش واسه آدرس سخت افزاره و بیت کم ارزشش (بیت شماره 0) برای اینه که بگیم میخوایم بهت اطلاعات بفرسیم یا ازت اطلاعات بگیریم

    کلا 2 تا آدرس داریم. یکیش میاد و مشخص میکنه که با کدوم IC کار داری (چون ممکنه چند تا IC از طریق I2C به میکرو وصل باشه)
    یه آدرس هم داریم برای مشخص کردن اینکه با کدوم خونه از حافظه IC کار داریم (من دارم حافظه رو مثال میزنم)
    چون 65535 تا خونه داره و برای آدرس دهی نیاز به 2 بایت داره (چون توی دیجیتال همه چیز از 0 شروع میشه، پس از 0 تا 65535، میشه 65536 تا خونه. 65536 میشه 2تا 8تایی. که هر 8 تا میشه 1 بایت. پس یعنی 2 بایت..... چی گفتم اصلا؟ :nerd

    این عکس قسمتی از Datasheet یه EEPROM خارجی به شماره AT24C512 هست که با I2C کار میکنه



    همونطور که میبینی، برای شروع ارتباط، باید start فرستاده بشه. توی کتابخونه ای که توی کدویژن هست، دستور زیر ( :NO این کار رو انجام میده:
    [code=c]i2c_start();[/code]
    دستور بعدیش میاد و آدرس IC مورد نظر رو میده. البته 7 بیت بالاش برا آدرس هست و بیت 0 اش برای اینه که میخوایم توش بنویسیم (آدرسی که اول توضیح دادم و توی عکس هم نوشته Device Address)
    یعنی اینجوریه:
    _ 0 0 0 0 0 0 0: این برای آدرس سخت افزار. یعنی بگیم با کدوم IC کار داریم
    0 _ _ _ _ _ _ _: اینم یعنی اینکه میخوایم توش بنویسیم
    پس ترکیب اینا باهم میشه 0 0 0 0 0 0 0 0

    دستور بعدی آدرس خونه حافظه مورد نظر رو میفرسته (چون میکرو های ما 8 بیتی هستند و آدرس ما 16 بیتی هست، پس باید اول 8 بیت با ارزش بالا رو بفرستیم و در خط بعد باید 8 بیت با ارزش پایین رو بفرستیم)
    توی عکس بالا، چون واسه حافظه هست، بعدش باید توش بنویسیم (همین که نوشته Data)، ولی واسه شما حافظه نیست. پس Data ای نداریم و بعدش Stop میکنیم. که نوشته:
    [code=c]
    i2c_write(0x00);
    i2c_write(0x51);
    [/code]
    حالا اون IC فهمیده که باهاش کار داریم (چون Address دادیم) و میدونه که باهاش چیکار داریم (آدرس دومی که دادیم)
    پس باید بهمون اطلاعات بده
    حالا چجوری ازش اطلاعات رو بگیریم؟؟؟
    پس دوباره I2C رو Start میکنیم
    توی خط بعدیش آدرس اینکه با کدوم حافظه کار داریم رو میفرستیم
    >> سوال: چرا نوشته address+1 ؟؟؟؟؟
    >> جواب: چون برای اینکه بخوایم آدرس بدیم مینویسیم: _ 0 0 0 0 0 0 0 و برای اینکه بگیم میخوایم ازت اطلاعات بگیریم باید 1 _ _ _ _ _ _ _ رو بفرستیم. پس ترکیبشونم میشه 1 0 0 0 0 0 0 0
    اینکه نوشته address+1 هم یعنی همین: 1 0 0 0 0 0 0 0 = 1 + 0 0 0 0 0 0 0 0
    بعدش برای اینکه پاسخ رو از IC دریافت کنیم باید این دستور رو بفرستیم:
    [code=c]
    i2c_read(0);
    [/code]
    که اومده این رو مساوی با یه متغیر به اسم MSB قرار داده
    بعدش هم ارتباط رو متوقف کرده
    بهدش دوباره این رو برای یه آدرس دیگه یا کار دیگه تکرار کرده. البته با یه آدرس حافظه دیگه

    اینا که من گفتم برا همه تقریبا مشترکه. با این تفاوت که توی IC های EEPROM خارجی، این دستورا برای دسترسی به حافظه هست، ولی شاید توی IC های دیگه برای دسترسی به اطلاعاتی باشه
    توی Datasheet اش نوشته که برای هر کاری چه دستوری میخواد (یعنی آدرس دوم)
    کلا آدرس دوما تعیین میکنه که چه کاری انجام میده. مثلا برای EEPROM خارجی آدرس خونه حافظه رو میده، توی یه IC دیگه مثلا معنیش این باشه که دما رو بده
    ولی آدرس اول خب مشخصه که برا همه یه معنی رو میده. اونم این که میکرو مشخص میکنه که با کی (کدوم IC) کار دارم.
    http://www.eca.ir/forum2/index.php?topic=108455.msg777842#msg777842

    دیدگاه


      #3
      پاسخ : پاسخ : i2c در کدویژن

      نوشته اصلی توسط سامان تقی پور
      سلام
      توی I2C اول باید آدرس IC ای که باهاش کار داری رو میدی. چون میتونی چند تا IC رو با I2c به میکرو وصل کنی. 127 تا
      من با EEPROM خارجی که کار کردم، اینجوری بود که 3 تا از پایه های IC به اسم A2، A1، A0 برای آدرس دهی هستن
      مثلا هر سه تا رو اگه 0 کنی، یعنی میشه 000 باینری که میشه عدد 0. یعنی آدرس این IC میشه 0
      پس میای و این رو به صورت Define# تعریف میکنی
      اینجا منظورش این بوده: البته اگه آدرس 000 رو داده باشه (یعنی پایه ها رو اونجوری وصل کرده باشه)
      [code=c]#define address 0x00[/code]

      البته 7 بیت با ارزش بالاش واسه آدرس سخت افزاره و بیت کم ارزشش (بیت شماره 0) برای اینه که بگیم میخوایم بهت اطلاعات بفرسیم یا ازت اطلاعات بگیریم

      کلا 2 تا آدرس داریم. یکیش میاد و مشخص میکنه که با کدوم IC کار داری (چون ممکنه چند تا IC از طریق I2C به میکرو وصل باشه)
      یه آدرس هم داریم برای مشخص کردن اینکه با کدوم خونه از حافظه IC کار داریم (من دارم حافظه رو مثال میزنم)
      چون 65535 تا خونه داره و برای آدرس دهی نیاز به 2 بایت داره (چون توی دیجیتال همه چیز از 0 شروع میشه، پس از 0 تا 65535، میشه 65536 تا خونه. 65536 میشه 2تا 8تایی. که هر 8 تا میشه 1 بایت. پس یعنی 2 بایت..... چی گفتم اصلا؟ :nerd

      این عکس قسمتی از Datasheet یه EEPROM خارجی به شماره AT24C512 هست که با I2C کار میکنه



      همونطور که میبینی، برای شروع ارتباط، باید start فرستاده بشه. توی کتابخونه ای که توی کدویژن هست، دستور زیر ( :NO این کار رو انجام میده:
      [code=c]i2c_start();[/code]
      دستور بعدیش میاد و آدرس IC مورد نظر رو میده. البته 7 بیت بالاش برا آدرس هست و بیت 0 اش برای اینه که میخوایم توش بنویسیم (آدرسی که اول توضیح دادم و توی عکس هم نوشته Device Address)
      یعنی اینجوریه:
      _ 0 0 0 0 0 0 0: این برای آدرس سخت افزار. یعنی بگیم با کدوم IC کار داریم
      0 _ _ _ _ _ _ _: اینم یعنی اینکه میخوایم توش بنویسیم
      پس ترکیب اینا باهم میشه 0 0 0 0 0 0 0 0

      دستور بعدی آدرس خونه حافظه مورد نظر رو میفرسته (چون میکرو های ما 8 بیتی هستند و آدرس ما 16 بیتی هست، پس باید اول 8 بیت با ارزش بالا رو بفرستیم و در خط بعد باید 8 بیت با ارزش پایین رو بفرستیم)
      توی عکس بالا، چون واسه حافظه هست، بعدش باید توش بنویسیم (همین که نوشته Data)، ولی واسه شما حافظه نیست. پس Data ای نداریم و بعدش Stop میکنیم. که نوشته:
      [code=c]
      i2c_write(0x00);
      i2c_write(0x51);
      [/code]
      حالا اون IC فهمیده که باهاش کار داریم (چون Address دادیم) و میدونه که باهاش چیکار داریم (آدرس دومی که دادیم)
      پس باید بهمون اطلاعات بده
      حالا چجوری ازش اطلاعات رو بگیریم؟؟؟
      پس دوباره I2C رو Start میکنیم
      توی خط بعدیش آدرس اینکه با کدوم حافظه کار داریم رو میفرستیم
      >> سوال: چرا نوشته address+1 ؟؟؟؟؟
      >> جواب: چون برای اینکه بخوایم آدرس بدیم مینویسیم: _ 0 0 0 0 0 0 0 و برای اینکه بگیم میخوایم ازت اطلاعات بگیریم باید 1 _ _ _ _ _ _ _ رو بفرستیم. پس ترکیبشونم میشه 1 0 0 0 0 0 0 0
      اینکه نوشته address+1 هم یعنی همین: 1 0 0 0 0 0 0 0 = 1 + 0 0 0 0 0 0 0 0
      بعدش برای اینکه پاسخ رو از IC دریافت کنیم باید این دستور رو بفرستیم:
      [code=c]
      i2c_read(0);
      [/code]
      که اومده این رو مساوی با یه متغیر به اسم MSB قرار داده
      بعدش هم ارتباط رو متوقف کرده
      بهدش دوباره این رو برای یه آدرس دیگه یا کار دیگه تکرار کرده. البته با یه آدرس حافظه دیگه

      اینا که من گفتم برا همه تقریبا مشترکه. با این تفاوت که توی IC های EEPROM خارجی، این دستورا برای دسترسی به حافظه هست، ولی شاید توی IC های دیگه برای دسترسی به اطلاعاتی باشه
      توی Datasheet اش نوشته که برای هر کاری چه دستوری میخواد (یعنی آدرس دوم)
      کلا آدرس دوما تعیین میکنه که چه کاری انجام میده. مثلا برای EEPROM خارجی آدرس خونه حافظه رو میده، توی یه IC دیگه مثلا معنیش این باشه که دما رو بده
      ولی آدرس اول خب مشخصه که برا همه یه معنی رو میده. اونم این که میکرو مشخص میکنه که با کی (کدوم IC) کار دارم.
      اقا دستت درد نکنه واقعا ممنون .... خیلی ترو تمیز توضیح دادی ... فقط یه سوال اون اولش که نوشته i2c_write(address) ینی میخاد ادرس بده ؟؟ کلا تو آی تو سی باید اولش بنویسه آدرس ؟؟؟ یا همون کد هگز آدرس رو بده کفایت میکنه ؟ بعد اون i2c_write هایی که بعدا نوشته مثلا 0X02 یا 0X03 حالت های ماژوله ؟ یا همون کاریه که باهاش داریم ؟؟؟؟؟؟؟ ینی در کل اولش یه ادرس بدیم تا وقتی دوباره کلمه ادرس رو بنویسیم و دوباره ادرس بدیم با همون ادرس قبلی سروکار داریم ؟ هر چقدرم استارت و استاپ کنیم ؟

      دیدگاه


        #4
        پاسخ : پاسخ : i2c در کدویژن

        نه اینکه اولش عبارت "address" رو بنویسه که
        اگه دستور define توی زبون C رو نگاه کنی، یعنی اومده و مقدار 0x00 رو برابر با address گذاشته و توی کل برنامه هرجا خواست بگه 0x00، به جاش میگه address
        میتونست بنویسه:
        [code=c]
        #define saman 0x00
        [/code]
        و بعدش توی برنامه به جای
        [code=c]
        i2c_start();
        i2c_write(address);
        [/code]

        بنویسه:
        [code=c]
        i2c_start();
        i2c_write(saman);
        [/code]
        یعنی آدرس داده اینجوری

        بعد از هر START باید Devide Address رو بدیم
        Datasheet AT24C512 رو ببین
        http://www.eca.ir/forum2/index.php?topic=108455.msg777842#msg777842

        دیدگاه


          #5
          پاسخ : پاسخ : i2c در کدویژن

          راستی، این فیلم ها رو هم دانلود کن
          توی یه قسمتش I2C رو توضیح داده
          فکر کنم قسمت 20 یا 21 یا همین حدوداس
          http://maktabkhooneh.org/course?course=aerabi943
          http://www.eca.ir/forum2/index.php?topic=108455.msg777842#msg777842

          دیدگاه


            #6
            پاسخ : پاسخ : i2c در کدویژن

            نوشته اصلی توسط سامان تقی پور
            راستی، این فیلم ها رو هم دانلود کن
            توی یه قسمتش I2C رو توضیح داده
            فکر کنم قسمت 20 یا 21 یا همین حدوداس
            http://maktabkhooneh.org/course?course=aerabi943
            آقا دستت طلا .... واقعا این فیلمه خیلی خوب بود ........ اگه میشد پنجاه تا تشکر میزدم :wow: :wow: :job: :job:

            دیدگاه


              #7
              پاسخ : پاسخ : i2c در کدویژن

              خواهش میکنم :nerd:
              http://www.eca.ir/forum2/index.php?topic=108455.msg777842#msg777842

              دیدگاه

              لطفا صبر کنید...
              X