Jump to content

    
Sign in to follow this  
jenya7

SPI и DMA

Recommended Posts

Мне нужно переслать по 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); - это размер единичной посылки или размер всего блока? где задается размер пересылаемого блока?

Edited by Jenya7

Share this post


Link to post
Share on other sites
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 

Share this post


Link to post
Share on other sites
1 hour ago, Integro said:

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

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


DMA0->TCD[0].NBYTES_MLNO 

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

Edited by jenya7

Share this post


Link to post
Share on other sites
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;

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

Share this post


Link to post
Share on other sites
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;

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

спасибо.

Share this post


Link to post
Share on other sites
1 hour ago, jenya7 said:

спасибо.

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

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

Share this post


Link to post
Share on other sites
19 minutes ago, Integro said:

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

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this