اطلاعیه

Collapse
No announcement yet.

MR ST در i2c

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

    MR ST در i2c

    سلام دوستان . توابعی برای کار با i2c نوشتم در کد ویژن . این توابع در مد MT و SR به راحتی کار میکنن
    اما بر عکسش یعنی MR ST کار نمیکنه
    اسلیو ادرشو میشناسه اما وقتی چیزی ارسال میکنه برای مستر یا چیزی غیر اونی که من میخوام ارسال میکنه و ACK میگیره یا با کمی دست کاری اونی که من میخوام رو ارسال میکنه اما NACK میگیره (ار I2C debugger پروتئوس استفاده میکنم ) . چند روزیه در گیرشم حتی عین نوشته کتاب پرتویی فر هم دیگه کپی زدم تو کار اما جواب نداد
    این توابع مد مستر:
    MT که درست کار میکنه:
    کد:
    void twi_mt(char slaveadd,char data)
     {
     TWBR=0x00;
     TWCR=0xA4;              // in male mode MT ke dorost kar mikone
     while(!(TWCR&0x80));
     if((TWSR==0X08)||(TWSR==0X10))
      {
       TWDR=slaveadd;
       TWCR=0x84;
        while(!(TWCR&0x80));
      }
     if((TWSR&0xf8)==0X18)
      {
       TWDR=data;
       TWCR=0xB4;
        while(!(TWCR&0x80));
      }
     TWCR=0x94; 
     }
    MR: که نمیدونم مسکل از اینه یا از slave
    کد:
     unsigned char twi_mr(char slaveadd)
     {
     unsigned char __data=0;
     TWCR=0xA4;  //ijad vaziyate start
     while(!((TWCR&0x80)==0x80)); //entezar free shodane etsal i2c
     if((TWSR==0X08)||(TWSR==0X10)) //start ack??
      {
       TWDR=(slaveadd|0x01);   //ferestadan addres ba darkahste gereftane etelaat be slave 
       TWCR=0x84;        //pak kardane INT
       while(!(TWCR&0x80));   //Entezar baraye payane ersal va azad shodane i2c
      } 
     if((TWSR==0x40)||(TWSR==0x50))  // slave addres ack??
     { 
      TWCR=0xC4;     //ferestadane ack(nemidonam chera bayad estefade she copy az ro ketb bod
      while(!(TWCR&0x80)); // entezar     
      __data=TWDR;     // khondane dade
      TWCR=0xc4;      // khali kardane TWDR
      while(!((TWCR&0x80)==0x80)); //entezar
     }
     TWCR=0x94;   //Stop
     return __data;  //return data gerfte shode
     }
    تو تابع بالایی بدون فرستادن 0xc4 جوابای پرتو پلا میگرفتم ولی ACk میداد مستر با اون عدد درست میگرفت اما nack میداد مستر و یه عدد دیگه برمیگردوند
    ST: اینم نمیدونم اشتباهه یا نه تو مد SR جواب گرفته بودم (البته نه با همین برنامه) اما ترنسمیت ! :cry2:
    کد:
    #include <mega32.h>
    #include <delay.h>
    interrupt[20] void ss (void)
    { 
    if(TWSR==0xA8)
      {
       TWDR=0x10;
       TWCR|=0x80;
      }
    }
    void main(void)
    {
     SREG|=0x80;
     DDRA=0xFF;
     DDRB=0xFF;
     TWBR=12;
     DDRD=0xFF;
     TWAR=0X10;
     TWCR=0x45;
     while(1)
     {
      
     }
    }
    طبق روش کتاب باید جواب میداد اما شاید کتاب مشکل داره یا من چیزی رو از نوشتهای کتاب از قلم انداختم .
    اشکهايي که پس از هر شکست ميريزيم همان عرقيست که براي پيروزي نريخته ايم.
    هيتلر

    #2
    پاسخ : MR ST در i2c

    خب قبل از استفاده از هر چیز(وسیله، جزء،پریفرال یا...) سعی کنید اول تمرین های انجام شده پیدا کنید تا دقیقا بفهمین اون جیز چطور کار میکنه. در موردش هم باید خوب بدونید. به همین دلیل من توصیه میکنم اول این چند لینک رو خوب بخونید(البته امیدوارم با انگلیسی مشکلی نداشته باشید):

    Need TWI or I2C Tutorial

    و

    Example using the two-wire interface (TWI)

    و

    I2C Bus for ATtiny and ATmega

    دیدگاه


      #3
      پاسخ : MR ST در i2c

      نوشته اصلی توسط rozeh
      خب قبل از استفاده از هر چیز(وسیله، جزء،پریفرال یا...) سعی کنید اول تمرین های انجام شده پیدا کنید تا دقیقا بفهمین اون جیز چطور کار میکنه. در موردش هم باید خوب بدونید. به همین دلیل من توصیه میکنم اول این چند لینک رو خوب بخونید(البته امیدوارم با انگلیسی مشکلی نداشته باشید):

      Need TWI or I2C Tutorial

      و

      Example using the two-wire interface (TWI)

      و

      I2C Bus for ATtiny and ATmega
      حتما بهشون نگاه میندازم خدا رو شکر با انگلیسی مشکلی ندارم
      اشکهايي که پس از هر شکست ميريزيم همان عرقيست که براي پيروزي نريخته ايم.
      هيتلر

      دیدگاه


        #4
        پاسخ : MR ST در i2c

        سایت هایی که دادید همه رو توابع خود کد ویژن بود!! lمتاسفانه به دردم نخورد
        در هر صورت روش کار کرد درش اوردم
        TWBR تو مستر تعریف نداشت اما تو slave 12 بود واسه همین اشتباه کدهارو میگرفت . اخرم یه بار اضافه INT رو روشن میکردم که nack اخر مال اون بود
        کد:
         unsigned char twi_mr(char slaveadd)
         { 
          unsigned char __data; 
          TWBR=12;              //frec
          TWCR=0xA4;             //ijad vaziyate start
          while(!((TWCR&0x80)==0x80));    //entezar free shodane etsal i2c
          if((TWSR==0X08)||(TWSR==0X10))   //start ack??
          {
            TWDR=(slaveadd|0x01);      //ferestadan addres ba darkahste gereftane etelaat be slave 0x10
            TWCR=0x84;           //pak kardane INT
            while(!(TWCR&0x80));      //Entezar baraye payane ersal va azad shodane i2c
          } 
          if((TWSR==0x40)||(TWSR==0x50))   // slave addres ack??
          { 
            TWCR=0xC4;           //ferestadane ack(nemidonam chera bayad estefade she copy az ro ketb bod
            while(!(TWCR&0x80));      // entezar
            __data=TWDR;     
          }
          TWCR=0x94;             //Stop
          return __data;            //return data gerfte shode
         }
        اشکهايي که پس از هر شکست ميريزيم همان عرقيست که براي پيروزي نريخته ايم.
        هيتلر

        دیدگاه


          #5
          پاسخ : MR ST در i2c

          حالا مشکلت حل شد!؟

          دیدگاه


            #6
            پاسخ : MR ST در i2c

            اره خدا رو شکر 2 تا اشتباه کوچیک بود
            اشکهايي که پس از هر شکست ميريزيم همان عرقيست که براي پيروزي نريخته ايم.
            هيتلر

            دیدگاه

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