Перейти к содержанию
    

SPI и DMA

Мне нужно переслать по SPI большой блок данных (4096 байт). Я нашел пример

void vfnInitDMA_SPITxMstr(void)
{
  SIM->SCGC6 |= SIM_SCGC6_DMAMUX_MASK;
  SIM->SCGC7 |= SIM_SCGC7_DMA_MASK;
    /********************************************************************************
**************************************************/
    /********************************************************************************
**************************************************/
  /* Look for the DMA request sources table on your RM for a complete list of available sources */
  DMAMUX->CHCFG[0] |= DMAMUX_CHCFG_ENBL_MASK | DMAMUX_CHCFG_SOURCE(17); //SPI0 TX
   /*start the sequence*/
  //DMA_ERQ |= DMA_ERQ_ERQ0_MASK;
  /* This example has no table of data to                                                */
    /* transfer, making only a single minor loop necessary to complete a major loop        */
  DMA0->TCD[0].SADDR =  (uint32_t)&MstrDataSend_Buff;    //Source address
  /* Destination address */
  DMA0->TCD[0].DADDR = (unsigned long)(&SPI0->PUSHR); //
    /* Source offset disabled */
  DMA0->TCD[0].SOFF = 0x04;
    /* Source and Destination Modulo off, source and destination size 2 = 32 bits */
  DMA0->TCD[0].ATTR = DMA_ATTR_SSIZE(2) | DMA_ATTR_DSIZE(2);
    /* Transfer 4 bytes per transaction */
  DMA0->TCD[0].NBYTES_MLNO = 0x04;
    /* No adjust needed */
  DMA0->TCD[0].SLAST = -32;
    /* Destination offset disabled */
  DMA0->TCD[0].DOFF = 0x00;
    /* No link channel to channel, 1 transaction */
  DMA0->TCD[0].CITER_ELINKNO = DMA_CITER_ELINKNO_CITER(8);
    /* No adjustment to    destination address */
  DMA0->TCD[0].DLAST_SGA = 0;
    
  DMA0->TCD[0].BITER_ELINKNO = DMA_BITER_ELINKNO_BITER(8);

DMA0->TCD[0].CSR = DMA_CSR_INTMAJOR_MASK | DMA_CSR_DREQ_MASK;
}

 

Есть пара непонятных моментов.

 

DMA0->TCD[0].ATTR = DMA_ATTR_SSIZE(2) | DMA_ATTR_DSIZE(2); - это размер единичной посылки или размер всего блока? где задается размер пересылаемого блока?

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 6/3/2018 at 9:58 AM, jenya7 said:

DMA0->TCD[0].ATTR = DMA_ATTR_SSIZE(2) | DMA_ATTR_DSIZE(2); - это размер единичной посылки или размер всего блока? где задается размер пересылаемого блока?

Это размер одной транзакции как написано в комментарии для Sourse и Destination соответственно. 2-соответствует 32bit

Количество транзакций определяется

DMA0->TCD[0].NBYTES_MLNO 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, Integro said:

Это размер одной транзакции как написано в комментарии для Sourse и Destination соответственно. 2-соответствует 32bit

Количество транзакций определяется


DMA0->TCD[0].NBYTES_MLNO 

размер транзакции это количество байт на посылку? а если мне надо послать 4096 байт?

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 hours ago, jenya7 said:

а если мне надо послать 4096 байт?

либо делаете так:

DMA0->TCD[0].ATTR = DMA_ATTR_SSIZE(0) | DMA_ATTR_DSIZE(0);
DMA0->TCD[0].NBYTES_MLNO = 4096;

Либо так:

DMA0->TCD[0].ATTR = DMA_ATTR_SSIZE(2) | DMA_ATTR_DSIZE(2);
DMA0->TCD[0].NBYTES_MLNO = 4096/4;

Но это все зависит от слейва, могут быть заморочки с порядком байт, но могу ошибаться

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 hours ago, Integro said:

либо делаете так:


DMA0->TCD[0].ATTR = DMA_ATTR_SSIZE(0) | DMA_ATTR_DSIZE(0);
DMA0->TCD[0].NBYTES_MLNO = 4096;

Либо так:


DMA0->TCD[0].ATTR = DMA_ATTR_SSIZE(2) | DMA_ATTR_DSIZE(2);
DMA0->TCD[0].NBYTES_MLNO = 4096/4;

Но это все зависит от слейва, могут быть заморочки с порядком байт, но могу ошибаться

спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, jenya7 said:

спасибо.

@jenya7, поздравляю Вас! 2000 сообщений, мне кажется, Вы только что стали Гуру :)

Пора заканчивать с простыми вопросами!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

19 minutes ago, Integro said:

@jenya7, поздравляю Вас! 2000 сообщений, мне кажется, Вы только что стали Гуру :)

Пора заканчивать с простымы вопросами!

я очень далек от Гуру. я бы отменил автоматическое присвоение регалий.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

29 минут назад, Integro сказал:

@jenya7Пора заканчивать с простымы вопросами!

Видимо бывают гуру по задаванию вопросов  :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...