野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 17239|回复: 10

串口半双工通信

[复制链接]
发表于 2016-7-29 15:12:10 | 显示全部楼层 |阅读模式
找了一下,没有具体的关于串口半双工通信的帖子,我自己捣鼓了一天,发一下,帮我看看。

我用的是野火IOS-mini开发板(用了快三年了吧,屏都碎了)
首先,改一下初始化函数

直接改火哥的例程,把RX口去掉,反正也用不到,然后根据datasheet作一下寄存器配置,把USART_CR2寄存器的LINEN和CLKEN位和USART_CR3寄存器的SCEN和IREN位置零。
void USART1_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  USART_InitTypeDef USART_InitStructure;
  
  /* config USART1 clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
  
  /* USART1 GPIO config */
  /* Configure USART1 Tx (PA.09) as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

//  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
//  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
//  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//  GPIO_Init(GPIOA, &GPIO_InitStructure);


  USART1->CR3 &= CR3_SCEN_Reset;
  USART1->CR3 &= CR3_IREN_Reset;
  USART1->CR2 &= CR2_LINEN_Reset;
  USART1->CR2 &= CR2_CLKEN_Reset;

  USART_HalfDuplexCmd( USART1, ENABLE);

   
  /* USART1 mode config */
  USART_InitStructure.USART_BaudRate = 115200;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No ;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  USART_Init(USART1, &USART_InitStructure);
  USART_Cmd(USART1, ENABLE);
}

单线半双方模式通过设置USART_CR3寄存器的HDSEL位选择。在这个模式里,下面的位必须保持清零状态:
● USART_CR2寄存器的LINEN和CLKEN位
● USART_CR3寄存器的SCEN和IREN位
USART可以配置成遵循单线半双工协议。在单线半双工模式下,TX和RX引脚在芯片内部互连。使用控制位”HALF DUPLEX SEL”(USART_CR3中的HDSEL位)选择半双工和全双工通信。
当HDSEL为’1’时
● RX不再被使用
● 当没有数据传输时,TX总是被释放。因此,它在空闲状态的或接收状态时表现为一个标准I/O口。这就意味该I/O在不被USART驱动时,必须配置成悬空输入(或开漏的输出高)。
除此以外,通信与正常USART模式类似。由软件来管理线上的冲突(例如通过使用一个中央仲裁器)。特别的是,发送从不会被硬件所阻碍。当TE位被设置时,只要数据一写到数据寄存器上,发送就继续。

这个“冲突管理”特别重要,我卡了蛮久的,一直32只能发数据不能接数据,看一下主函数:
int main(void)
{
  /* USART1 config 115200 8-N-1 */
  USART1_Config();
  printf("\r\n 半双工实验 \r\n");
  while(1)
  {


  USART1->CR1 |= 0x0004;   //必须使能RE位,串口才能接收数据
  scanf("%c",&ch);
   
  USART1->CR1 &=~ 0x0004; //必须清零RE位,串口才能发送数据


  if(ch=='1')
      printf("\r\n 1 \r\n");
  else
      printf(" \r\n 0 \r\n");

  printf("%c \n",ch);
  printf("over ");
  
  }
  
}

我用的是接收使能位来管理冲突,据说还能用TE位,我没有试过。这样就OK啦,可以用32的串口半双工通信了,不过TTL转USB那里还有个问题,USB是全双工的,把PA9和PA10 短接就行了,就可以在电脑上看到了。

另外还有个问题,这里用scanf()函数获取数据的话需要发两个数程序才能继续运行,这个我不太懂,有知道的告诉我下。

(第一次发帖子,有神马错误一定要告诉我啊!!)
回复

使用道具 举报

发表于 2016-7-29 17:56:11 | 显示全部楼层
串口半双工?STM32的串口有这种模式啊?我都还没用过
回复 支持 反对

使用道具 举报

发表于 2016-7-29 18:01:05 | 显示全部楼层
是不是这样就可以用一根线通讯了?我还以为楼主是说485
回复 支持 反对

使用道具 举报

发表于 2016-7-30 21:23:51 来自手机 | 显示全部楼层
flyleaf 发表于 2016-7-29 17:56
串口半双工?STM32的串口有这种模式啊?我都还没用过

即使有也很少人会这样用。
回复 支持 反对

使用道具 举报

发表于 2016-7-31 10:00:21 来自手机 | 显示全部楼层
这样用很不方便吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-1 08:39:59 | 显示全部楼层

这要看做什么用了,有的产品就是要求线越少越好,也许还能再把程序缩减吧。。
回复 支持 反对

使用道具 举报

发表于 2016-8-1 08:54:28 | 显示全部楼层
国丫先森 发表于 2016-8-1 08:39
这要看做什么用了,有的产品就是要求线越少越好,也许还能再把程序缩减吧。。

有道理                                
回复 支持 反对

使用道具 举报

发表于 2016-8-1 15:28:46 | 显示全部楼层
国丫先森 发表于 2016-8-1 08:39
这要看做什么用了,有的产品就是要求线越少越好,也许还能再把程序缩减吧。。

是的,产品就得考虑性价比
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-1 16:05:46 | 显示全部楼层
fire 发表于 2016-7-30 21:23
即使有也很少人会这样用。

那,火哥,还有什么比较方便的半双工通信么,我不晓得哎。目前,用得最熟的就是串口了,看到它有半双工就用了,而且还可以用调试助手在电脑上看结果,我觉得蛮方便的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-4 08:56:00 | 显示全部楼层
不想再另开帖子了,继续在这里说一下最近发现的串口通信中比较冷门的东西:

关于串口通信奇偶校验位的问题,一般情况下,串口通信的数据格式是:开始位+数据位+校验位+停止位。

stm32则不是这样,它会把校验位补充在数据位里面。

因为stm32中串口通信的校验位是补充在数据位中的最高位的,也就是说如果想要传输8b的数据,就要求在软件中设置串口通信数据位为9b,留出一位给校验位。否则你就会发现数据的最高位并不是你希望它发出的那样。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-4 16:43:08 | 显示全部楼层
粘个图说明一下
QQ图片20160804164343.png
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-9-23 01:34 , Processed in 0.054463 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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