请选择 进入手机版 | 继续访问电脑版
查看: 828|回复: 2

[求助] [求助] S32K144 串口DMA传输

[复制链接]

该用户从未签到

1

主题

1

帖子

0

金豆

新手上路

Rank: 1

积分
19
最后登录
2018-2-12
发表于 2018-2-12 15:50:20 | 显示全部楼层 |阅读模式
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;               
}

我知道答案 目前已有2人回答
回复

使用道具 举报

该用户从未签到

175

主题

3575

帖子

0

金豆

超级版主

Rank: 8Rank: 8

积分
4973
最后登录
2018-10-15
发表于 2018-2-13 10:04:56 | 显示全部楼层
楼主你好!
你可以参考下官方的DMA代码,在S32DS安装目录下有个关于SPI的DMA代码,你可以参考下官方例程的配置:
C:\nxp\S32DS_ARM_v2.0\S32DS\S32SDK_S32K14x_EAR_0.8.5\examples\S32K144\driver_examples\communication\lpspi_dma
回复 支持 反对

使用道具 举报

该用户从未签到

2

主题

12

帖子

0

金豆

注册会员

Rank: 2

积分
105
最后登录
2018-6-29
发表于 2018-2-22 14:57:56 | 显示全部楼层
新建一个lpuart1的空白例程,用Process Expert 配置串口通讯参数,设置为DMA传输,将例程中的用户代码复制到工程中,测试OK,lpuart1设置为中断传输也是OK的。手写代码没有试过。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|恩智浦技术社区   

GMT+8, 2018-10-15 22:39 , Processed in 0.096899 second(s), 10 queries , MemCache On.

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表