打印

【求助】串口2硬件流控,RTS信号总是低电平。

[复制链接]
5153|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
今天在调RS485的通信,RE485接GPIOD4口。

用的是串口2的重映射接口。

所以配置串口2重映射,然后模式为USART_HardwareFlowControl_RTS
可是测试的时候,即使是循环发送数据,RTS管脚信号也总是低电平。
PC端通过转的USB口也收不到数据。
如果是不复用RTS信号,将GPIOD4当普通IO口设置高电平就可以正常收发数据。

手动置GPIOD4为高电平则可以发送数据:
#include "stm32f10x.h"

USART_InitTypeDef USART_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;

int main(void)
{
  SystemInit();
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO, ENABLE);
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
  
  GPIO_PinRemapConfig(GPIO_Remap_USART2,ENABLE);
  
  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOD, &GPIO_InitStructure);
  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOD, &GPIO_InitStructure);
  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOD, &GPIO_InitStructure);


  USART_InitStructure.USART_BaudRate =9600;
  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_RTS;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

  USART_Init(USART2, &USART_InitStructure);
  USART_Cmd(USART2, ENABLE);
  GPIO_SetBits(GPIOD, GPIO_Pin_4);
  while(1){
  USART_SendData(USART2, 0x41);
  while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET){ }
  USART_SendData(USART2, 0x42);
  while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET){ }
  }
}

如果使用USART_HardwareFlowControl_RTS,则检测不到RTS电平的变化。PC端也收不到数据。
#include "stm32f10x.h"

USART_InitTypeDef USART_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;

int main(void)
{
  SystemInit();
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO, ENABLE);
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
  
  GPIO_PinRemapConfig(GPIO_Remap_USART2,ENABLE);
  
  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_4;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOD, &GPIO_InitStructure);
/*  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOD, &GPIO_InitStructure);
*/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOD, &GPIO_InitStructure);


  USART_InitStructure.USART_BaudRate =9600;
  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_RTS;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

  USART_Init(USART2, &USART_InitStructure);
  USART_Cmd(USART2, ENABLE);
//  GPIO_SetBits(GPIOD, GPIO_Pin_4);
  while(1){
  USART_SendData(USART2, 0x41);
  while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET){ }
  USART_SendData(USART2, 0x42);
  while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET){ }
  }
}
硬件电路已经用万用表测试过N回,没有问题。




沙发
香水城| | 2013-7-22 13:54 | 只看该作者
对的,PD4作为一个普通GPIO控制485方向,没有问题。实际上ST官网上也有这样的应用手册:

AN3070 Managing the Driver Enable signal for RS-485 and IO-Link communications with the STM32's USART

当LZ最开始那USART的nRTS连接485方向控制时,由于nRTS是流控,表示“request to send”(请求接收),只是说明当前接收FIFO为空,可以继续容纳接收数据了。因此即使在一直发数据,nRTS信号也是低电平。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
lzp3520265 + 1 很给力!
板凳
lzp3520265|  楼主 | 2013-7-22 16:09 | 只看该作者
香水城 发表于 2013-7-22 13:54
对的,PD4作为一个普通GPIO控制485方向,没有问题。实际上ST官网上也有这样的应用手册:

AN3070 Managing  ...

"request to send"不是请求发送吗?库函数描述RTS是“发送使能”。

使用特权

评论回复
地板
airwill| | 2013-7-23 08:58 | 只看该作者
我实际测试过, "request to send"是请求发送, 功能是可以用的.
不过没有用那一堆库函数, 就是直接寄存器设置的.

使用特权

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

本版积分规则

8

主题

41

帖子

0

粉丝