NOTICE توجه: این یک موضوع قدیمی است که آخرین پست ارسالی آن مربوط به 3721 روز قبل است . لطفا فقط پاسخ ها ، سوالات و درخواست های 100 درصد مرتبط را به آن ارسال کنید و برای درخواست ها و سوالات جدید موضوع جدیدی را ایجاد کنید
صفحه 1 از 2 12 آخرینآخرین
نمایش نتایج: از 1 به 20 از 22

موضوع: ارسال و دریافت با i2c

  1. #1
    کاربر فعال soodi آواتار ها
    تاریخ عضویت
    Jun 2010
    نام
    مسعود محمدی
    نوشته ها
    264
    تشکر
    111
    تشکر شده 296 بار در 138 پست

    پیش فرض ارسال و دریافت با i2c

    سلام

    من یه هدر دارم که توسط تابع زیر ارسال و دریافت میکنه و توضیحات تابع هم در زیر هست :

    کد:
    /************************************************************************  
    *     Function Name:    LDByteWriteI2C                                  *  
    *     Parameters:       EE memory ControlByte, address and data         *  
    *     Description:      Writes data one byte at a time to I2C EE        *  
    *                       device. This routine can be used for any I2C    *  
    *                       EE memory device, which only uses 1 byte of     *  
    *                       address data as in the 24LC01B/02B/04B/08B/16B. *  
    *                                                                       *  
    ************************************************************************/   
       
    unsigned char LDByteWriteI2C( unsigned char ControlByte, unsigned char LowAdd, unsigned char data )   
    {   
      IdleI2C();                          // ensure module is idle   
      StartI2C();                         // initiate START condition   
      while ( SSPCON2bits.SEN );          // wait until start condition is over    
      WriteI2C( ControlByte );            // write 1 byte - R/W bit should be 0   
      IdleI2C();                          // ensure module is idle   
      WriteI2C( LowAdd );                 // write address byte to EEPROM   
      IdleI2C();                          // ensure module is idle   
      WriteI2C ( data );                  // Write data byte to EEPROM   
      IdleI2C();                          // ensure module is idle   
      StopI2C();                          // send STOP condition   
      while ( SSPCON2bits.PEN );          // wait until stop condition is over    
      while (EEAckPolling(ControlByte));  //Wait for write cycle to complete   
      return ( 0 );                       // return with no error   
    }   
       
    /********************************************************************  
    *     Function Name:    LDByteReadI2C                               *  
    *     Parameters:       EE memory ControlByte, address, pointer and *  
    *                       length bytes.                               *  
    *     Description:      Reads data string from I2C EE memory        *  
    *                       device. This routine can be used for any I2C*  
    *                       EE memory device, which only uses 1 byte of *  
    *                       address data as in the 24LC01B/02B/04B/08B. *  
    *                                                                   *    
    ********************************************************************/   
       
    unsigned char LDByteReadI2C( unsigned char ControlByte, unsigned char address, unsigned char *data, unsigned char length )   
    {   
      IdleI2C();                      // ensure module is idle   
      StartI2C();                     // initiate START condition   
      while ( SSPCON2bits.SEN );      // wait until start condition is over    
      WriteI2C( ControlByte );        // write 1 byte    
      IdleI2C();                      // ensure module is idle   
      WriteI2C( address );            // WRITE word address to EEPROM   
      IdleI2C();                      // ensure module is idle   
      RestartI2C();                   // generate I2C bus restart condition   
      while ( SSPCON2bits.RSEN );     // wait until re-start condition is over    
      WriteI2C( ControlByte | 0x01 ); // WRITE 1 byte - R/W bit should be 1 for read   
      IdleI2C();                      // ensure module is idle   
      getsI2C( data, length );       // read in multiple bytes   
      NotAckI2C();                    // send not ACK condition   
      while ( SSPCON2bits.ACKEN );    // wait until ACK sequence is over    
      StopI2C();                      // send STOP condition   
      while ( SSPCON2bits.PEN );      // wait until stop condition is over    
      return ( 0 );                   // return with no error   
    }


    میخام ارسال و دریافتی که توسط تابع بالا انجام میشه رو توسط تابع زیر انجام بدم :

    کد:
    /*
    *********************************************************************************************************
    ** Function name: I2C_WriteNByte ()
    ** Function: to have the child write N bytes of data the device address
    ** Entry parameter: sla device from the address
    ** Suba_type subaddress structure 1 - single-byte address 3-8 + X structure 2-- byte address
    ** Suba internal device physical address
    ** * S will be a pointer to data to be written
    ** Num the number of data to be written
    ** Output Parameters: 1 operation is successful
    ** 0 operation failed
    *********************************************************************************************************
    */
    uint8_t I2C_WriteNByte(uint8_t sla, uint8_t suba_type, uint32_t suba, uint8_t *s, uint32_t num)
    {
        if (num > 0)                                                /* If you read the number is 0, return error  */
        {
            if (suba_type == 1)
            {
                I2C_sla         = sla;                                      /* Read from the device address               */
                I2C_suba        = suba;                                     /* Device subaddress                  */
                I2C_suba_num    = 1;                                        /* 1 byte device subaddress            */
               }
            if (suba_type == 2)
            {
                I2C_sla         = sla;                                      /* Read from the device address               */
                I2C_suba        = suba;                                     /* Device subaddress                   */
                I2C_suba_num    = 2;                                        /* 1 byte device subaddress            */
               }
            if (suba_type == 3)
            {
                I2C_sla         = sla + ((suba >> 7 )& 0x0e);                                       /* Read from the device address                */
                I2C_suba        = suba;                                     /* Device subaddress                   */
                I2C_suba_num    = 1;                                        /* 1 byte device subaddress            */
               }
    
            I2C_buf         = s;                                                /* Data                         */
            I2C_num         = num;                                              /* The number of data                     */
            I2C_suba_en     = 2;                                                /* A sub-address, write            */
            I2C_end         = 0;
      LPC_I2C0->I2CONCLR = (1 << 2)|
                             (1 << 3)|
                           (1 << 5);  /* Clear SI flag */
    
      LPC_I2C0->I2CONSET = (1 << 5)|
                             (1 << 6);    /* Set Start flag */
    
        while(I2C_end == 0);
            if(I2C_end)
            {
                 Delay(20);
                return 1;
            }
            else
            {
                Delay(20);
                return 0;
            }
      }
      Delay(20);
      return 0;
    }
    /*
    *********************************************************************************************************
    ** Function name: I2C_ReadNByte ()
    ** Function: sub-address from a device to read N bytes starting at any address data
    ** Entry parameter: sla device from the address
    ** Suba_type subaddress structure 1 - single-byte address 2-8 + X structure 2-- byte address
    ** Suba device subaddress
    ** S data receive buffer pointer
    ** Num the number of read
    ** Output Parameters: 1 operation is successful
    ** 0 operation failed
    *********************************************************************************************************
    */
    uint8_t I2C_ReadNByte (uint8_t sla, uint8_t suba_type, uint32_t suba, uint8_t *s, uint32_t num)
    {
        if (num > 0)
        {
            if (suba_type == 1)
            {
                I2C_sla         = sla + 1;                                  /* Read from the device address~{#,~}R=1          */
                I2C_suba        = suba;                                     /* Device subaddress                   */
                I2C_suba_num    = 1;                                        /*1 byte device subaddress            */
            }
            if (suba_type == 2)
            {
                I2C_sla         = sla + 1;                                  /* Read from the device address~{#,~}R=1          */
                I2C_suba        = suba;                                     /* Device subaddress                   */
                I2C_suba_num    = 2;                                        /* 1 byte device subaddress            */
            }
            if (suba_type == 3)
            {
                I2C_sla         = sla + ((suba >> 7 )& 0x0e) + 1;             /* Read from the device address~{#,~}R=1          */
                I2C_suba        = suba & 0x0ff;                              /* Device subaddress                   */
                I2C_suba_num    = 1;                                        /* 1 byte device subaddress            */
            }
    
    
    
        I2C_buf         = s;                                                /* Data receive buffer pointer           */
        I2C_num         = num;                                              /* To read the number of                 */
        I2C_suba_en         = 1;                                                /* A sub-address read                   */
        I2C_end         = 0;
        
      LPC_I2C0->I2CONCLR = (1 << 2)|
                             (1 << 3)|
                           (1 << 5);  /* Clear SI flag */
    
      LPC_I2C0->I2CONSET = (1 << 5)|
                             (1 << 6);    /* Set Start flag */
        
        while(I2C_end == 0);
            if(I2C_end)
            {
                 Delay(20);
                return 1;
            }
            else
            {
                Delay(20);
                return 0;
            }
    
        }
        Delay(20);
        return 0;
    }
    باید توی تابع LDByteWriteI2C پارامتر مثلا LowAdd رو با چه پارامتری در تابع I2C_WriteNByte تعویض کنم ؟ بقیه پارامتر ها چطور ؟

    کد:
    LDByteWriteI2C( unsigned char ControlByte, unsigned char LowAdd, unsigned char data )
    کد:
    I2C_WriteNByte(uint8_t sla, uint8_t suba_type, uint32_t suba, uint8_t *s, uint32_t num
    )

  2. # ADS
    Circuit advertisement
    تاریخ عضویت
    Always
    نام
    Advertising world
    نوشته ها
    Many
     

  3. #2
    مدیر انجمن mzarkoob آواتار ها
    تاریخ عضویت
    Jun 2011
    نام
    مهدی زرکوب
    نوشته ها
    2,902
    تشکر
    1,202
    تشکر شده 2,317 بار در 1,273 پست

    پیش فرض

    سلام
    خوب این طوری که دقیق نمی شه گفت. برنامه دومی که سمپل برد لندتایگر هست و مشخصه داره چیکار می کنه ولی تا برنامه اول را کامل توابعش را نداریم
    زده دیگه در توضیحاتش:
    کد:
    WriteI2C( LowAdd );                 // write address byte to EEPROM

  4. #3
    مدیر انجمن mzarkoob آواتار ها
    تاریخ عضویت
    Jun 2011
    نام
    مهدی زرکوب
    نوشته ها
    2,902
    تشکر
    1,202
    تشکر شده 2,317 بار در 1,273 پست

    پیش فرض

    الان برا خودم سوال شد! بعضی این آرگومانهای این تابع برای چیه؟
    [PHP]uint8_t I2C_WriteNByte(uint8_t sla, uint8_t suba_type, uint32_t suba, uint8_t *s, uint32_t num)
    I2C_WriteNByte(0xa0, 1, 0x00, buf, 8); /* write buf array ito EEPROM */
    [/PHP]
    suba_type !
    [PHP]suba_type == 1 ->>> I2C_suba_num = 1; /* 1 byte device subaddress */
    uint8_t I2C_suba_num; /* I2C subaddress bytes */
    [/PHP]

  5. #4
    مدیرکل انجمنها agape آواتار ها
    تاریخ عضویت
    Feb 2009
    نام
    Zeus
    نوشته ها
    1,235
    تشکر
    139
    تشکر شده 2,209 بار در 846 پست

    پیش فرض

    خوب - ببین هر آیسی تو باس I2C یه آدرس داره که از طرف کارخونه بهش داده میشه - مثلا آیسی های حافظه سری 24 آدرسشون 0xA0 هست
    خوب حالا فرض کن بخوای 4 تا آیسی حافظه از سری 24 رو باست داشته باشی ؟ - اون موقه چاره ساب آدرس هست ، که در واقع به وسیله همون سه پایه آدرس آیسی مشخص میشه ، اگر همه رو زمین کنی میشه ساب آدرس 0 و....

  6. کاربران : 2 تشکر کرده اند از شما agape برای ارسال این پست سودمند:


  7. #5

  8. #6
    مدیرکل انجمنها agape آواتار ها
    تاریخ عضویت
    Feb 2009
    نام
    Zeus
    نوشته ها
    1,235
    تشکر
    139
    تشکر شده 2,209 بار در 846 پست

    پیش فرض

    میشه همون پایه های آیسی
    یعنی آیسی اول

  9. کاربران : 2 تشکر کرده اند از شما agape برای ارسال این پست سودمند:


  10. #7
    کاربر فعال
    تاریخ عضویت
    Jan 2013
    نام
    عربعامری
    نوشته ها
    148
    تشکر
    25
    تشکر شده 92 بار در 60 پست

    پیش فرض

    مشکل منم سر نفهمیدن ارگمان های این تابع هست.باقی ارگمانها رو هم توضیح بدید.توی مثال همین توابع در یک ارایه 8 بیت دیتا گذاشته.حالا من میخوام به جای 8 بیت 9 بیت داده بزارم و uint32_t num را برابر 9 میزارم که یتوپرام شروع میکنه به هذیان گفتن.ایتوپرام متصل به میکرو 2 بایت هست.میشه توضیح بدید چکار میشه کرد.کتابخانه بهتری برای i2c ندارید که از وقفه استفاده نکنه و مثل همون دستورات قبل با باشه

  11. #8
    مدیر انجمن mzarkoob آواتار ها
    تاریخ عضویت
    Jun 2011
    نام
    مهدی زرکوب
    نوشته ها
    2,902
    تشکر
    1,202
    تشکر شده 2,317 بار در 1,273 پست

    پیش فرض

    سلام
    باید داخل کتابخانه را ببینید که از این 8 چطوری استفاده کرده
    خوب بایت 8 بیتی هست و اگه نمی شه شما 8 بیت 8 بیت باید بنویسید
    کتابخونه دیگه که در سایت کیل یه سری سمپل هست که شبیه به همینه
    نمی شه که بی وقفه. بر اساس همین وقفه هست که ارسال انجام میشه. در یوزر منوال پروتکل ارتباطی را بخونید شرح داده

  12. #9
    کاربر فعال
    تاریخ عضویت
    Jan 2013
    نام
    عربعامری
    نوشته ها
    148
    تشکر
    25
    تشکر شده 92 بار در 60 پست

    پیش فرض

    این قسمت رو از بس دیباگ کردم که حالم بهم خورد.
    حافظه ایتو پرام رو میشه تو دیباگ دید؟
    ویرایش توسط arvin2009 : 19-11-2013 در ساعت 13:01

  13. #10
    کاربر فعال
    تاریخ عضویت
    Jan 2013
    نام
    عربعامری
    نوشته ها
    148
    تشکر
    25
    تشکر شده 92 بار در 60 پست

    پیش فرض

    سوال
    توی ایدوپرام 2 کیلو که میشه 256 بایت هشت پیج وجود داره .چرا با این توابع نمیشه یک ارایه 9 عنصری رو درش ذخیره کرد.یعنی جا نمیشه.ولی تو avr مگا 8 که 512 هست حدود 50 تا از این جا میشه.
    فکر کنم سوالم خیلی اپتدایی بود نه؟

  14. #11
    کاربر فعال titery آواتار ها
    تاریخ عضویت
    Dec 2011
    نام
    وثوق
    نوشته ها
    166
    تشکر
    363
    تشکر شده 218 بار در 89 پست

    پیش فرض

    نقل قول نوشته اصلی توسط arvin2009 نمایش پست ها
    سوال
    توی ایدوپرام 2 کیلو که میشه 256 بایت هشت پیج وجود داره .چرا با این توابع نمیشه یک ارایه 9 عنصری رو درش ذخیره کرد.یعنی جا نمیشه.ولی تو avr مگا 8 که 512 هست حدود 50 تا از این جا میشه.
    فکر کنم سوالم خیلی اپتدایی بود نه؟
    سلام منن با همین 24c02 و با 1788 دارم کار میکنم و مشکلی هم ندارم شما سمپل core board داخل cd رو دارید؟
    برای راحتی متغیرات رو به صورت استرینگ('7') هر کدوم رو تو یک خونه 2402 بریز

  15. #12
    کاربر فعال
    تاریخ عضویت
    Jan 2013
    نام
    عربعامری
    نوشته ها
    148
    تشکر
    25
    تشکر شده 92 بار در 60 پست

    پیش فرض

    نه من با توابع که در پس دوم هست کار میکنم و این مشکل رو دارم.از کجا میشه این سمپل کدی که میگید رو دانلود کرد؟

  16. #13
    مدیر انجمن mzarkoob آواتار ها
    تاریخ عضویت
    Jun 2011
    نام
    مهدی زرکوب
    نوشته ها
    2,902
    تشکر
    1,202
    تشکر شده 2,317 بار در 1,273 پست

    پیش فرض

    نقل قول نوشته اصلی توسط arvin2009 نمایش پست ها
    حافظه ایتو پرام رو میشه تو دیباگ دید؟
    در سیمولاتور کیل برای فیلیپس رجیسترهای i2c قابل مشاهده است ولی حافظه یه قطعه دیگه نه !
    نقل قول نوشته اصلی توسط titery نمایش پست ها
    سلام منن با همین 24c02 و با 1788 دارم کار میکنم و مشکلی هم ندارم شما سمپل core board داخل cd رو دارید؟
    برای راحتی متغیرات رو به صورت استرینگ('7') هر کدوم رو تو یک خونه 2402 بریز
    در 1788 فکر کنم خودش یک eeprom داخلی دارد

  17. کاربران : 2 تشکر کرده اند از شما mzarkoob برای ارسال این پست سودمند:


  18. #14
    کاربر فعال
    تاریخ عضویت
    Jan 2013
    نام
    عربعامری
    نوشته ها
    148
    تشکر
    25
    تشکر شده 92 بار در 60 پست

    پیش فرض

    من هنوز مشکلم حل نشده.کسی با ایدوپرام روی برد کار نکرده؟لااقل یک سمپل کد معرفی کنید که کار کردید.اون توابع فکر میکنم مشکل داره

  19. #15

  20. #16
    کاربر فعال
    تاریخ عضویت
    Jan 2013
    نام
    عربعامری
    نوشته ها
    148
    تشکر
    25
    تشکر شده 92 بار در 60 پست

    پیش فرض

    نه مهدی جان.cmsis رو پیدا نکردم.پیدا کردم خیلی پیچیده بود و کلی تابع داشت.هرچند برای i2c بود و به صورت کامل نوشته بود.هرچی هم سرچ میکنم چیزی پیدا نمیکنم

  21. #17
    مدیر انجمن mzarkoob آواتار ها
    تاریخ عضویت
    Jun 2011
    نام
    مهدی زرکوب
    نوشته ها
    2,902
    تشکر
    1,202
    تشکر شده 2,317 بار در 1,273 پست

    پیش فرض

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

  22. #18
    تازه وارد
    تاریخ عضویت
    Jun 2013
    نوشته ها
    4
    تشکر
    0
    تشکر شده 0 بار در 0 پست

    پیش فرض

    سلام
    ویرایش توسط esn.dvd : 10-12-2013 در ساعت 23:32

  23. #19
    تازه وارد
    تاریخ عضویت
    Jun 2013
    نوشته ها
    4
    تشکر
    0
    تشکر شده 0 بار در 0 پست

    پیش فرض

    نقل قول نوشته اصلی توسط agape نمایش پست ها
    خوب - ببین هر آیسی تو باس I2C یه آدرس داره که از طرف کارخونه بهش داده میشه - مثلا آیسی های حافظه سری 24 آدرسشون 0xA0 هست
    خوب حالا فرض کن بخوای 4 تا آیسی حافظه از سری 24 رو باست داشته باشی ؟ - اون موقه چاره ساب آدرس هست ، که در واقع به وسیله همون سه پایه آدرس آیسی مشخص میشه ، اگر همه رو زمین کنی میشه ساب آدرس 0 و....
    اگر دو تا سنسور دیجیتال مثلا adxl345 داشته باشیم چجوری بهشون بفهمونیم اطلاعات کدوم رو میخوایم؟

  24. #20
    کاربر فعال
    تاریخ عضویت
    Jul 2010
    نام
    مرتضی مجتهدی
    نوشته ها
    313
    تشکر
    1
    تشکر شده 358 بار در 203 پست

    پیش فرض

    در ارتباط i2c اسلیو هایی که امکان اتصال بیشتر از یکی از اونها وجود داره، پایه آدرس دارند که در هر سنسور به یک ترتیب بسته میشه و با 0 یا 1 کردن بیت مربوطه در بایت آدرس، مشخص می کنید کدوم قطعه قرار هست خوانده بشه

  25. تشکرها از این نوشته :


صفحه 1 از 2 12 آخرینآخرین

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •