S32K344 bare-metal DMA initialization

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

S32K344 bare-metal DMA initialization

ソリューションへジャンプ
3,604件の閲覧回数
mateusz_swiszcz
Contributor II

I've got a problem with DMA init. I was unable to initialize DMA by using bare-metal programming. The interrupt is not called and no data is passed. Meanwhile interrupt from SPI is working. Could you check my DMA configuration? I also set a "LPSPI_DER_RDDE" bit in "IP_LPSPI/n/->DER" register. This should set DMA for receive data. 

void DMA_Init(volatile uint32_t rxBuffer) {
	/*
	For remaining S32K3xx devices: DMAMUX_0 channel 0-15 and DMAMUX_1 channel 0-15 are
	mapped to eDMA Transfer Control Descriptor(TCD) 0-15 and eDMA Transfer Control Descriptor(TCD)
	16-31, respectively
	*/

	// TCD register init
    IP_TCD->TCD0_SADDR = 0U;
    IP_TCD->TCD0_SOFF = 0;
    IP_TCD->TCD0_ATTR = 0U;
    IP_TCD->NBYTES0.TCD0_NBYTES_MLOFFNO = 0U;
    IP_TCD->NBYTES0.TCD0_NBYTES_MLOFFYES = 0U;
    IP_TCD->TCD0_SLAST_SDA = 0;
    IP_TCD->TCD0_DADDR = 0U;
    IP_TCD->TCD0_DOFF = 0;
    IP_TCD->CITER0.TCD0_CITER_ELINKNO = 0U;
    IP_TCD->CITER0.TCD0_CITER_ELINKYES = 0U;
    IP_TCD->TCD0_DLAST_SGA = 0;
    IP_TCD->TCD0_CSR = 0U;
    IP_TCD->BITER0.TCD0_BITER_ELINKNO = 0U;
    IP_TCD->BITER0.TCD0_BITER_ELINKYES = 0U;

    //===== DMA MUX =====//
	// Enable a source without periodic triggering
	// 1. Determine the DMA channel with which the source is associated.
	// LPSPI1 DMA RX Request -> Source 46
	// 2. Write 0 to CHCFGn[ENBL] and CHCFGn[TRIG] of the DMA channel.
	IP_DMAMUX_0->CHCFG[0] &= ~DMAMUX_CHCFG_ENBL_MASK;
	IP_DMAMUX_0->CHCFG[0] &= ~DMAMUX_CHCFG_TRIG_MASK;
	// 3. You can enable the DMA channel at this point.
	IP_DMAMUX_0->CHCFG[0] |= DMAMUX_CHCFG_ENBL_MASK;
	// 4. Select the source to be routed to the DMA channel.
	IP_DMAMUX_0->CHCFG[0] |= DMAMUX_CHCFG_SOURCE(46);

	//===== eDMA =====//
    // 1. Write to the CSR if a configuration other than the default is wanted.
    // 2. Write the channel priority levels to the CHn_PRI registers and group priority levels to the CHn_GRPRI registers if a
    // configuration other than the default is wanted.
    // 3. Enable error interrupts in the CHn_CSR[EEI] registers if they are wanted.
	// 4. Write the 32-byte TCD for each channel that may request service.
	// CH0_SBR_MID: Default master id -> 0b10
	// Source address -> SPI receive buffer
	IP_TCD->TCD0_SADDR = IP_LPSPI_1->RDR;
	// Destination address
	IP_TCD->TCD0_DADDR = rxBuffer;
	// Source Address Offset
	IP_TCD->TCD0_SOFF = 4;
	// Destination Address Offset
	IP_TCD->TCD0_DOFF = 4;
	// Source size: 32-bit
	IP_TCD->TCD0_ATTR |= DMA_TCD_TCD0_ATTR_SSIZE(0b10);
	// Destination size: 32-bit
	IP_TCD->TCD0_ATTR |= DMA_TCD_TCD0_ATTR_DSIZE(0b10);

	// 4 byte transfer
	IP_TCD->NBYTES0.TCD0_NBYTES_MLOFFNO = 4;
	// Current Major Loop Count
	IP_TCD->CITER0.TCD0_CITER_ELINKNO = 1;
	// Beginning Major Loop Count
	IP_TCD->BITER0.TCD0_BITER_ELINKNO = 1;

	// Interrupt after transfer is complete
	IP_TCD->TCD0_CSR |= DMA_TCD_TCD0_CSR_INTMAJOR_MASK;

	// Enable interrupt
	__NVIC_ClearPendingIRQ(DMATCD0_IRQn);
	__NVIC_SetPriority(DMATCD0_IRQn, 0);
	__NVIC_EnableIRQ(DMATCD0_IRQn);

	// 5. Enable any hardware service requests via the CHn_CSR[ERQ] registers.
	IP_TCD->CH0_CSR |= DMA_TCD_CH0_CSR_ERQ_MASK;
	
}

void DMATCD0_Handler(void) {
	// Print rxBuffer
	printf("rxBuffer: %ld", rxBuffer);
	// Clear interrupt request
	IP_TCD->CH0_INT = 1;
}

 

0 件の賞賛
返信
1 解決策
3,513件の閲覧回数
danielmartynek
NXP TechSupport
NXP TechSupport

HI Mateusz,

Thanks for the project.

 

First, I enabled DMAMUX_0_CH0 at 4028_0000h + 0x3.

IP_DMAMUX_0->CHCFG[3] = 0xAE;

danielmartynek_0-1743512787294.png

 

Then I saw that SBE = 1 Source bus error in the TCD0 descriptor.

The TCD0_SADDR register was not configured (checked in the register view)

IP_TCD->TCD0_SADDR = &IP_LPSPI_1->RDR;

 

Now, it gets to the DMA handler:

danielmartynek_1-1743513063363.png

 

Regards,

Daniel

元の投稿で解決策を見る

8 返答(返信)
3,585件の閲覧回数
danielmartynek
NXP TechSupport
NXP TechSupport

Hi @mateusz_swiszcz,

You should not offset the source address (TCD0_SOFF), but otherwise I don't see any issue in the code.

Is there any error flag set in EDMA?

Do you have the buffers in non-cacheable SRAM?

Can you dump the EDMA and NVIC registers and share it?

 

Thanks,

Daniel

 

0 件の賞賛
返信
3,557件の閲覧回数
mateusz_swiszcz
Contributor II
Hi,

I disabled a source address offset but nothing changed. There's no error flags in EDMA. I have buffers in non-cacheable SRAM. 

NVIC->ISER[0] = 0x10; NVIC->ISER[5] = 0x40; NVIC->ICER[0] = 0x10; NVIC->ICER[5] = 0x40

EDMA->CSR = 0x300000

Other register fields in EDMA and NVIC are null.
0 件の賞賛
返信
3,543件の閲覧回数
danielmartynek
NXP TechSupport
NXP TechSupport

Hi @mateusz_swiszcz,

Could you share the whole project so that I can test it?

It can be shared privately via a support ticket.

 

 

0 件の賞賛
返信
3,521件の閲覧回数
mateusz_swiszcz
Contributor II

Hi, @danielmartynek 

The whole projects is in the attachment.

0 件の賞賛
返信
3,514件の閲覧回数
danielmartynek
NXP TechSupport
NXP TechSupport

HI Mateusz,

Thanks for the project.

 

First, I enabled DMAMUX_0_CH0 at 4028_0000h + 0x3.

IP_DMAMUX_0->CHCFG[3] = 0xAE;

danielmartynek_0-1743512787294.png

 

Then I saw that SBE = 1 Source bus error in the TCD0 descriptor.

The TCD0_SADDR register was not configured (checked in the register view)

IP_TCD->TCD0_SADDR = &IP_LPSPI_1->RDR;

 

Now, it gets to the DMA handler:

danielmartynek_1-1743513063363.png

 

Regards,

Daniel

3,403件の閲覧回数
mateusz_swiszcz
Contributor II

Hi, @danielmartynek 

Why does CHCFG[3] works and CHCFG[0] not when I'm using TCD0 and Channel 0 of DMA? How can i match numbers of CHCFG[n], TCDn, CHn in case of other instances of SPI or other peripheries?

0 件の賞賛
返信
3,399件の閲覧回数
danielmartynek
NXP TechSupport
NXP TechSupport

Hi @mateusz_swiszcz,

Here is the offset of the registers:

danielmartynek_0-1744022054705.png

danielmartynek_1-1744022091817.png

 

3,456件の閲覧回数
mateusz_swiszcz
Contributor II
Thanks for the help, it works
0 件の賞賛
返信
%3CLINGO-SUB%20id%3D%22lingo-sub-2069296%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3ES32K344%E3%83%99%E3%82%A2%E3%83%A1%E3%82%BF%E3%83%ABDMA%E3%81%AE%E5%88%9D%E6%9C%9F%E5%8C%96%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2069296%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%3CP%3EDMA%20init%20%E3%81%AB%E5%95%8F%E9%A1%8C%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%E3%83%99%E3%82%A2%E3%83%A1%E3%82%BF%E3%83%AB%20%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%20DMA%20%E3%82%92%E5%88%9D%E6%9C%9F%E5%8C%96%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%9B%E3%82%93%E3%81%A7%E3%81%97%E3%81%9F%E3%80%82%E5%89%B2%E3%82%8A%E8%BE%BC%E3%81%BF%E3%81%AF%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%95%E3%82%8C%E3%81%9A%E3%80%81%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AF%E6%B8%A1%E3%81%95%E3%82%8C%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82%E3%81%9D%E3%81%AE%E9%96%93%E3%80%81SPI%E3%81%8B%E3%82%89%E3%81%AE%E5%89%B2%E3%82%8A%E8%BE%BC%E3%81%BF%E3%81%AF%E6%A9%9F%E8%83%BD%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82DMA%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%97%E3%81%A6%E3%81%84%E3%81%9F%E3%81%A0%E3%81%91%E3%81%BE%E3%81%99%E3%81%8B%3F%E3%81%BE%E3%81%9F%E3%80%81%E3%80%8CIP_LPSPI%2Fn%2F-%26gt%3BDER%E3%80%8D%E3%83%AC%E3%82%B8%E3%82%B9%E3%82%BF%E3%81%AB%E3%80%8CLPSPI_DER_RDDE%E3%80%8D%E3%83%93%E3%83%83%E3%83%88%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82%E3%81%93%E3%82%8C%E3%81%AB%E3%82%88%E3%82%8A%E3%80%81%E5%8F%97%E4%BF%A1%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%20DMA%20%E3%81%8C%E8%A8%AD%E5%AE%9A%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82%3C%2FP%3E%3CPRE%20class%3D%22lia-code-sample%20language-c%22%3E%3CCODE%20translate%3D%22no%22%3Evoid%20DMA_Init(volatile%20uint32_t%20rxBuffer)%20%7B%0A%09%2F*%0A%09For%20remaining%20S32K3xx%20devices%3A%20DMAMUX_0%20channel%200-15%20and%20DMAMUX_1%20channel%200-15%20are%0A%09mapped%20to%20eDMA%20Transfer%20Control%20Descriptor(TCD)%200-15%20and%20eDMA%20Transfer%20Control%20Descriptor(TCD)%0A%0916-31%2C%20respectively%0A%09*%2F%0A%0A%09%2F%2F%20TCD%20register%20init%0A%20%20%20%20IP_TCD-%26gt%3BTCD0_SADDR%20%3D%200U%3B%0A%20%20%20%20IP_TCD-%26gt%3BTCD0_SOFF%20%3D%200%3B%0A%20%20%20%20IP_TCD-%26gt%3BTCD0_ATTR%20%3D%200U%3B%0A%20%20%20%20IP_TCD-%26gt%3BNBYTES0.TCD0_NBYTES_MLOFFNO%20%3D%200U%3B%0A%20%20%20%20IP_TCD-%26gt%3BNBYTES0.TCD0_NBYTES_MLOFFYES%20%3D%200U%3B%0A%20%20%20%20IP_TCD-%26gt%3BTCD0_SLAST_SDA%20%3D%200%3B%0A%20%20%20%20IP_TCD-%26gt%3BTCD0_DADDR%20%3D%200U%3B%0A%20%20%20%20IP_TCD-%26gt%3BTCD0_DOFF%20%3D%200%3B%0A%20%20%20%20IP_TCD-%26gt%3BCITER0.TCD0_CITER_ELINKNO%20%3D%200U%3B%0A%20%20%20%20IP_TCD-%26gt%3BCITER0.TCD0_CITER_ELINKYES%20%3D%200U%3B%0A%20%20%20%20IP_TCD-%26gt%3BTCD0_DLAST_SGA%20%3D%200%3B%0A%20%20%20%20IP_TCD-%26gt%3BTCD0_CSR%20%3D%200U%3B%0A%20%20%20%20IP_TCD-%26gt%3BBITER0.TCD0_BITER_ELINKNO%20%3D%200U%3B%0A%20%20%20%20IP_TCD-%26gt%3BBITER0.TCD0_BITER_ELINKYES%20%3D%200U%3B%0A%0A%20%20%20%20%2F%2F%3D%3D%3D%3D%3D%20DMA%20MUX%20%3D%3D%3D%3D%3D%2F%2F%0A%09%2F%2F%20Enable%20a%20source%20without%20periodic%20triggering%0A%09%2F%2F%201.%20Determine%20the%20DMA%20channel%20with%20which%20the%20source%20is%20associated.%0A%09%2F%2F%20LPSPI1%20DMA%20RX%20Request%20-%26gt%3B%20Source%2046%0A%09%2F%2F%202.%20Write%200%20to%20CHCFGn%5BENBL%5D%20and%20CHCFGn%5BTRIG%5D%20of%20the%20DMA%20channel.%0A%09IP_DMAMUX_0-%26gt%3BCHCFG%5B0%5D%20%26amp%3B%3D%20~DMAMUX_CHCFG_ENBL_MASK%3B%0A%09IP_DMAMUX_0-%26gt%3BCHCFG%5B0%5D%20%26amp%3B%3D%20~DMAMUX_CHCFG_TRIG_MASK%3B%0A%09%2F%2F%203.%20You%20can%20enable%20the%20DMA%20channel%20at%20this%20point.%0A%09IP_DMAMUX_0-%26gt%3BCHCFG%5B0%5D%20%7C%3D%20DMAMUX_CHCFG_ENBL_MASK%3B%0A%09%2F%2F%204.%20Select%20the%20source%20to%20be%20routed%20to%20the%20DMA%20channel.%0A%09IP_DMAMUX_0-%26gt%3BCHCFG%5B0%5D%20%7C%3D%20DMAMUX_CHCFG_SOURCE(46)%3B%0A%0A%09%2F%2F%3D%3D%3D%3D%3D%20eDMA%20%3D%3D%3D%3D%3D%2F%2F%0A%20%20%20%20%2F%2F%201.%20Write%20to%20the%20CSR%20if%20a%20configuration%20other%20than%20the%20default%20is%20wanted.%0A%20%20%20%20%2F%2F%202.%20Write%20the%20channel%20priority%20levels%20to%20the%20CHn_PRI%20registers%20and%20group%20priority%20levels%20to%20the%20CHn_GRPRI%20registers%20if%20a%0A%20%20%20%20%2F%2F%20configuration%20other%20than%20the%20default%20is%20wanted.%0A%20%20%20%20%2F%2F%203.%20Enable%20error%20interrupts%20in%20the%20CHn_CSR%5BEEI%5D%20registers%20if%20they%20are%20wanted.%0A%09%2F%2F%204.%20Write%20the%2032-byte%20TCD%20for%20each%20channel%20that%20may%20request%20service.%0A%09%2F%2F%20CH0_SBR_MID%3A%20Default%20master%20id%20-%26gt%3B%200b10%0A%09%2F%2F%20Source%20address%20-%26gt%3B%20SPI%20receive%20buffer%0A%09IP_TCD-%26gt%3BTCD0_SADDR%20%3D%20IP_LPSPI_1-%26gt%3BRDR%3B%0A%09%2F%2F%20Destination%20address%0A%09IP_TCD-%26gt%3BTCD0_DADDR%20%3D%20rxBuffer%3B%0A%09%2F%2F%20Source%20Address%20Offset%0A%09IP_TCD-%26gt%3BTCD0_SOFF%20%3D%204%3B%0A%09%2F%2F%20Destination%20Address%20Offset%0A%09IP_TCD-%26gt%3BTCD0_DOFF%20%3D%204%3B%0A%09%2F%2F%20Source%20size%3A%2032-bit%0A%09IP_TCD-%26gt%3BTCD0_ATTR%20%7C%3D%20DMA_TCD_TCD0_ATTR_SSIZE(0b10)%3B%0A%09%2F%2F%20Destination%20size%3A%2032-bit%0A%09IP_TCD-%26gt%3BTCD0_ATTR%20%7C%3D%20DMA_TCD_TCD0_ATTR_DSIZE(0b10)%3B%0A%0A%09%2F%2F%204%20byte%20transfer%0A%09IP_TCD-%26gt%3BNBYTES0.TCD0_NBYTES_MLOFFNO%20%3D%204%3B%0A%09%2F%2F%20Current%20Major%20Loop%20Count%0A%09IP_TCD-%26gt%3BCITER0.TCD0_CITER_ELINKNO%20%3D%201%3B%0A%09%2F%2F%20Beginning%20Major%20Loop%20Count%0A%09IP_TCD-%26gt%3BBITER0.TCD0_BITER_ELINKNO%20%3D%201%3B%0A%0A%09%2F%2F%20Interrupt%20after%20transfer%20is%20complete%0A%09IP_TCD-%26gt%3BTCD0_CSR%20%7C%3D%20DMA_TCD_TCD0_CSR_INTMAJOR_MASK%3B%0A%0A%09%2F%2F%20Enable%20interrupt%0A%09__NVIC_ClearPendingIRQ(DMATCD0_IRQn)%3B%0A%09__NVIC_SetPriority(DMATCD0_IRQn%2C%200)%3B%0A%09__NVIC_EnableIRQ(DMATCD0_IRQn)%3B%0A%0A%09%2F%2F%205.%20Enable%20any%20hardware%20service%20requests%20via%20the%20CHn_CSR%5BERQ%5D%20registers.%0A%09IP_TCD-%26gt%3BCH0_CSR%20%7C%3D%20DMA_TCD_CH0_CSR_ERQ_MASK%3B%0A%09%0A%7D%0A%0Avoid%20DMATCD0_Handler(void)%20%7B%0A%09%2F%2F%20Print%20rxBuffer%0A%09printf(%22rxBuffer%3A%20%25ld%22%2C%20rxBuffer)%3B%0A%09%2F%2F%20Clear%20interrupt%20request%0A%09IP_TCD-%26gt%3BCH0_INT%20%3D%201%3B%0A%7D%3C%2FCODE%3E%3C%2FPRE%3E%3CBR%20%2F%3E%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-2074177%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3ERe%3A%20S32K344%20%E3%83%99%E3%82%A2%E3%83%A1%E3%82%BF%E3%83%AB%20DMA%20%E3%81%AE%E5%88%9D%E6%9C%9F%E5%8C%96%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2074177%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%E5%8A%A9%E3%81%91%E3%81%A6%E3%81%8F%E3%82%8C%E3%81%A6%E3%81%82%E3%82%8A%E3%81%8C%E3%81%A8%E3%81%86%E3%80%81%E3%81%9D%E3%82%8C%E3%81%AF%E5%8B%95%E4%BD%9C%E3%81%97%E3%81%BE%E3%81%99%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-2070986%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3ERe%3A%20S32K344%20%E3%83%99%E3%82%A2%E3%83%A1%E3%82%BF%E3%83%AB%20DMA%20%E3%81%AE%E5%88%9D%E6%9C%9F%E5%8C%96%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2070986%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF%3CBR%20%2F%3E%3CBR%20%2F%3E%E3%82%BD%E3%83%BC%E3%82%B9%20%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%20%E3%82%AA%E3%83%95%E3%82%BB%E3%83%83%E3%83%88%E3%82%92%E7%84%A1%E5%8A%B9%E3%81%AB%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%E3%81%8C%E3%80%81%E4%BD%95%E3%82%82%E5%A4%89%E6%9B%B4%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82EDMA%20%E3%81%AB%E3%81%AF%E3%82%A8%E3%83%A9%E3%83%BC%20%E3%83%95%E3%83%A9%E3%82%B0%E3%81%AF%E3%81%82%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5%E4%B8%8D%E5%8F%AF%E8%83%BD%E3%81%AA%20SRAM%20%E3%81%AB%E3%83%90%E3%83%83%E3%83%95%E3%82%A1%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%3CBR%20%2F%3E%3CBR%20%2F%3ENVIC-%26gt%3BISER%5B0%5D%20%3D%200x10%3BNVIC-%26gt%3BISER%5B5%5D%20%3D%200x40%3BNVIC-%26gt%3BICER%5B0%5D%20%3D%200x10%3BNVIC-%26gt%3BICER%5B5%5D%20%3D%200x40%3CBR%20%2F%3E%3CBR%20%2F%3EEDMA-%26gt%3BCSR%20%3D%200x300000%3CBR%20%2F%3E%3CBR%20%2F%3EEDMA%20%E3%81%8A%E3%82%88%E3%81%B3%20NVIC%20%E3%81%AE%E4%BB%96%E3%81%AE%E3%83%AC%E3%82%B8%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%BB%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%81%AF%E3%83%8C%E3%83%AB%E3%81%A7%E3%81%99%E3%80%82%3C%2FLINGO-BODY%3E