реклама на сайте
подробности

 
 
> DMA - для чего он и как его использовать
Abakt
сообщение Jan 30 2007, 22:39
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 73
Регистрация: 10-01-07
Пользователь №: 24 292



Подскажите для чего нужен DMA и если можно пример как его использовать. Пример "фирменный" или свой - в чем "СОЛЬ" DMA ?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
beer_warrior
сообщение Jan 31 2007, 22:35
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Цитата
C сточностью до наоборот - курить будет процессор, а DMA будет его тормозить и тупо выполнять его приказ.

А и действительно. Не дадите ли ссылку на доку? Момент ведь весьма принципиальный.


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Feb 1 2007, 00:40
Сообщение #3


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(beer_warrior @ Jan 31 2007, 23:35) *
А и действительно. Не дадите ли ссылку на доку? Момент ведь весьма принципиальный.

Вот что написано в мануале к SAM7S:

The Memory Controller has a simple, hard-wired priority bus arbiter that gives the control of the
bus to one of the two masters. The Peripheral DMA Controller has the highest priority; the ARM
processor has the lowest one.
[AT91SAM7S.pdf, 6175G–ATARM–22-Nov-06, page 120]

Действительно, курить в сторонке будет процессор, а не DMA...

Сообщение отредактировал sonycman - Feb 1 2007, 00:41
Go to the top of the page
 
+Quote Post
Karl
сообщение Feb 1 2007, 08:49
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 179
Регистрация: 4-02-05
Пользователь №: 2 429



Помогите, пожалуйста, с конкретной задачей: Необходимо через ДМА передавать массив в SPI и получать из него ответ (контроллер SAM7S64). Какие операции необходимо произвести?
Go to the top of the page
 
+Quote Post
Kitsok
сообщение Feb 1 2007, 12:23
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 9-11-06
Пользователь №: 22 136



Цитата(Karl @ Feb 1 2007, 08:49) *
Помогите, пожалуйста, с конкретной задачей: Необходимо через ДМА передавать массив в SPI и получать из него ответ (контроллер SAM7S64). Какие операции необходимо произвести?


Вот как делаю я (коментарии от специалистов приветствуются wink.gif )
Здесь только отсылка, ну и особенности от FreeRTOS, но общий смысл должен быть понятен.

Код
void SPI_task(void *pvParameters)
{
    unsigned portCHAR i;
    unsigned portCHAR SPI_buf[8];
    ( void ) pvParameters;
    portENTER_CRITICAL();

    AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, 1 << AT91C_ID_SPI);
    AT91F_PIO_CfgPeriph(AT91C_BASE_PIOA, AT91C_PA11_NPCS0 |
        AT91C_PA12_MISO |
        AT91C_PA13_MOSI |
        AT91C_PA14_SPCK, 0);
    AT91F_SPI_Reset(AT91C_BASE_SPI);

    AT91C_BASE_SPI->SPI_MR=0x0E0011;//Master mode, fixed select, disable decoder, FDIV=0 (MCK), PCS=1110

    AT91F_SPI_CfgCs(AT91C_BASE_SPI, 0,  AT91C_SPI_NCPHA | (128 << 8) | 0x04 );
    AT91F_SPI_Enable(AT91C_BASE_SPI);
    AT91F_PDC_Open(AT91C_BASE_PDC_SPI);
    for(i=0;i<8;i++) SPI_buf[i]=i;
    portEXIT_CRITICAL();

    for(;;)

     {
        while(AT91F_SPI_SendFrame(AT91C_BASE_SPI,(char*) &SPI_buf[0],8,0,0) == 0)
          vTaskDelay(portTICK_RATE_MS * 10);
        i++;
        SPI_buf[7]=i;
        vTaskDelay(portTICK_RATE_MS * 1000);
     }
}
Go to the top of the page
 
+Quote Post
Karl
сообщение Feb 1 2007, 13:26
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 179
Регистрация: 4-02-05
Пользователь №: 2 429



Спасибо, вроде все понятно. А с приемом Вы не разбирались?
Go to the top of the page
 
+Quote Post
Kitsok
сообщение Feb 1 2007, 14:08
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 9-11-06
Пользователь №: 22 136



Цитата(Karl @ Feb 1 2007, 13:26) *
Спасибо, вроде все понятно. А с приемом Вы не разбирались?

Нет, мне пока без надобности. Я на прием PDC использую с ADC. Код надо?
Go to the top of the page
 
+Quote Post
Karl
сообщение Feb 1 2007, 16:47
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 179
Регистрация: 4-02-05
Пользователь №: 2 429



Цитата(Kitsok @ Feb 1 2007, 16:08) *
Цитата(Karl @ Feb 1 2007, 13:26) *

Спасибо, вроде все понятно. А с приемом Вы не разбирались?

Нет, мне пока без надобности. Я на прием PDC использую с ADC. Код надо?


Да, пригодится. Кстати, передача заработала сразу smile.gif Спасибо!

У меня на SPI АЦП сидит. Так что надо и передачу и прием.
Go to the top of the page
 
+Quote Post
Kitsok
сообщение Feb 2 2007, 11:48
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 9-11-06
Пользователь №: 22 136



Это инициализация

Код
#define NCHANNELS 8

extern volatile unsigned portSHORT sADC_RAW[NCHANNELS*2];
#define   TRGEN    (0x0)    // Hardware triggering
#define   TRGSEL   (0x0)    // Use a Timer output signal (on rising edge) from TIOA0 (for this example)
#define   LOWRES   (0x0)    // 8-bit result output
#define   SLEEP    (0x0)    // Normal Mode
#define   PRESCAL  (0x0f)    // Max value
#define   STARTUP  (0xc)    // This time period must be higher than 20 ╣s and not 20 ms
#define   SHTIM    (0x2)    // Must be higher than 3 ADC clock cycles but depends on output
                            // impedance of the analog driver to the ADC input

void InitADC(void) {

  // Reset ADC
  AT91F_ADC_SoftReset (AT91C_BASE_ADC);

  // Open PDC for ADC
  AT91F_PDC_Open (AT91C_BASE_PDC_ADC);

  // Configure PDC for 2 buffers NCHANNELS bytes long each (Warning! Depends on LOWRES bit)
  AT91F_PDC_ReceiveFrame ( AT91C_BASE_PDC_ADC ,
                                (char *) &sADC_RAW[0], NCHANNELS,
                                (char *) &sADC_RAW[NCHANNELS], NCHANNELS);

  // Configure ADC
  AT91F_ADC_CfgModeReg (AT91C_BASE_ADC, (SHTIM << 24) | (STARTUP << 16) | (PRESCAL << 8) |
                             (SLEEP << 5) | (LOWRES <<4) | (TRGSEL << 1) | (TRGEN ) );

  // Enable all 8 channes
  AT91F_ADC_EnableChannel(AT91C_BASE_ADC, (1<<NCHANNELS) - 1);

  // Fire conversion
  AT91F_ADC_StartConversion(AT91C_BASE_ADC);
}


А это собственно работа
Код
        // Check what buffer to use from ADC
        if (AT91C_BASE_PDC_ADC->PDC_RCR == 0)
         {
          ptrADC_RAW=NCHANNELS;
          AT91F_PDC_ReceiveFrame ( AT91C_BASE_PDC_ADC ,
                                (char *) &sADC_RAW[0], NCHANNELS,
                                (char *) &sADC_RAW[NCHANNELS], NCHANNELS);
         }
        else
         {
          ptrADC_RAW=0;
         }

        // Re-fire conversion
        AT91F_ADC_StartConversion(AT91C_BASE_ADC);


Тут возможно следовало бы использовать библиотечные функции, но я не запарился и читаю напрямую PDC_RCR.
ptrADC_RAW нужен для того, чтобы знать, в какой части буфера лежат свежие данные:

Код
// Convert 10-bit wide ADC results into 8-bit wide
          // Clean target array
          for(i=0;i<(NCHANNELS*10/8);i++) ucAxes[i]=0;

          // Do bit manipulations
          // The trick with +0x0200 & 0x03ff is - we need negative 10-bit wide number
          for(i=0;i<(NCHANNELS*10);i++)
           {
            ucAxes[i/8] += (((((sADC_RAW[ptrADC_RAW+(i/10)] + 0x0200)&0x03ff)>> (i%10))  & 0x01) << (i%8));
           }


Сообщение отредактировал Kitsok - Feb 2 2007, 11:51
Go to the top of the page
 
+Quote Post
Karl
сообщение Feb 6 2007, 13:16
Сообщение #10


Частый гость
**

Группа: Свой
Сообщений: 179
Регистрация: 4-02-05
Пользователь №: 2 429



Можно ли одновременно передавать массив данных в SPI через ДМА и получать данные из SPI через тот же ДМА? Что-то у меня не получается такой обмен... Передача идет, а прием - нет.
Go to the top of the page
 
+Quote Post
Kitsok
сообщение Feb 6 2007, 15:28
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 9-11-06
Пользователь №: 22 136



Цитата(Karl @ Feb 6 2007, 13:16) *
Можно ли одновременно передавать массив данных в SPI через ДМА и получать данные из SPI через тот же ДМА? Что-то у меня не получается такой обмен... Передача идет, а прием - нет.


Ну вообще, PDA - штука двунаправленная, но конкретику надо смотреть в даташите и всяких примерах. Я не реализовывал двунаправленную передачу по SPI.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Abakt   DMA - для чего он и как его использовать   Jan 30 2007, 22:39
- - beer_warrior   DMA aka Direct Memory Access - дает возможность п...   Jan 31 2007, 01:07
- - Abakt   Спасибо. подскажите апноут какой нить чтоб посмотр...   Jan 31 2007, 01:20
- - Abakt   и какова скорость приема дданных ? например по пар...   Jan 31 2007, 01:45
- - defunct   DMA - это маленький простеникий и тупой slave сопр...   Jan 31 2007, 02:36
|- - zltigo   Цитата(defunct @ Jan 31 2007, 01:36) Доми...   Jan 31 2007, 20:34
- - beer_warrior   ЦитатаСпасибо. подскажите апноут какой нить чтоб п...   Jan 31 2007, 10:27
- - Abakt   большое спасибо за помощь. сижу разбираюсь.   Jan 31 2007, 11:40
- - Dron_Gus   Цитата(zltigo @ Jan 31 2007, 20:34) C сто...   Jan 31 2007, 22:17
|- - ASN   zltigo Режим работы контроллера DMA определяется ...   Jan 31 2007, 23:05
||- - Karl   Цитата(Kitsok @ Feb 6 2007, 17:28) Цитата...   Feb 7 2007, 08:44
||- - Kitsok   Цитата(Karl @ Feb 7 2007, 08:44) Спасибо,...   Feb 12 2007, 19:01
|- - zltigo   Цитата(sonycman @ Jan 31 2007, 23:40) The...   Feb 1 2007, 19:38
|- - defunct   Цитата(zltigo @ Feb 1 2007, 18:38) Причем...   Feb 2 2007, 01:46
- - Dron_Gus   Цитата(Kitsok @ Feb 1 2007, 14:08) Нет, м...   Feb 1 2007, 14:53
- - Karl   Цитата(Kitsok @ Feb 12 2007, 21:01) Цитат...   Feb 15 2007, 07:26
|- - Kitsok   Спасибо большое! Я так и думал, что в общем-т...   Feb 15 2007, 18:55
|- - beer_warrior   ЦитатаСобственно работа: Кодfor(;;) { whi...   Feb 15 2007, 19:59
|- - Karl   Цитата(beer_warrior @ Feb 15 2007, 21:59)...   Feb 16 2007, 09:29
|- - Kitsok   Цитата(beer_warrior @ Feb 15 2007, 19:59)...   Feb 16 2007, 11:46
|- - HARMHARM   Цитата(Kitsok @ Feb 16 2007, 10:46) Друго...   Feb 16 2007, 12:39
|- - Karl   Цитата(Kitsok @ Feb 16 2007, 13:46) Вот д...   Feb 16 2007, 12:53
|- - Kitsok   Цитата(Karl @ Feb 16 2007, 12:53) SPI раб...   Feb 20 2007, 01:03
|- - Karl   Цитата(Kitsok @ Feb 20 2007, 03:03) Цитат...   Feb 20 2007, 06:54
|- - Kitsok   Всем привет! Вчера вперся в непонятную пробле...   Feb 20 2007, 12:23
- - Slonic   Подскажите, пожалуйста, можно ли использовать DMA ...   Feb 16 2007, 14:35
- - Dron_Gus   А обьясните мне глупому по PDC у SAM7. Предположим...   Feb 20 2007, 17:21
- - Сергей Борщ   Цитата(Dron_Gus @ Feb 20 2007, 16:21) Зна...   Feb 20 2007, 18:01


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 22:50
Рейтинг@Mail.ru


Страница сгенерированна за 0.01524 секунд с 7
ELECTRONIX ©2004-2016