S32K344 bare-metal DMA initialization

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 
已解决

S32K344 bare-metal DMA initialization

跳至解决方案
3,605 次查看
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,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

在原帖中查看解决方案

8 回复数
3,586 次查看
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,558 次查看
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,544 次查看
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,522 次查看
mateusz_swiszcz
Contributor II

Hi, @danielmartynek 

The whole projects is in the attachment.

0 项奖励
回复
3,515 次查看
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,404 次查看
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,400 次查看
danielmartynek
NXP TechSupport
NXP TechSupport

Hi @mateusz_swiszcz,

Here is the offset of the registers:

danielmartynek_0-1744022054705.png

danielmartynek_1-1744022091817.png

 

3,457 次查看
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%E8%A3%B8%E6%9C%BADMA%E5%88%9D%E5%A7%8B%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%3E%E6%88%91%E7%9A%84%20DMA%20%E5%88%9D%E5%A7%8B%E5%8C%96%E5%87%BA%E7%8E%B0%E4%BA%86%E9%97%AE%E9%A2%98%E3%80%82%E6%88%91%E6%97%A0%E6%B3%95%E4%BD%BF%E7%94%A8%E8%A3%B8%E6%9C%BA%E7%BC%96%E7%A8%8B%E6%9D%A5%E5%88%9D%E5%A7%8B%E5%8C%96%20DMA%E3%80%82%E6%9C%AA%E8%B0%83%E7%94%A8%E4%B8%AD%E6%96%AD%E4%B8%94%E6%9C%AA%E4%BC%A0%E9%80%92%E4%BB%BB%E4%BD%95%E6%95%B0%E6%8D%AE%E3%80%82%E5%90%8C%E6%97%B6%EF%BC%8CSPI%20%E4%B8%AD%E6%96%AD%E6%AD%A3%E5%9C%A8%E5%B7%A5%E4%BD%9C%E3%80%82%E4%BD%A0%E8%83%BD%E6%A3%80%E6%9F%A5%E4%B8%80%E4%B8%8B%E6%88%91%E7%9A%84%20DMA%20%E9%85%8D%E7%BD%AE%E5%90%97%EF%BC%9F%E6%88%91%E8%BF%98%E5%9C%A8%E2%80%9CIP_LPSPI%2Fn%2F-%26gt%3BDER%E2%80%9D%E5%AF%84%E5%AD%98%E5%99%A8%E4%B8%AD%E8%AE%BE%E7%BD%AE%E4%BA%86%E2%80%9CLPSPI_DER_RDDE%E2%80%9D%E4%BD%8D%E3%80%82%E8%BF%99%E5%BA%94%E8%AF%A5%E8%AE%BE%E7%BD%AE%20DMA%20%E6%9D%A5%E6%8E%A5%E6%94%B6%E6%95%B0%E6%8D%AE%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%3E%E5%9B%9E%E5%A4%8D%EF%BC%9AS32K344%E8%A3%B8%E6%9C%BADMA%E5%88%9D%E5%A7%8B%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%E8%B0%A2%E8%B0%A2%E4%BD%A0%E7%9A%84%E5%B8%AE%E5%8A%A9%EF%BC%8C%E5%AE%83%E6%9C%89%E6%95%88%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-2070986%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%E5%9B%9E%E5%A4%8D%EF%BC%9AS32K344%E8%A3%B8%E6%9C%BADMA%E5%88%9D%E5%A7%8B%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%E4%BD%A0%E5%A5%BD%EF%BC%8C%3CBR%20%2F%3E%3CBR%20%2F%3E%E6%88%91%E7%A6%81%E7%94%A8%E4%BA%86%E6%BA%90%E5%9C%B0%E5%9D%80%E5%81%8F%E7%A7%BB%EF%BC%8C%E4%BD%86%E6%B2%A1%E6%9C%89%E4%BB%BB%E4%BD%95%E5%8F%98%E5%8C%96%E3%80%82EDMA%20%E4%B8%AD%E6%B2%A1%E6%9C%89%E9%94%99%E8%AF%AF%E6%A0%87%E5%BF%97%E3%80%82%E6%88%91%E5%9C%A8%E4%B8%8D%E5%8F%AF%E7%BC%93%E5%AD%98%E7%9A%84%20SRAM%20%E4%B8%AD%E6%9C%89%E7%BC%93%E5%86%B2%E5%8C%BA%E3%80%82%3CBR%20%2F%3E%3CBR%20%2F%3ENVIC-%26gt%3BISER%5B0%5D%20%3D%200x10%3B%20NVIC-%26gt%3BISER%5B5%5D%20%3D%200x40%3B%20NVIC-%26gt%3BICER%5B0%5D%20%3D%200x10%3B%20NVIC-%26gt%3BICER%5B5%5D%20%3D%200x40%3CBR%20%2F%3E%3CBR%20%2F%3E%20EDMA-%26gt%3BCSR%20%3D%200x300000%3CBR%20%2F%3E%3CBR%20%2F%3E%20EDMA%20%E5%92%8C%20NVIC%20%E4%B8%AD%E7%9A%84%E5%85%B6%E4%BB%96%E5%AF%84%E5%AD%98%E5%99%A8%E5%AD%97%E6%AE%B5%E4%B8%BA%E7%A9%BA%E3%80%82%3C%2FLINGO-BODY%3E