在线时间4 小时
UID2017817
注册时间2015-7-27
NXP金币0
该用户从未签到
新手上路

- 积分
- 19
- 最后登录
- 2018-2-12
|
S32K144芯片,串口使用DMA发送,但是只会发送第一个字节。下面是代码。什么原因呢?
void Uart1Init(void)
{
PCC->PCCn[PCC_LPUART1_INDEX] &= ~PCC_PCCn_CGC_MASK; /* Ensure clk disabled for config */
PCC->PCCn[PCC_LPUART1_INDEX] |= PCC_PCCn_PCS(0x006) /* Clock Src= 1 (SOSCDIV2_CLK 8Mhz) Clock Src= 6 (SPLLDIV2_CLK)*/
| PCC_PCCn_CGC_MASK; /* Enable clock for LPUART1 regs */
//BAUD = CLK/(OSR+1)/SBR
//240000 = 36000000/150
LPUART1->BAUD = LPUART_BAUD_OSR(14)|LPUART_BAUD_SBR(10)|LPUART_BAUD_TDMAE(1); /* Initialize for 9600 baud, 1 stop: */
/* SBR=52 (0x34): baud divisor = 8M/9600/16 = ~52 */
/* OSR=15: Over sampling ratio = 15+1=16 */
/* SBNS=0: One stop bit */
/* BOTHEDGE=0: receiver samples only on rising edge */
/* M10=0: Rx and Tx use 7 to 9 bit data characters */
/* RESYNCDIS=0: Resync during rec'd data word supported */
/* LBKDIE, RXEDGIE=0: interrupts disable */
/* TDMAE, RDMAE, TDMAE=0: DMA requests disabled */
/* MAEN1, MAEN2, MATCFG=0: Match disabled */
LPUART1->CTRL=0x00000000|LPUART_CTRL_TE(1); /* Enable transmitter & receiver, no parity, 8 bit char: */
/* RE=1: Receiver enabled */
/* TE=1: Transmitter enabled */
/* PE,PT=0: No hw parity generation or checking */
/* M7,M,R8T9,R9T8=0: 8-bit data characters*/
/* DOZEEN=0: LPUART enabled in Doze mode */
/* ORIE,NEIE,FEIE,PEIE,TIE,TCIE,RIE,ILIE,MA1IE,MA2IE=0: no IRQ*/
/* TxDIR=0: TxD pin is input if in single-wire mode */
/* TXINV=0: TRansmit data not inverted */
/* RWU,WAKE=0: normal operation; rcvr not in statndby */
/* IDLCFG=0: one idle character */
/* ILT=0: Idle char bit count starts after start bit */
/* SBK=0: Normal transmitter operation - no break char */
/* LOOPS,RSRC=0: no loop back */
//LPUART1->WATER = LPUART_WATER_TXWATER(1);
}
void U1DMASend(uint8_t* pdata,uint32_t len)
{
//DMA->ERQ = DMA_ERQ_ERQ0(1);
/* TCD0: Transfers string to a single memory location */
DMA->TCD[0].SADDR = DMA_TCD_SADDR_SADDR(pdata); /* Src. */
DMA->TCD[0].SOFF = DMA_TCD_SOFF_SOFF(1); /* Src addr add 1 byte after transfer*/
DMA->TCD[0].ATTR = DMA_TCD_ATTR_SMOD(0) | /* Src modulo feature not used */
DMA_TCD_ATTR_SSIZE(0) | /* Src read 2**0 =1 byte per transfer*/
DMA_TCD_ATTR_DMOD(0) | /* Dest modulo feature not used */
DMA_TCD_ATTR_DSIZE(0); /* Dest write 2**0 =1 byte per trans.*/
DMA->TCD[0].NBYTES.MLNO = DMA_TCD_NBYTES_MLNO_NBYTES(len); /* Transfer 1 byte /minor loop*/
DMA->TCD[0].SLAST = DMA_TCD_SLAST_SLAST(-len); /* Src addr change after major loop*/
DMA->TCD[0].DADDR = DMA_TCD_DADDR_DADDR(&(LPUART1->DATA));/* Dest. *///
DMA->TCD[0].DOFF = DMA_TCD_DOFF_DOFF(0); /* No dest adr offset after transfer*/
DMA->TCD[0].CITER.ELINKNO= DMA_TCD_CITER_ELINKNO_CITER(len) | /* 11 minor loop iterations*/
DMA_TCD_CITER_ELINKNO_ELINK(0); /* No minor loop chan link */
DMA->TCD[0].DLASTSGA = DMA_TCD_DLASTSGA_DLASTSGA(0); /* No dest chg after major loop*/
DMA->TCD[0].CSR = DMA_TCD_CSR_START(0) | /* Clear START status flag */
DMA_TCD_CSR_INTMAJOR(0) | /* No IRQ after major loop */
DMA_TCD_CSR_INTHALF(0) | /* No IRQ after 1/2 major loop */
DMA_TCD_CSR_DREQ(1) | /* Disable chan after major loop*/
DMA_TCD_CSR_ESG(0) | /* Disable Scatter Gather */
DMA_TCD_CSR_MAJORELINK(0) | /* No major loop chan link */
DMA_TCD_CSR_ACTIVE(0) | /* Clear ACTIVE status flag */
DMA_TCD_CSR_DONE(0) | /* Clear DONE status flag */
DMA_TCD_CSR_MAJORLINKCH(0) | /* Chan # if major loop ch link */
DMA_TCD_CSR_BWC(0); /* No eDMA stalls after R/W */
DMA->TCD[0].BITER.ELINKNO= DMA_TCD_BITER_ELINKNO_BITER(len) | /* Initial iteration count*/
DMA_TCD_BITER_ELINKNO_ELINK(0); /* No minor loop chan link */
DMA->SSRT = 0;
}
最佳答案
楼主你好!
你可以参考下官方的DMA代码,在S32DS安装目录下有个关于SPI的DMA代码,你可以参考下官方例程的配置:
C:\nxp\S32DS_ARM_v2.0\S32DS\S32SDK_S32K14x_EAR_0.8.5\examples\S32K144\driver_examples\communic ...
|
|