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

موضوع: راه اندازی I2C در stm32f103ret

  1. #1
    کاربر فعال
    تاریخ عضویت
    Jul 2012
    نوشته ها
    101
    تشکر
    23
    تشکر شده 3 بار در 1 پست

    پیش فرض راه اندازی I2C در stm32f103ret

    با سلام
    برای راه اندازی I2C من باید حتما NVIC را هم فعال کنم؟چون تو چند مثالی که دیدم برای راه اندازی این واحد رو هم استفاده کردنند این واحد اصلا چیست و چه کاری میکنه
    ممنون از توضیح دوستان
    من I2C_init() را نوشتم برای write میخواستم در main بنویسم که دیدم در مثل ها NVIC نوشتن

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

  3. #2
    مدير بخش STM32 sadmonew آواتار ها
    تاریخ عضویت
    Jun 2011
    نام
    صادق محمدي
    نوشته ها
    2,002
    تشکر
    6,283
    تشکر شده 3,115 بار در 1,408 پست

    پیش فرض

    سلام، خیر نیازی نیست.
    از nvic برای راه اندازی و تنظیم وقفه ها استفاده میشه.
    --------------------
    میتونید از این مثال ها هم استفاده کنید
    ویرایش توسط sadmonew : 08-04-2015 در ساعت 12:57
    _____________________________________
    _____________________________________

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


  5. #3
    کاربر فعال
    تاریخ عضویت
    Jul 2012
    نوشته ها
    101
    تشکر
    23
    تشکر شده 3 بار در 1 پست

    پیش فرض

    نقل قول نوشته اصلی توسط sadmonew نمایش پست ها
    سلام، خیر نیازی نیست.
    از nvic برای راه اندازی و تنظیم وقفه ها استفاده میشه.
    --------------------
    میتونید از این مثال ها هم استفاده کنید

    با سلام در این مثل ها توابع هستند در main ولی محتوای توابع رو چگونه میشود دید؟
    مثلا I2C_init() هست ولی خود تابع نیست و read , write برای واحد I2C نیست
    ممنون

  6. #4
    کاربر فعال
    تاریخ عضویت
    Mar 2010
    نوشته ها
    236
    تشکر
    101
    تشکر شده 246 بار در 163 پست

    پیش فرض

    فکر کنم داخل فروم نمونه مثالش هست

    کد:
    void Write_data(unsigned char Data_address,unsigned char Data_Value)
    {
        I2C_AcknowledgeConfig(I2C1,ENABLE);
        while (I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));
        I2C_GenerateSTART(I2C1, ENABLE);
        while (I2C_GetFlagStatus(I2C1,I2C_FLAG_SB) == RESET);    
        I2C_Send7bitAddress(I2C1, 0xA0, I2C_Direction_Transmitter);
        while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
        I2C_SendData(I2C1,(Data_address>>8)&0x0f);
        while ((!I2C_GetFlagStatus(I2C1,I2C_FLAG_TXE)) && (!I2C_GetFlagStatus(I2C1,I2C_FLAG_BTF)));
        I2C_SendData(I2C1,Data_address&0xff);
        while ((!I2C_GetFlagStatus(I2C1,I2C_FLAG_TXE)) && (!I2C_GetFlagStatus(I2C1,I2C_FLAG_BTF)));
        I2C_SendData(I2C1,Data_Value); 
        while ((!I2C_GetFlagStatus(I2C1,I2C_FLAG_TXE)) && (!I2C_GetFlagStatus(I2C1,I2C_FLAG_BTF)));
        I2C_GenerateSTOP(I2C1, ENABLE);    
        delay_ms(5);
    }
    
    unsigned char Read_data(unsigned char Data_address)
    {
        unsigned char Data_Value;
        I2C_AcknowledgeConfig(I2C1,ENABLE);
        while (I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY)) {}
        I2C_GenerateSTART(I2C1, ENABLE);
        while (I2C_GetFlagStatus(I2C1,I2C_FLAG_SB) == RESET){}    
        I2C_Send7bitAddress(I2C1, 0xA0, I2C_Direction_Transmitter);
        while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)){}
        I2C_SendData(I2C1,(Data_address>>8)&0x0f);
        while ((!I2C_GetFlagStatus(I2C1,I2C_FLAG_TXE)) && (!I2C_GetFlagStatus(I2C1,I2C_FLAG_BTF))){}
        I2C_SendData(I2C1,Data_address);
        while ((!I2C_GetFlagStatus(I2C1,I2C_FLAG_TXE)) && (!I2C_GetFlagStatus(I2C1,I2C_FLAG_BTF))){}
        I2C_GenerateSTART(I2C1, ENABLE);
        while (I2C_GetFlagStatus(I2C1,I2C_FLAG_SB) == RESET){}    
        I2C_Send7bitAddress(I2C1, 0xA1, I2C_Direction_Receiver);
        while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED )){}
        I2C_AcknowledgeConfig(I2C1,DISABLE);
        while ( !I2C_GetFlagStatus(I2C1,I2C_FLAG_RXNE) ){}        
        Data_Value = I2C_ReceiveData(I2C1);
        I2C_GenerateSTOP(I2C1, ENABLE);    
        I2C_AcknowledgeConfig(I2C1,ENABLE);
        return Data_Value;
    }

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


  8. #5
    کاربر فعال
    تاریخ عضویت
    Jul 2012
    نوشته ها
    101
    تشکر
    23
    تشکر شده 3 بار در 1 پست

    پیش فرض

    نقل قول نوشته اصلی توسط mrm نمایش پست ها
    فکر کنم داخل فروم نمونه مثالش هست

    کد:
    void Write_data(unsigned char Data_address,unsigned char Data_Value)
    {
        I2C_AcknowledgeConfig(I2C1,ENABLE);
        while (I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));
        I2C_GenerateSTART(I2C1, ENABLE);
        while (I2C_GetFlagStatus(I2C1,I2C_FLAG_SB) == RESET);    
        I2C_Send7bitAddress(I2C1, 0xA0, I2C_Direction_Transmitter);
        while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
        I2C_SendData(I2C1,(Data_address>>8)&0x0f);
        while ((!I2C_GetFlagStatus(I2C1,I2C_FLAG_TXE)) && (!I2C_GetFlagStatus(I2C1,I2C_FLAG_BTF)));
        I2C_SendData(I2C1,Data_address&0xff);
        while ((!I2C_GetFlagStatus(I2C1,I2C_FLAG_TXE)) && (!I2C_GetFlagStatus(I2C1,I2C_FLAG_BTF)));
        I2C_SendData(I2C1,Data_Value); 
        while ((!I2C_GetFlagStatus(I2C1,I2C_FLAG_TXE)) && (!I2C_GetFlagStatus(I2C1,I2C_FLAG_BTF)));
        I2C_GenerateSTOP(I2C1, ENABLE);    
        delay_ms(5);
    }
    
    unsigned char Read_data(unsigned char Data_address)
    {
        unsigned char Data_Value;
        I2C_AcknowledgeConfig(I2C1,ENABLE);
        while (I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY)) {}
        I2C_GenerateSTART(I2C1, ENABLE);
        while (I2C_GetFlagStatus(I2C1,I2C_FLAG_SB) == RESET){}    
        I2C_Send7bitAddress(I2C1, 0xA0, I2C_Direction_Transmitter);
        while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)){}
        I2C_SendData(I2C1,(Data_address>>8)&0x0f);
        while ((!I2C_GetFlagStatus(I2C1,I2C_FLAG_TXE)) && (!I2C_GetFlagStatus(I2C1,I2C_FLAG_BTF))){}
        I2C_SendData(I2C1,Data_address);
        while ((!I2C_GetFlagStatus(I2C1,I2C_FLAG_TXE)) && (!I2C_GetFlagStatus(I2C1,I2C_FLAG_BTF))){}
        I2C_GenerateSTART(I2C1, ENABLE);
        while (I2C_GetFlagStatus(I2C1,I2C_FLAG_SB) == RESET){}    
        I2C_Send7bitAddress(I2C1, 0xA1, I2C_Direction_Receiver);
        while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED )){}
        I2C_AcknowledgeConfig(I2C1,DISABLE);
        while ( !I2C_GetFlagStatus(I2C1,I2C_FLAG_RXNE) ){}        
        Data_Value = I2C_ReceiveData(I2C1);
        I2C_GenerateSTOP(I2C1, ENABLE);    
        I2C_AcknowledgeConfig(I2C1,ENABLE);
        return Data_Value;
    }
    ممنون از ارسال کد فقط وقتی من تابع write مربوطه رو در while برنامه ام میذارم دیگر LED چشمک زنم کار نمیکند و UUSART هم از کار می افتد و وقتی breakpoint میدذارم برنامه stop میشود و داخل اولین خط تابع نوشتن می استد

  9. #6
    کاربر فعال
    تاریخ عضویت
    Jul 2012
    نوشته ها
    101
    تشکر
    23
    تشکر شده 3 بار در 1 پست

    پیش فرض

    این بخش از کد که اضافه میشود میکرو هنگ میکند چراااااااااااااااا؟

    while (I2C_GetFlagStatus(I2C2,I2C_FLAG_SB) == RESET); //I2C_Send7bitAddress(I2C2, 0xA0, I2C_Direction_Transmitter);
    // while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
    // I2C_SendData(I2C2,(Data_address>>8)&0x0f);
    // while ((!I2C_GetFlagStatus(I2C2,I2C_FLAG_TXE)) && (!I2C_GetFlagStatus(I2C2,I2C_FLAG_BTF)));
    // I2C_SendData(I2C2,Data_address&0xff);
    // while ((!I2C_GetFlagStatus(I2C2,I2C_FLAG_TXE)) && (!I2C_GetFlagStatus(I2C2,I2C_FLAG_BTF)));
    // I2C_SendData(I2C2,Data_Value);
    // while ((!I2C_GetFlagStatus(I2C2,I2C_FLAG_TXE)) && (!I2C_GetFlagStatus(I2C2,I2C_FLAG_BTF)));
    // I2C_GenerateSTOP(I2C2, ENABLE);

  10. #7
    کاربر فعال
    تاریخ عضویت
    Mar 2010
    نوشته ها
    236
    تشکر
    101
    تشکر شده 246 بار در 163 پست

    پیش فرض

    قبل از استفاده از هر پریفرال باید اون رو init کنید مثل فعال کردن کلاک و غیره
    که احتمالا این کار رو نکردید

  11. #8
    کاربر فعال
    تاریخ عضویت
    Jul 2012
    نوشته ها
    101
    تشکر
    23
    تشکر شده 3 بار در 1 پست

    پیش فرض

    نقل قول نوشته اصلی توسط mrm نمایش پست ها
    قبل از استفاده از هر پریفرال باید اون رو init کنید مثل فعال کردن کلاک و غیره
    که احتمالا این کار رو نکردید
    تمام init را هم نوشتم
    void I2C_Configuration(void){
    GPIO_InitTypeDef GPIO_InitStructure;
    I2C_InitTypeDef I2C_InitStructure;
    /*enable I2C*/


    /* I2C1 clock enable */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);
    /* I2C1 SDA and SCL configuration */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    /*SCL is pin06 and SDA is pin 07 for I2C1*/


    /* I2C1 configuration */
    I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
    I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
    I2C_InitStructure.I2C_OwnAddress1 = 0x00;
    I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
    I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
    I2C_InitStructure.I2C_ClockSpeed =100000 ;
    I2C_Init(I2C2, &I2C_InitStructure);
    I2C_Cmd(I2C2,ENABLE);

    }

  12. #9
    مدير بخش STM32 sadmonew آواتار ها
    تاریخ عضویت
    Jun 2011
    نام
    صادق محمدي
    نوشته ها
    2,002
    تشکر
    6,283
    تشکر شده 3,115 بار در 1,408 پست

    پیش فرض

    سلام
    شما هنوز نگفتین چه قطعه ای را، به i2c وصل کردین؟ e2prom؟ سنسور؟ ....؟
    _____________________________________
    _____________________________________

  13. #10
    کاربر فعال
    تاریخ عضویت
    Feb 2012
    نام
    مصطفی
    نوشته ها
    273
    تشکر
    195
    تشکر شده 128 بار در 93 پست

    پیش فرض

    نقل قول نوشته اصلی توسط Raha323 نمایش پست ها
    این بخش از کد که اضافه میشود میکرو هنگ میکند چراااااااااااااااا؟
    ممکنه ایراد توی سخت افزار باشه. توی توابع I2C به خاطر whileهایی که وجود داره اگه slave پاسخ نده برنامه توی while میمونه.
    که این ایراد میتونه از سمت master باشه که مثلا پورت اشتباهی تعریف شده باشه یا از خروجی های remap شده استفاده شده باشه ولی پین های I2C درست معرفی نشده باشه یا از طرف slave باشه.
    ویرایش توسط mstkmn : 11-04-2015 در ساعت 12:43

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


  15. #11
    کاربر فعال
    تاریخ عضویت
    Jul 2012
    نوشته ها
    101
    تشکر
    23
    تشکر شده 3 بار در 1 پست

    پیش فرض

    دقیقا وقتی whileها را حذف میکنم میکروم هنگ نمیکنه
    ولی من هیچ پالسی از میکروم نمیبینم همیشه پایه های SAD,SCL صفر هستند حتی پول آپ اشون کردم صفر هستندو
    من میکرومو به یه آی سی آنالوگ به دیجیتال صوت وصل کردم که برای تغییر برخی از رجیسترهاش با استفاده ار I2C باید انجام بدم
    حالا من اصلا ارتباط رو قطع میکنم با آی سی حداقل پالس خود میکرو رو چطور ببینم؟
    ممنون از راهنمای هایتان

  16. #12
    مدير بخش STM32 sadmonew آواتار ها
    تاریخ عضویت
    Jun 2011
    نام
    صادق محمدي
    نوشته ها
    2,002
    تشکر
    6,283
    تشکر شده 3,115 بار در 1,408 پست

    پیش فرض

    آدرس قطعه را درست قرار دادین؟
    _____________________________________
    _____________________________________

  17. #13
    کاربر فعال
    تاریخ عضویت
    Jul 2012
    نوشته ها
    101
    تشکر
    23
    تشکر شده 3 بار در 1 پست

    پیش فرض

    اگر من کلا فقط بخوام پالس های ارسالی دیتا از میکروم رو ببینم چیکار کنم کلا پین های sda ,scl صفر هستند

  18. #14
    کاربر فعال
    تاریخ عضویت
    Jul 2012
    نوشته ها
    101
    تشکر
    23
    تشکر شده 3 بار در 1 پست

    پیش فرض

    مشکل اینکه این پایه همیشه low میباشد این خط کد من است
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; ; // Open Drain, I2C bus pulled high externally
    اگر اینو بردارم درست میشه چون این پایه پول آپ هم هست همیشه high میباشد دو پایه SDA,SCL
    چطور این مشکل رو حل کنم؟

  19. #15
    کاربر فعال
    تاریخ عضویت
    Jul 2012
    نوشته ها
    101
    تشکر
    23
    تشکر شده 3 بار در 1 پست

    پیش فرض

    پالسمو دیدمک هوراااا باید به این صورت بنویسم
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    ولی دلیل اش رو نمیدونم

  20. #16
    کاربر فعال
    تاریخ عضویت
    Feb 2012
    نام
    مصطفی
    نوشته ها
    273
    تشکر
    195
    تشکر شده 128 بار در 93 پست

    پیش فرض

    برای ارتباط I2C باید پین ها رو open drain تعریف کنید و حتما هم پین ها رو pull up کنید.
    احتمالا شما پین ها رو pull op نکردینو به خاطر همین هم سیگنالی روی پین ها نداشتی.

  21. #17
    کاربر فعال
    تاریخ عضویت
    Jul 2012
    نوشته ها
    101
    تشکر
    23
    تشکر شده 3 بار در 1 پست

    پیش فرض

    پین های من پول آپ هستند ولی چون در تعریف مد پین
    GPIO_Mode_AF_OD را میزدم همیشه low میشد با تغییر مد به GPIO_Mode_AF_PP درست شد پالس رو هم دیدم و پایه هم high هست همیشه حالا من علت این رو میخوام بدونم چرا درست شد چون من هم مثل شما فکر میکردم پین رو باید OD تعریف کنم

  22. #18
    کاربر فعال
    تاریخ عضویت
    Jul 2012
    نوشته ها
    101
    تشکر
    23
    تشکر شده 3 بار در 1 پست

    پیش فرض

    حتما باید while ها برای write وجود داشته باشد؟میشود در مورداشون توضیح بدید ممنون

  23. #19
    کاربر فعال
    تاریخ عضویت
    Mar 2010
    نوشته ها
    236
    تشکر
    101
    تشکر شده 246 بار در 163 پست

    پیش فرض

    پین ها باید حتما GPIO_Mode_AF_OD باشه و با مقاومت خارجی پول اپ باشه.
    حلقه ها برای این هست که میکرو منتظر پاسخ از طرف slave میمونه و اگر به هر دلیل ارتباط مشکل داشته باشه یا پاسخی نیاد حلقه ، بینهایت خواهد شد که باید درست بشه.
    ببینم شما ادرس slave رو داخل کد درست گذاشتید ؟ تا ادرس سخت افزاری ها یکی نباشه ارتباط برقرار نمیشه.
    باید دقت کنید این کد فقط برای مثال گذاشته شده و شما باید نسبت به slave کد رو تغییر بدید



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


  25. #20
    کاربر فعال
    تاریخ عضویت
    Jul 2012
    نوشته ها
    101
    تشکر
    23
    تشکر شده 3 بار در 1 پست

    پیش فرض

    [ATTAC[/ATTACH]
    بله آدرس رو تغییر دادم ولی الان مشکل من ارتباط با سخت افزارم که max9860 می باشد نیست به فرض اصلا اون دو پین به جایی وصل نیستنند فقط پول آپ شده باشند من باید پالسی بر روی اسکوپ ببینم که من این پالس رو وقتی در مد
    GPIO_Mode_AF_PP قرار میدهم میبینم در غیر این صورت پالسی دیده نمیشود
    تصاوير کوچک فايل پيوست تصاوير کوچک فايل پيوست برای دیدن سایز بزرگ روی عکس کلیک کنید

نام: Untitled.jpg
مشاهده: 101
حجم: 100.3 کیلو بایت  
    ویرایش توسط Raha323 : 12-04-2015 در ساعت 11:46

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

موضوعات مشابه

  1. [سوال] راه اندازی usartدر stm32f103RET
    توسط Raha323 در انجمن stm32
    پاسخ: 8
    آخرين نوشته: 16-03-2015, 13:52
  2. يه سوال درباره راه اندازي stm32f103ret
    توسط avr_1360 در انجمن stm32
    پاسخ: 2
    آخرين نوشته: 17-08-2014, 22:14
  3. از كار افتادن SWD در stm32f103ret
    توسط sanatnegar در انجمن stm32
    پاسخ: 4
    آخرين نوشته: 14-07-2014, 14:03

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

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