Jump to content

    

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

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
29 минут назад, Integro сказал:

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now