这是RS485硬件流自动控制,只要你的控制器UART支持RTS功能,即可。
RTS0电平控制,牵扯到一个修改触发电平的问题!
需要设置UA_MCR这个寄存器的LEV_RTS高电平触发或默认为低电平触发,
转载:http://blog.csdn.net/zeroboundary/article/details/8966586
硬流控的RTS、CTS:
(现在做串口使用RTS/CTS必看内容)
RTS (Require ToSend,发送请求)为输出信号,用于指示本设备准备好可接收数据,低电平有效,低电平说明本设备可以接收数据。
CTS (Clear ToSend,发送允许)为输入信号,用于判断是否可以向对方发送数据,低电平有效,低电平说明本设备可以向对方发送数据。
没有串口控制器,用中断和普通IO口即可实现RTS与CTS功能。
RTS用GPIO实现,串口就绪拉低电平,串口忙拉高电平
CTS用中断实现,检测到低电平,将串口数据发送出去,检测到高电平则保留串口数据直到检测到低电平为止。
硬件流控制
硬件流控制常用的有RTS/CTS流控制和DTR/DSR(数据终端就绪/数据设置就绪)流控制。
硬件流控制必须将相应的电缆线连上,用RTS/CTS(请求发送/清除发送)流控制时,应将通讯两端的RTS、CTS线对应相连,数据终端设备(如计算机)使用RTS来起始调制解调器或其它数据通讯设备的数据流,而数据通讯设备(如调制解调器)则用CTS来起动和暂停来自计算机的数据流。这种硬件握手方式的过程为:我们在编程时根据接收端缓冲区大小设置一个高位标志(可为缓冲区大小的75%)和一个低位标志(可为缓冲区大小的25%),当缓冲区内数据量达到高位时,我们在接收端将CTS线置低电平(送逻辑0),当发送端的程序检测到CTS为低后,就停止发送数据,直到接收端缓冲区的数据量低于低位而将CTS置高电平。RTS则用来标明接收设备有没有准备好接收数据。
常用的流控制还有还有DTR/DSR(数据终端就绪/数据设置就绪)。我们在此不再详述。由于流控制的多样性,我个人认为,当软件里用了流控制时,应做详细的说明,如何接线,如何应用。
软件流控制
由于电缆线的限制,我们在普通的控制通讯中一般不用硬件流控制,而用软件流控制。一般通过XON/XOFF来实现软件流控制。常用方法是:当接收端的输入缓冲区内数据量超过设定的高位时,就向数据发送端发出XOFF字符(十进制的19或Control-S,设备编程说明书应该有详细阐述),发送端收到XOFF字符后就立即停止发送数据;当接收端的输入缓冲区内数据量低于设定的低位时,就向数据发送端发出XON字符(十进制的17或Control-Q),发送端收到XON字符后就立即开始发送数据。一般可以从设备配套源程序中找到发送的是什么字符。
应该注意,若传输的是二进制数据,标志字符也有可能在数据流中出现而引起误操作,这是软件流控制的缺陷,而硬件流控制不会有这个问题。
源码如下:(完全可以使用)
/*UART0_Init*/
void UART0_Init()
{
/* Set P3 multi-function pins for UART0 RXD and TXD */
SYS->P3_MFP &= ~(SYS_MFP_P30_Msk | SYS_MFP_P31_Msk);
SYS->P3_MFP |= (SYS_MFP_P30_RXD0 | SYS_MFP_P31_TXD0);
/* Enable UART module clock */
CLK->APBCLK |= (CLK_APBCLK_UART0_EN_Msk | CLK_APBCLK_UART0_EN_Msk);
/* Select UART module clock source */
CLK->CLKSEL1 &= ~CLK_CLKSEL1_UART_S_Msk;
CLK->CLKSEL1 |= CLK_CLKSEL1_UART_S_HXT;
/* Reset UART IP */
SYS->IPRSTC2 |= SYS_IPRSTC2_UART0_RST_Msk;
SYS->IPRSTC2 &= ~SYS_IPRSTC2_UART0_RST_Msk;
UART0->FCR |= UART_FCR_RFR_Msk; /* RX FIFO RESET*/
UART0->FCR |= UART_FCR_TFR_Msk; /* TX FIFO RESET*/
/* Configure UART0 and set UART0 Baudrate */
UART0->BAUD = UART_BAUD_MODE2 | UART_BAUD_MODE2_DIVIDER(__HXT, 115200);
UART0->LCR = UART_WORD_LEN_8 | UART_PARITY_NONE | UART_STOP_BIT_1;
}
void RS485_MODE_Init()
{
/* Set P0 multi-function pins for UART0 RTS */
SYS->P0_MFP &= ~(SYS_MFP_P03_Msk );
SYS->P0_MFP |= (SYS_MFP_P03_RTS0 );
/* Select UART RS485 function mode */
UART0->FUN_SEL = UART_FUNC_SEL_RS485;
/* Set RX_DIS enable before set RS485-NMM mode */
UART0->FCR &= ~ UART_FCR_RX_DIS_Msk; /* Enable RS485 RX */
//UART0->FCR |= UART_FCR_RX_DIS_Msk; /* Disable RS485 RX */
/* Set RS485-NMM Mode */
UART1->ALT_CSR = UART_ALT_CSR_RS485_NMM_Msk;
/* Set RS485-Master as AUD mode */
/* Enable AUD mode to HW control RTS pin automatically */
/* You also can use GPIO to control RTS pin for replacing AUD mode*/
UART0->ALT_CSR = UART_ALT_CSR_RS485_AUD_Msk;
/* Set Data Format, Only need parity enable whenever parity ODD/EVEN */
UART0->LCR = (UART_WORD_LEN_8 | UART_PARITY_NONE | UART_STOP_BIT_1);
UART0->LCR &= (~UART_PARITY_MARK);
/* Set RTS pin active level as low level active --*/
UART0->MCR = UART0->MCR & (~UART_MCR_LEV_RTS_Msk) | UART_RTS_IS_LOW_LEV_ACTIVE;
//UART0->MCR = UART0->MCR & (~UART_MCR_LEV_RTS_Msk) | UART_RTS_IS_HIGH_LEV_ACTIVE;
/* Flush Rx FIFO */
UART0->FCR |= UART_FCR_RFR_Msk; /* Clear data from RX FIFO */
/* Set RTS Trigger Level as 1 bytes INT*/
UART0->FCR = UART0->FCR & (~UART_FCR_RTS_TRI_LEV_Msk) | UART_FCR_RTS_TRI_LEV_1BYTE;
/* Set RX Trigger Level as 1 bytes INT*/
UART0->FCR = UART0->FCR & (~UART_FCR_RFITL_Msk) | UART_FCR_RFITL_1BYTE;
/* Enable CTS autoflow control */
// UART0->IER |= UART_IER_AUTO_CTS_EN_Msk;
/* Enable RTS autoflow control */
UART0->IER |= UART_IER_AUTO_RTS_EN_Msk;
/* Enable RDA\RLS\Time-out Interrupt */
UART0->IER |= UART_IER_RDA_IEN_Msk | UART_IER_RLS_IEN_Msk ;//| UART_IER_RTO_IEN_Msk;
/* Enable UART0 IRQ */
NVIC_EnableIRQ(UART0_IRQn);
}
485是半双工模式,RS232全双工模式,支持同时接收发送,而485是单工。流控制都可以即硬件流控,也可软件流控。422是485的升级。
全双工:同一时刻既可发又可收。
半双工:同一时刻不可能既发又收,收发是时分的。
全双工要求:收与发各有单独的信道。可用于实现两个站之间通讯及
星型网,环网。不可用于总线网。
半双工要求:收发可共用同一信道,可用于各种拓扑结构的局域 网络
最常用于总线网。
半双工数据速率理论上是全双工的一半。
2,搞清RS422 与RS485:
RS422 至少分别有一个差分发送口和差分接收口。两节点通讯时,一方的发送口与另一方的接收口相连。
需两对线。
RS422 不能直接用于三电以上的直接互连,当然不能直接用总线连接。
RS485 的差分发送口与自身的差分接收口同相并连,多点间通过 RS485 只需一对线。
RS422 的发送口如与其接收口同相并连,就变成RS485。
3,又于RS422 可接成RS485,所以它们的电气参数必然完全相同。
4,需要说一下,很多人经常把RS232,RS422,RS485 误称为通讯或网络协议,这是很不应该的,其实它
们仅是关于通讯的一个机械和电气接口标准(顶多是网络协议中的物理层面)。