PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : ارسال دیتا از طریق DMA to spi



farhads
20-08-2012, 19:24
با سلام
من یه مشکلی با سرعت پیدا کردم نمی تونم از این دستور استفاده کنم می خوام این دستورا با dma راه اندازی کنم کسی می تونه کمکم کنه فقط می خوام یه بافر را با تعداد مشخص روی spi2 ازسال کنم الان با این دستور میشه ولی توی هر حلقه که میره رم را بخونه بریزه روی spi مکث دارم وسرعت میاد پایین اگه میشه کمک کنید

for(counter_1=0;counter_1<100 ;counter_1++){

PI_I2S_SendData(SPI2,buffer_tmp2[counter_1]);
}

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

farhads
20-08-2012, 20:35
ما که نتونستیم یه مثال هم پیدا نکردیم نه من با اخرین سرعت می خوام ازسال بشه مشکل اینجاست که نمی دونم کجا این اطلا عات را باید بدم

farhads
21-08-2012, 11:55
اقا هیچ کس نیست کمک کنه جایزه میدما

sadmonew
21-08-2012, 12:09
با سلام
من یه مشکلی با سرعت پیدا کردم نمی تونم از این دستور استفاده کنم می خوام این دستورا با 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);
}

farhads
21-08-2012, 18:20
با تشکر از جناب محمدی
میشه یه توضیحی هم بدهید من چیا به پروژه اضافه کنم واین کل یه بافر را میریزه و اون u32 چیه میشه یه توضیح کامل هم بدهید
این تنظیمات هستش و برای شروع کردن ریختن باید چه کرد
دستور اجراییش چیه
با تشکر

sadmonew
22-08-2012, 02:18
با تشکر از جناب محمدی
میشه یه توضیحی هم بدهید من چیا به پروژه اضافه کنم واین کل یه بافر را میریزه و اون u32 چیه میشه یه توضیح کامل هم بدهید
این تنظیمات هستش و برای شروع کردن ریختن باید چه کرد
دستور اجراییش چیه
با تشکر
سلام مهندس
مهندس من ميگم، اما خواهشا" خودتون هم روش كار كنيد ديگه!!
تنها كاري كه براي تنظيم لازمه انجام بدين، فعال كردن كلاك DMA1 هستش.
اين يه تابع براي ارسال ديتا از طريق DMA1 .
----------------------------------------------------
مهندس فرض كنيد شما 512 بايت داده ميخواين ارسال كنين. پس اول همه اون عدد 360 رو به 512 تغيير بدين.
اون بافري كه ديتا رو موقتا توش ذخيره كردين، به عنوان پارامتر ورودي براي اين تابع قرار بدين.
من تو اون مثال متغير buf_temp_temp رو از نوع رشته اي تعريف كردم و 512 بايت رو به اون اختصاص دادم.
هر جايي ار برنامتون كه خواستين ديتايي رو منتقل كنيد به ابن صورت عمل كنيد:


spi_DMA_transfer(buf_temp_temp);

farhads
23-08-2012, 15:20
با سلام
منا ببخشید من زیاد وارد به سی نیستم ولی با کمک شما حل شد با تشکر از شما

omega_adiban
31-07-2013, 23:07
سلام
من یه میکرو دارم که باید دیتای 7 تا میکروی دیگه رو بخونه
من از مستر به هر میکروی اسلیو ک قراره دیتاش رو بخونم یه پین بردم و تو حالت اینتراپت درخواست دیتا میکنم و spi زو میخونم
متاسفنه خیلی خطا داره و خیلی به هم میریزه
میشه راهنمایی کنید بچه ها؟

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

ali_rostami_7
24-10-2015, 00:21
اگر میخواید با نرخ تایین شده انجام بشه ، باید یکی از تایمر ها رو که به 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:06
کسی نظری نداره؟:(

omid.r
31-10-2018, 23:25
کسی نظری نداره؟:(
سلام
به نتیجه رسیدین ؟
من هم همین مشکل رو دارم و میخوام با تایمر dma رو تریگ کنم

mzarkoob
01-11-2018, 00:18
سلام
به نتیجه رسیدین ؟
من هم همین مشکل رو دارم و میخوام با تایمر 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

omid.r
01-11-2018, 00:50
سلام
بایستی تنظیم مربوطه در تایمر انجام بدید که مربوط بشه به 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

mzarkoob
02-11-2018, 23:28
قائدتا باید کار بکنه
شما ابتدا از رم به gpio با تریگر تایمر تست کنید ببنید درست کار می کند سپس به سراغ spi بروید. تنظیم تایمر نیز به همان صورت قبلی است بعلاوه فعال کردن DMA
در فیلم پیشرفته در مبحث DMA نیز مرحله به مرحله کار انجام شده است. ابتدا رم به رم. سپس رم به پرفرال
اجرای عملی ارسال دیتا از رم به سریال با استفاده از DMA (You can see links before reply)
و سپس پریفرال به رم.
دریافت دیتا از USART و انتقال به رم به با DMA (You can see links before reply)