NOTICE توجه: این یک موضوع قدیمی است که آخرین پست ارسالی آن مربوط به 1973 روز قبل است . لطفا فقط پاسخ ها ، سوالات و درخواست های 100 درصد مرتبط را به آن ارسال کنید و برای درخواست ها و سوالات جدید موضوع جدیدی را ایجاد کنید
نمایش نتایج: از 1 به 15 از 15

موضوع: ارسال دیتا از طریق DMA to spi

  1. #1
    کاربر علاقه مند
    تاریخ عضویت
    Jan 2012
    نوشته ها
    44
    تشکر
    11
    تشکر شده 17 بار در 13 پست

    پیش فرض ارسال دیتا از طریق DMA to spi

    با سلام
    من یه مشکلی با سرعت پیدا کردم نمی تونم از این دستور استفاده کنم می خوام این دستورا با dma راه اندازی کنم کسی می تونه کمکم کنه فقط می خوام یه بافر را با تعداد مشخص روی spi2 ازسال کنم الان با این دستور میشه ولی توی هر حلقه که میره رم را بخونه بریزه روی spi مکث دارم وسرعت میاد پایین اگه میشه کمک کنید
    for(counter_1=0;counter_1<100 ;counter_1++){

    PI_I2S_SendData(SPI2,buffer_tmp2[counter_1]);
    }

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

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

    پیش فرض

    خوب کاریب نداره - من با DMA ی ST کار نکردم ولی فکر نمیکنم خیلی سخت باشه تو LPC و Atmle که آدرس منبع و مقصد رو میدی و استارت و مقدار بایت جابجایی رو هم میدی و انتقال شروع میشه !
    حالا مساله ای مطرحه که میخواید این انتقال با تمام سرعت انجام بشه یا نه با یه نرخ خاص انجام بگیره ؟ برای تمام سرهت که نیاز نیست کار خاصی انجام بدی ولی اگر میخواید با نرخ تایین شده انجام بشه ، باید یکی از تایمر ها رو که به DMA لینک میشه رو فعال کنید و نرخ رو با تایمر تایین کنید . به همین راحتی

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


  5. #3
    کاربر علاقه مند
    تاریخ عضویت
    Jan 2012
    نوشته ها
    44
    تشکر
    11
    تشکر شده 17 بار در 13 پست

    پیش فرض

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

  6. #4
    کاربر علاقه مند
    تاریخ عضویت
    Jan 2012
    نوشته ها
    44
    تشکر
    11
    تشکر شده 17 بار در 13 پست

    پیش فرض

    اقا هیچ کس نیست کمک کنه جایزه میدما

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

    پیش فرض

    نقل قول نوشته اصلی توسط farhads نمایش پست ها
    با سلام
    من یه مشکلی با سرعت پیدا کردم نمی تونم از این دستور استفاده کنم می خوام این دستورا با dma راه اندازی کنم کسی می تونه کمکم کنه فقط می خوام یه بافر را با تعداد مشخص روی spi2 ازسال کنم الان با این دستور میشه ولی توی هر حلقه که میره رم را بخونه بریزه روی spi مکث دارم وسرعت میاد پایین اگه میشه کمک کنید
    for(counter_1=0;counter_1<100 ;counter_1++){

    PI_I2S_SendData(SPI2,buffer_tmp2[counter_1]);
    }
    سلام مهندس
    براي راه اندازي وا ستفاده از DMA ميتونيد از قطعه كد زير استفاده كنيد.
    کد:
    DMA_InitTypeDef    DMA_InitStructure;
    BYTE  buf_temp_temp[512];
    
    void spi_DMA_transfer(u8 *data_tmp_)
    {
      DMA_DeInit(DMA1_Channel5);                                    // ersale dade bar roie SPI2 az tarighe kanal5 DMA1
      DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)0x4000380C;   // adrese registere dataie SPI2
      DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
      DMA_InitStructure.DMA_BufferSize = 360;                       // 360byte
      DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
        DMA_InitStructure.DMA_MemoryBaseAddr = (u32)data_tmp_;        // dataie ke   mikhahim ersal konim.
      DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
      DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
      DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
      DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
      DMA_InitStructure.DMA_Priority = DMA_Priority_veryHight;
      DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
      DMA_Init(DMA1_Channel5, &DMA_InitStructure);
        DMA_Cmd(DMA1_Channel5, ENABLE);
        
        SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, ENABLE);
        }
    _____________________________________
    _____________________________________

  8. کاربران : 7 تشکر کرده اند از شما sadmonew برای ارسال این پست سودمند:


  9. #6
    کاربر علاقه مند
    تاریخ عضویت
    Jan 2012
    نوشته ها
    44
    تشکر
    11
    تشکر شده 17 بار در 13 پست

    پیش فرض

    با تشکر از جناب محمدی
    میشه یه توضیحی هم بدهید من چیا به پروژه اضافه کنم واین کل یه بافر را میریزه و اون u32 چیه میشه یه توضیح کامل هم بدهید
    این تنظیمات هستش و برای شروع کردن ریختن باید چه کرد
    دستور اجراییش چیه
    با تشکر

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


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

    پیش فرض

    نقل قول نوشته اصلی توسط farhads نمایش پست ها
    با تشکر از جناب محمدی
    میشه یه توضیحی هم بدهید من چیا به پروژه اضافه کنم واین کل یه بافر را میریزه و اون u32 چیه میشه یه توضیح کامل هم بدهید
    این تنظیمات هستش و برای شروع کردن ریختن باید چه کرد
    دستور اجراییش چیه
    با تشکر
    سلام مهندس
    مهندس من ميگم، اما خواهشا" خودتون هم روش كار كنيد ديگه!!
    تنها كاري كه براي تنظيم لازمه انجام بدين، فعال كردن كلاك DMA1 هستش.
    اين يه تابع براي ارسال ديتا از طريق DMA1 .
    ----------------------------------------------------
    مهندس فرض كنيد شما 512 بايت داده ميخواين ارسال كنين. پس اول همه اون عدد 360 رو به 512 تغيير بدين.
    اون بافري كه ديتا رو موقتا توش ذخيره كردين، به عنوان پارامتر ورودي براي اين تابع قرار بدين.
    من تو اون مثال متغير buf_temp_temp رو از نوع رشته اي تعريف كردم و 512 بايت رو به اون اختصاص دادم.
    هر جايي ار برنامتون كه خواستين ديتايي رو منتقل كنيد به ابن صورت عمل كنيد:
    کد:
    spi_DMA_transfer(buf_temp_temp);
    _____________________________________
    _____________________________________

  12. کاربران : 7 تشکر کرده اند از شما sadmonew برای ارسال این پست سودمند:


  13. #8
    کاربر علاقه مند
    تاریخ عضویت
    Jan 2012
    نوشته ها
    44
    تشکر
    11
    تشکر شده 17 بار در 13 پست

    پیش فرض

    با سلام
    منا ببخشید من زیاد وارد به سی نیستم ولی با کمک شما حل شد با تشکر از شما

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


  15. #9
    کاربر علاقه مند omega_adiban آواتار ها
    تاریخ عضویت
    Nov 2007
    نام
    امید حبیبی
    نوشته ها
    38
    تشکر
    8
    تشکر شده 13 بار در 6 پست

    پیش فرض

    سلام
    من یه میکرو دارم که باید دیتای 7 تا میکروی دیگه رو بخونه
    من از مستر به هر میکروی اسلیو ک قراره دیتاش رو بخونم یه پین بردم و تو حالت اینتراپت درخواست دیتا میکنم و spi زو میخونم
    متاسفنه خیلی خطا داره و خیلی به هم میریزه
    میشه راهنمایی کنید بچه ها؟

    من تو برنامه همه میکرو ها رو master تعریف کردم و میکرو اصلی رو slave
    اخه جور دیگه ای نشد راش بندام
    ممنون میشم کمک کنید

  16. #10
    کاربر علاقه مند ali_rostami_7 آواتار ها
    تاریخ عضویت
    Oct 2011
    نوشته ها
    91
    تشکر
    295
    تشکر شده 54 بار در 36 پست

    پیش فرض

    نقل قول نوشته اصلی توسط agape نمایش پست ها
    اگر میخواید با نرخ تایین شده انجام بشه ، باید یکی از تایمر ها رو که به DMA لینک میشه رو فعال کنید و نرخ رو با تایمر تایین کنید . به همین راحتی
    با سلام در این خصوص اگه کسی اطلاعاتی داره ممنون میشم که بیشتر توضیح بدید.
    البته خودم یه حدسایی میزنم به این شرح که تنظیمات dma را به این صورت که ادرس پریفرال روی spi و ادرس حافظه را بر روی اطلاعاتی که می خواهیم بفرستیم تنظیم می کنیم ولی در نهایت به جای استفاده از :
    SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, ENABLE);
    که منبع درخواست انتقال dma را spi قرار میدهد از دستوری چون :
    TIM_DMACmd(TIM2, TIM_DMA_CC1, ENABLE);
    استفاده کنیم.درسته؟
    ویرایش توسط ali_rostami_7 : 26-10-2015 در ساعت 22:05

  17. #11
    کاربر علاقه مند ali_rostami_7 آواتار ها
    تاریخ عضویت
    Oct 2011
    نوشته ها
    91
    تشکر
    295
    تشکر شده 54 بار در 36 پست

    پیش فرض

    کسی نظری نداره؟

  18. #12
    کاربر علاقه مند
    تاریخ عضویت
    Aug 2011
    نوشته ها
    20
    تشکر
    10
    تشکر شده 0 بار در 0 پست

    پیش فرض

    نقل قول نوشته اصلی توسط ali_rostami_7 نمایش پست ها
    کسی نظری نداره؟
    سلام
    به نتیجه رسیدین ؟
    من هم همین مشکل رو دارم و میخوام با تایمر dma رو تریگ کنم

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

    پیش فرض

    نقل قول نوشته اصلی توسط omid.r نمایش پست ها
    سلام
    به نتیجه رسیدین ؟
    من هم همین مشکل رو دارم و میخوام با تایمر dma رو تریگ کنم
    سلام
    بایستی تنظیم مربوطه در تایمر انجام بدید که مربوط بشه به dma
    هر تایمر هم برای استفاده در dma مشخصی تعیین شده. در رفرنس منوال ذکر شده

    در مبحث dma
    برای انتقال دیتا از رم به پریفرال قبلا به صورت اجرای عملی ذکر شد که می توان از رم به پورت سریال انتقال دیتا انجام داد:

    حال اگر بخواهید دیتاهایی را از رم بر روی یک پورت GPIO قرار دهید کافیست به جای آدرس پورت سریال از آدرس همان پورت gpio استفاده شود.
    نکته ای که در اینجا باید در نظر بگیرید استفاده از یک تایمر برای تنظیم زمان ارسال دیتا به صورت مرتب است. به عنوان مثال می خواهید هر 1 ثانیه یک بار یک انتقال انجام شود. در پریفرال DMA میکروهای STM32 هر تایمر برای یک کانال خاص از DMA قابل استفاده است. در حالی که این محدودیت در میکروهای NXP وجود ندارد.
    اگر می خواستید به صورت معمول در هر زیرروال وقفه تایمر، عمل انتقال دیتا از یک آرایه به یک پورت gpio انجام شود :
    ————————
    void TIM2_IRQHandler (void)
    {
    GPIOD->ODR = Data[i++];
    ....
    }
    int main (void) {
    SystemInit();
    GPIO_Init ();
    TIM2_Init ();
    while (1)
    {
    }
    }
    @armeducation
    —————————————
    اگر بخواهید با DMA ، عمل انتقال از آرایه به gpio انجام شود :
    int main (void) {
    SystemInit();
    GPIO_Init ();
    TIM2_Init ();
    DMA_Init ();
    while (1)
    {
    }
    }
    و در نهایت بعد انتقال دیتا به تعداد مشخص شده، در زیروال وقفه DMA می توان یک اعلام اتمام قرار داد.
    تفاوت در انتقال خودکار دیتاها در زمان مشخص شده بدون نیاز به وارد شدن به زیروال وقفه تایمر است.
    @armeducation

  20. #14
    کاربر علاقه مند
    تاریخ عضویت
    Aug 2011
    نوشته ها
    20
    تشکر
    10
    تشکر شده 0 بار در 0 پست

    پیش فرض

    نقل قول نوشته اصلی توسط mzarkoob نمایش پست ها
    سلام
    بایستی تنظیم مربوطه در تایمر انجام بدید که مربوط بشه به dma
    هر تایمر هم برای استفاده در dma مشخصی تعیین شده. در رفرنس منوال ذکر شده

    در مبحث dma
    برای انتقال دیتا از رم به پریفرال قبلا به صورت اجرای عملی ذکر شد که می توان از رم به پورت سریال انتقال دیتا انجام داد:

    حال اگر بخواهید دیتاهایی را از رم بر روی یک پورت GPIO قرار دهید کافیست به جای آدرس پورت سریال از آدرس همان پورت gpio استفاده شود.
    نکته ای که در اینجا باید در نظر بگیرید استفاده از یک تایمر برای تنظیم زمان ارسال دیتا به صورت مرتب است. به عنوان مثال می خواهید هر 1 ثانیه یک بار یک انتقال انجام شود. در پریفرال DMA میکروهای STM32 هر تایمر برای یک کانال خاص از DMA قابل استفاده است. در حالی که این محدودیت در میکروهای NXP وجود ندارد.
    اگر می خواستید به صورت معمول در هر زیرروال وقفه تایمر، عمل انتقال دیتا از یک آرایه به یک پورت gpio انجام شود :
    ————————
    void TIM2_IRQHandler (void)
    {
    GPIOD->ODR = Data[i++];
    ....
    }
    int main (void) {
    SystemInit();
    GPIO_Init ();
    TIM2_Init ();
    while (1)
    {
    }
    }
    @armeducation
    —————————————
    اگر بخواهید با DMA ، عمل انتقال از آرایه به gpio انجام شود :
    int main (void) {
    SystemInit();
    GPIO_Init ();
    TIM2_Init ();
    DMA_Init ();
    while (1)
    {
    }
    }
    و در نهایت بعد انتقال دیتا به تعداد مشخص شده، در زیروال وقفه DMA می توان یک اعلام اتمام قرار داد.
    تفاوت در انتقال خودکار دیتاها در زمان مشخص شده بدون نیاز به وارد شدن به زیروال وقفه تایمر است.
    @armeducation
    درسته میخواستم با dma به spi دیتا انتقال بدم ولی سرعتش اینقدر زیاده مشکل ایجاد میشه برای همین دنبال تریگ کردن dma با timer هستم الان برای ارسال توسط spi از dma1_channel3 استفاده میکنم و همین طور dma هم کانفیگ کردم با آپدیت تایمر 3 ولی کار نمیکنه نمیدونم مشکلش چیه
    میکروم stm32f103 با cmsis

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

    پیش فرض

    قائدتا باید کار بکنه
    شما ابتدا از رم به gpio با تریگر تایمر تست کنید ببنید درست کار می کند سپس به سراغ spi بروید. تنظیم تایمر نیز به همان صورت قبلی است بعلاوه فعال کردن DMA
    در فیلم پیشرفته در مبحث DMA نیز مرحله به مرحله کار انجام شده است. ابتدا رم به رم. سپس رم به پرفرال
    اجرای عملی ارسال دیتا از رم به سریال با استفاده از DMA
    و سپس پریفرال به رم.
    دریافت دیتا از USART و انتقال به رم به با DMA

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

  1. مشکل در آنالوگ به دیجیتال (adc)
    توسط mzarkoob در انجمن LPC series (NXP)
    پاسخ: 16
    آخرين نوشته: 22-01-2014, 00:52
  2. کمک در مورد تبدیل آنالوگ به دیجیتال
    توسط vackiom در انجمن الکترونیک
    پاسخ: 5
    آخرين نوشته: 23-05-2013, 20:19
  3. انتقال دیتا ازمیکرو بهpcبا اترنت
    توسط ali asghar در انجمن مخابرات
    پاسخ: 3
    آخرين نوشته: 22-04-2013, 12:22
  4. پاسخ: 14
    آخرين نوشته: 20-02-2011, 01:44
  5. قفل رمز دیجیتالی
    توسط sam166 در انجمن AVR
    پاسخ: 14
    آخرين نوشته: 21-08-2010, 11:26

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

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