#include "..\..\App\include.h"
static uint16 u16BaudSet;
static void rs485_io_init(void);
static void rs485_config(uint16 u16Baud);
static void rs485_send_char(uint8 u8Char);
static bool rs485_send_string(uint8 *u8Buff,uint8 u8Length);
static uint16 rs485_crc_check_val(uint8 *u8Buff,uint8 u8Length);
static uint8 rs485_add1_check_val(uint8 *u8Buff);
void rs485_init(void)
{
rs485_io_init();
rs485_config(9600);
}
static void rs485_io_init(void)
{
DDRD|=0x1E;
PORTD&=0xE0;
DDRD&=~BIT(PD2);
}
static void rs485_config(uint16 u16Baud)
{
UCSR1A=0X00;
UCSR1B=0X00;
UCSR1B=(1<<RXCIE1)|(1<<RXEN1)|(1<<TXEN1);
UCSR1C=(1<<UCSZ11)|(1<<UCSZ10);
u16BaudSet=fclk/16/u16Baud-1;
UBRR1L=u16BaudSet;
UBRR1H=u16BaudSet>>8;
}
static void rs485_send_char(uint8 u8Char)
{
RS485_WR;
delay_ms(1);
while(!(UCSR1A|(1<<UDRE1)));
UDR1=u8Char;
while(!(UCSR1A|(1<<TXC1)));
UCSR1A|=BIT(TXC1);
delay_ms(1);
RS485_RE;
}
static bool rs485_send_string(uint8 *u8Buff,uint8 u8Length)
{
uint8 cnt;
if(u8Buff == null)
{
return false;
}
for(cnt=0;cnt<u8Length;cnt++)
{
rs485_send_char(*(u8Buff+cnt));
}
return true;
}
static uint16 rs485_crc_check_val(uint8 *u8Buff,uint8 u8Length)
{
uint16 crc_value=0XFFFF;
uint16 i;
while(u8Length--)
{
crc_value^=*u8Buff++;
for(i=0;i<8;i++)
{
if(crc_value & 0x0001)
{
crc_value>>=1;
crc_value^=0xA001;
}
else
{
crc_value>>=1;
}
}
}
return crc_value;
}
static uint8 rs485_add1_check_val(uint8 *u8Buff)
{
uint8 u8CheckNum=0;
while(*u8Buff!=null)
{
u8CheckNum+=*u8Buff;
u8Buff++;
}
u8CheckNum=~u8CheckNum+1;
return u8CheckNum;
}
void rs485_led_flash(void)
{
RS485_LED_ON;
delay_ms(50);
RS485_LED_OFF;
delay_ms(50);
}