发新帖我要提问
12
返回列表
打印

stm32的uart居然是单双工的

[复制链接]
楼主: skyhigh
手机看帖
扫描二维码
随时随地手机跟帖
21

打死我不信

那能卖吗? 自己的问题吧...

使用特权

评论回复
22
bhsdlmj| | 2009-5-18 17:16 | 只看该作者

17楼的skyhigh!

请注意使用 MDK的 clean target功能,如果你没用这个功能的话 !!!

使用特权

评论回复
23
浪淘沙| | 2009-5-18 17:24 | 只看该作者

既然是学习,就再深入地研究一下吧

请楼主找个示波器,分别监视STM32的RX和TX,看看TX的起始位与RX上的停止位之间的间隔有多大,这样你就可以清楚地看到我在9楼解释得对不对。

UART是异步通信,如果STM32的RX接收到的数据时钟比STM32的TX数据时钟快,你这样的程序,必然会发生你看到的结果。用示波器也可以看到接收和发送的数据字节是否长度一致,只要稍有不一致,就会发生我在9楼解释的问题。请注意,UART通信允许通信双方的数据时钟不一致,这时FIFO将起关键的作用。

使用特权

评论回复
24
skyhigh|  楼主 | 2009-5-18 17:43 | 只看该作者

波特率一样,应该没有接收数据时钟和TX数据时钟不一样的事

浪淘沙兄,你做实验了吗?
波特率一样,应该没有接收数据时钟和TX数据时钟不一样的事吧,我认为这应该不用示波器来验证。

另外,即使是这个问题,那一串数据时第一个字节总应该能转发对,是不是?

使用特权

评论回复
25
浪淘沙| | 2009-5-18 17:55 | 只看该作者

谁说波特率一样就应该数据时钟也一样?

如果说波特率一样就应该数据时钟也一样,那么UART协议何必搞那么复杂?


不好意思,对我来说,目前还不需要做实验来证明芯片的功能。

使用特权

评论回复
26
skyhigh|  楼主 | 2009-5-18 19:25 | 只看该作者

我知道你不需要做实验来证明芯片的功能

我知道你不需要做实验来证明芯片的功能 :)
那你帮忙看看为什么会发生这个问题好吧,你让我把程序贴上来我也贴了啊。

此外,按照你的解释,发送一串数据时,第一个字节总应该转发对吧?

看你的签名像是ST的技术支持人员,请针对我的疑问换位思考一下可以么?

谢谢!

使用特权

评论回复
27
浪淘沙| | 2009-5-18 22:24 | 只看该作者

我看了你的程序,除了我上面分析的问题外暂时没有看出其

既然你提到换位思考,我很赞同,能不能请你也替我考虑一下,帮我把你的波形捕捉一下,然后我来解释你的现象。注意只要能够看到2~3个回合即可。

根据我的判断,你的程序如果在第一个字节就错,可以有多种可能性:
1)两边时钟频率差的很远
2)中断响应延迟
3)发送缓冲区没有被清除


你还可以试试,不管上位机发送多少字节,STM32只转发回第一个字节,随后的丢弃,看看还错不错。

使用特权

评论回复
28
lut1lut| | 2009-5-20 11:56 | 只看该作者

STM32的USART肯定是可以支持全双工的

就像楼上某位朋友说的,“CPU设计出来是要让正常用起来,而不是任何方法都可以用的;”

下图就是一个收到从串口调试助手发下来的三个数据,然后立马又发送出去回显的波形。


可以清楚地看到,STM32的USART能够同时在Rx和Tx线上进行收和发的工作。并且回显正确。难道这不是全双工么。


使用特权

评论回复
29
kl818bc| | 2009-5-21 10:54 | 只看该作者

发送前未检查

借用9楼的

1    if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
2    {
3      // Read one byte from the receive data register 
4      temp = USART_ReceiveData(USART2);      
5      USART_SendData(USART2,temp);
6      while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);
7      {
8            ;
9      }
10    }

第5行有一个严重错误

就是未检查串口发送寄存器是否为空就发送数据

试着把6-9行改到第5行之前,把条件改成发送寄存器是否为空(TXE),就一定没问题了


>> 另外,即使是这个问题,那一串数据时第一个字节总应该能转发对,是不是?

第5行刚刚发送时,数据还没进入发送移位寄存器,TC的状态有可能还是置位,所以6-9行的检查无效

在你正在发送第一个字节时,收到第二个字节,没作 TXE 检查就发送第二个字节,肯定把第一个正在发送中的字节破坏了

使用特权

评论回复
30
王紫豪| | 2009-5-21 17:04 | 只看该作者

看题目,吓我一跳

使用特权

评论回复
31
dotagnu| | 2009-5-22 21:54 | 只看该作者

期待结果

使用特权

评论回复
32
skyhigh|  楼主 | 2009-5-27 09:59 | 只看该作者

综合实验,总结结论如下:

回27楼 浪淘沙:谢谢你的回复,前两天忙于别的事情,就没来得及看你的消息,抱歉!
回28楼 lut1lut:谢谢你做这个实验,弥补我的示波器不能拷屏的遗憾。
回29楼 kl818bc:你的分析是正确的,后来实验验证了,谢谢!
这一点请ST公司的 浪淘沙 注意一下,你可能考虑得过于复杂而非实际情况 :)

我的最终实验结论是这样的:
1. 程序确实需要如kl818bc所述,要做修改,虽然我是从ST的lib库里拷贝出来的,如最新的3.0.3lib里仍是这样写:
PUTCHAR_PROTOTYPE
{
A:
  /* Write a character to the USART */
  USART_SendData(USARTx, (uint8_t) ch);
B:
  /* Loop until the end of transmission */
  while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET)
  {
  }
C:
  return ch;
}
但事实证明还是有问题,但如果把B-C之间的代码放到A之前就没有问题,我反复做实验,证明了这一点;

2.英倍特公司的EM-STM3210E开发板的ST公司的ST3232C这颗芯片的延时太长。
我后来直接把TXD RXD这两根线直接从STM32芯片上焊出来,接到CP2102上,再做那个直接转发的实验,完全正确!然后再通过ST3232C变换的RS232信号给到台式机上,直接转发怎么都错误!直接用ST3232C变换的RS232信号,单纯发或者单纯收都没有问题,可见就是ST3232C延时长的原因了。

以上分析,请大家批评指正。
如果ST公司或英倍特公司认为 ST3232C 性能没有问题的话,那就请自己做实验或给出其它解释。

使用特权

评论回复
33
coslight| | 2009-5-27 11:06 | 只看该作者

确实,STM32的串口设计和其他用过的CPU有差别

中断方式必须发送完成后关闭发送中断使能这个就很与众不同啊,以前用过一些16位的CPU,没发现有类似的设计。但是如果按照他的例子发送和接收数据可以做到正确,估计楼主的查询方式不太适合STM32.

使用特权

评论回复
34
mcu_inside| | 2009-5-27 11:22 | 只看该作者

没这么复杂吧?

没问题的。我在STM32上,曾用查询的方式作过921600bps的通信,很可靠的!

使用特权

评论回复
35
香水城| | 2009-5-27 11:34 | 只看该作者

ST的板子上都是使用ST3232C,从来没有32楼说的问题

请楼主还是使用示波器看看再说吧,尤其是ST3232C延时长的问题。

你也可以查看ST3232C的数据手册,手册中有具体的延时参数。

使用特权

评论回复
36
mcu_inside| | 2009-5-27 11:56 | 只看该作者

试试这个,波特率自己定

U8 xBuffer[16];
U32 pHead = 0;
U32 pEnd = 0;


while(1)
{
  if(USART_GetITStatus(USART2, USART_FLAG_RXNE) != RESET)
  {
      xBuffer[pEnd++] = USART_ReceiveData(USART2); 
      pEnd &= 0x0f;     
  } 
  
  if((pHead != pEnd)&&(USART_GetFlagStatus(USART2, USART_FLAG_TXE) != RESET))
  {     
      USART_SendData(USART2, xBuffer[pHead++]); 
      pHead &= 0x0f;
  }
}

使用特权

评论回复
37
仙人球W| | 2014-10-20 17:11 | 只看该作者
看完了 ...

使用特权

评论回复
38
天一止水| | 2016-12-30 11:58 | 只看该作者
不知道你的问题是否得到了解决,我曾经遇到过类似的问题,你在收发双方通讯协议完全一致的情况下(波特率,起停位,校验位等),如果还是有问题,你可以换个调试助手试试

使用特权

评论回复
39
andy_bj4| | 2016-12-30 15:35 | 只看该作者
本帖最后由 andy_bj4 于 2016-12-30 15:36 编辑

前阵子做 DMA+USART也遇到类似问题,用了两个DMA通道分别做USART收/送, 但USART_DR却共用给TDR与RDR ,导致出错
解决的方式为 USART收采用DMA / USART发采用polling的方式

使用特权

评论回复
40
janeslee| | 2017-6-1 18:26 | 只看该作者
本帖最后由 janeslee 于 2017-6-2 12:42 编辑

我也发现确实有此问题,是3232转换芯片的问题,将3232的TTL端T/R短接作LOOP,232电平端接PC,此时PC发送数据按道理应该会收到一模一样的数据。问题来了: 1、如果串口电平在+/-10V时,接收数据会很大干扰,无论什么波特率都可能会收到误码,发出的232波形类似三角波, 2、用USB转RS232的线接此板子,232电平在+/-5V左右,此时收发正常,波形也正常  3、我使用了SIPEX的某一批芯片完全无此问题,但后来采购了一批此问题出现。山寨的所谓大芯片MAX3232在此LOOP模式时波形更加惨不忍睹,完全无法接收正确。图一: 测试板,上面有多个不同批次的3232

图二: 某批OK之SP3232EEN(能工作在230400之下任意波特率,再升就有误码,CH1为PC TXD,CH2为PC RXD,下同)



图三: 某批不OK之SP3232EEN(除双工问题外,能工作在512000之下任意波特率)

图四:国产之大芯片MAX3232CSE


6月2日补充测试:
今天再根据SP3232EEN手册做了一番测试,结果如下:
根据手册,SP3232的空载电流在0.3--1mA,实测正品SP3232为0.36mA,可疑品SP3232为4.05mA,输出扫幅为+/-5.4V,也就是2/6脚电压,实测正品为+/-5.5V,可疑品为+/-6.2V
首先从电流、扫幅基本就可分辨真假了。

可疑品双工工作的波形:

在接收数据时同时发送数据,可见发送的数据波形严重变形,一旦不接收则发送恢复正常。

正品和可疑品的5脚波形,黄色为可疑品,蓝色为正品。

测试了很多不同来源的山寨MAX3232CSE,SP3232EEN,发现一个共同点就是山寨品采用恒定频率开关电容实现正负压产生,如上图为265KHz方波,正品则是变频率的,估计是根据电压自动实现,所以真品都很省电,山寨电流往往比较大。

再叨叨下,国内汕头等地山寨的MAX3232质量相当不可靠,我买的一批2K多都贴上去了,结果全部电荷泵无**常工作,无正负压,电流达到20mA,只能一片片拆,这帮山寨厂希望早死

双工工作波形3.jpg (445.57 KB )

双工工作波形3.jpg

1脚波形.jpg (403.06 KB )

1脚波形.jpg

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则