/********************************************************************
RS485.C
**********************************************************************/
#include "RS485.h"
#include "usart.h"
#include "delay.h"
void RS485_IO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); //使能PD时钟,PD14,PD15收发模式控制
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14; //PD14
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure); //初始化PD14 RE2
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; //PD15
GPIO_Init(GPIOD, &GPIO_InitStructure); //初始化PD15 DE2
}
void RS485_Send_Data(u8 *buf,u8 len)
{
u8 t;
RS485_TX_EN=1;
RS485_RX_EN=1; //发送使能,禁止接收
for(t=0;t<len;t++) //循环发送数据
{
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=1); //等待发送完
USART_SendData(USART2,buf[t]);
}
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=1); //等待发送完
USART_RX_CNT=0;
RS485_TX_EN=0;
RS485_RX_EN=0; //设置为接收
}
void RS485_Receive_Data(u8 *buf)
{
u8 rxlen=USART_RX_CNT;
u8 i=0;
delay_ms(10); //等待10ms
if (rxlen==USART_RX_CNT&&rxlen) //接收到数据,且接收完成了
{
for(i=0;i<rxlen;i++)
{
buf[i]=USART_RX_BUF[i];
}
USART_RX_CNT=0; //清零
}
}
|