uart驱动问题

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

uart驱动问题

2,978 Views
colinluan
Contributor III

Hi, @jeremyzhou 

我在调试Uart,使用IDLE+eDMA的方式进行不定长接收,在官方的edma lpuart例程中可以正常调试通过,但是把驱动放到我自己的C++工程里面就出现了问题。我做自发自收的实验时可以正常发出来,字节数也对,但是收到的数据有一部分是乱码;然后我自己重新新建了一个C工程,在sdk中选中的对应的选项,并且配置了lpuart2,然后把调试好的驱动放进去,结果仍然是如此。现在感觉一点眉目都没有,在这个问题上卡了两天,代码感觉没问题,就是感觉是哪边配置出了问题,又找不出来,你这边有基于C++的UART+DMA的工程吗?

0 Kudos
8 Replies

2,969 Views
colinluan
Contributor III

已经解决了,DMA的缓冲区貌似要定义成NONCACHEABLE,否则数据会很不正常,感觉被刷掉了一样。

AT_NONCACHEABLE_SECTION_INIT(uint8_t dmaTxBuffer[COM_NUM][RTOS_LPUART_TX_DMA_BUFFER]) = {0};
AT_NONCACHEABLE_SECTION_INIT(uint8_t dmaRxBuffer[COM_NUM][RTOS_LPUART_RX_DMA_BUFFER]) = {0};

2,967 Views
jeremyzhou
NXP Employee
NXP Employee

Hi,
非常感谢使用NXP产品,很高兴为你提供技术支持!
好的,有问题再交流。
Have a great day,
TIC

 

-------------------------------------------------------------------------------
Note:
- If this post answers your question, please click the "Mark Correct" button. Thank you!

 

- We are following threads for 7 weeks after the last post, later replies are ignored
Please open a new thread and refer to the closed one, if you have a related question at a later point in time.
-------------------------------------------------------------------------------

0 Kudos

2,944 Views
colinluan
Contributor III

Hi, @jeremyzhou 

我把DMA的buffer定义成NonCacheable之后,发现接收数据仍然会不时的抽风,然后我看了别的例程,发现NonCacheable数据都是定义在SRAM_DTC中的,我尝试着改成了同样的设置,发现接收数据就正常了。NonCacheable数据一定要指定放在这里吗?这是一套什么机制呢?

1.png

0 Kudos

2,930 Views
jeremyzhou
NXP Employee
NXP Employee

Hi,
感谢回复。
1) NonCacheable数据一定要指定放在这里吗?这是一套什么机制呢?
-- 当然不一定,恰恰相反,很多时候不指定放在TCM存储器内,因为“DTCM/ITCM is Tightly-Coupled Memories, the core can access it directly (cache is not involved).”
简而言之,cache对于TCM存储器的访问没有影响,我建议你可以浏览一下这篇应用手册:AN12042 Using the i.MXRT L1 Cache,里面有详细介绍cache的特征以及在应用中需要的注意点。
Have a great day,
TIC

 

-------------------------------------------------------------------------------
Note:
- If this post answers your question, please click the "Mark Correct" button. Thank you!

 

- We are following threads for 7 weeks after the last post, later replies are ignored
Please open a new thread and refer to the closed one, if you have a related question at a later point in time.
-------------------------------------------------------------------------------

0 Kudos

2,909 Views
colinluan
Contributor III

Hi, @jeremyzhou

非常感谢提供的文档,我大概看了下,然后说一下我的理解:

1、定义了NonCacheable的Buffer之后,还需要把修改Link,把NonCacheable指定到对应的区域,并且在MPU中配置这段区域为shareable或者non-cacheable,使其不可cache。我之前只是把Buffer定义成了NonCacheable,而缺少了后面两个步骤,所以导致一直在踩坑。

2、之所以把DMA的Buffer放入SRAM_DTC中就可以正常接收,对于TCM来说,L1 cache是bypass的,所以不存在cache的问题,自然不会出现数据错乱的问题。

 

 

2,922 Views
colinluan
Contributor III

好的,我先看一下。

那就比较奇怪了,看样子我还没有解决根本问题?我的现象是通过DMA接收到的数据第一笔是正确的,但是后面就不正常了,不管怎么改,一直都是接收的第一笔的数据,过了很久都刷新不过来。但是按上图的做法之后就可以正常接收了。

1.png

2.png

上面第一张是我定义的DMA buffer,第二张时接收函数,这段代码在另外一个工程里可以完美的执行,但是到了我的工程里就出现以上描述的现象,直到我改完了Nocacheable到SRAM_DTC.

0 Kudos

2,973 Views
colinluan
Contributor III
可以接收到正常的字节数,比如我从PC发200个字节,可以进入IDLE或者DMA中断,并且显示接收到了200个字节的数据,但是数据全都是错的,很多时候全为0。但是一模一样的驱动,在另一个工程里就能正常运行,我检查了下代码,引脚也配置了,别的地方好像也没有配置DMA中断,感觉奇怪了。
0 Kudos

2,973 Views
colinluan
Contributor III

可以接收到正常的字节数,比如我从PC发200个字节,可以进入IDLE或者DMA中断,并且显示接收到了200个字节的数据,但是数据全都是错的,很多时候全为0。但是一模一样的驱动,在另一个工程里就能正常运行,我检查了下代码,引脚也配置了,别的地方好像也没有配置DMA中断,感觉奇怪了。

0 Kudos