/************************** Copyright (c) **********************************
|
** FUZHOU FUGUANG ELECTRONICS Co.,LTD.
|
** ¸£Öݸ£¹âµç×ÓÓÐÏÞ¹«Ë¾
|
** http://www.fuguang.com
|
**
|
**-------------- File Info -------------------------------------------------
|
** File name: M64USART_Driver.c
|
** Last modified Date: 2008-11-16
|
** Last Version: 1.0
|
** Descriptions: M64USART Drivers lib
|
**
|
**--------------------------------------------------------------------------
|
** Created by: mxpopstar
|
** Created date: 2008-11-16
|
** Version: 1.0
|
** Descriptions: The original version
|
**
|
**--------------------------------------------------------------------------
|
** Modified by: mxpopstar
|
** Modified date: 2008-11-20
|
** Version:
|
** Descriptions: M64USART Drivers lib
|
**
|
***************************************************************************/
|
//
|
|
#include "M64USART_Driver.h"
|
#include <avr/wdt.h>
|
|
|
void InitIO_M64USART0(void)
|
{
|
DDRE &= (~0x01); //RXD0¶ËÅäÖÃΪÊäÈë
|
DDRE |= 0x02; //TXD0¶ËÅäÖÃΪÊä³ö
|
}
|
//
|
|
|
void Config_M64USART0(const unsigned int baud)
|
{
|
UCSR0B = 0;
|
_delay_us(10);
|
|
if(baud == 96)
|
{
|
UBRR0H = 0;
|
UBRR0L = 47; //7.3728M¾§Õñ,9600 ²¨ÌØÂÊ
|
}
|
else if(baud == 192)
|
{
|
UBRR0H = 0;
|
UBRR0L = 23; //7.3728M¾§Õñ,19200 ²¨ÌØÂÊ
|
}
|
|
UCSR0B = (1<<RXEN0)|(1<<TXEN0);//USAR1½ÓÊÕÆ÷Óë·¢ËÍÆ÷ʹÄÜ
|
|
_delay_ms(10);
|
}
|
//
|
|
void ClearUSART0RXBuffer(void)
|
{
|
unsigned char res = 0;
|
res = UDR0;
|
res = UDR0;//Çå¿ÕUDR0µÄÄÚÈÝ
|
}
|
//
|
|
void SendByte_M64USART0(const unsigned char data)
|
{
|
/* µÈ´ý·¢ËÍ»º³åÆ÷Ϊ¿Õ */
|
wdt_reset(); //ι¹·
|
while ( !( UCSR0A & (1<<UDRE0)) )
|
;
|
/* ½«Êý¾Ý·ÅÈ뻺³åÆ÷£¬·¢ËÍÊý¾Ý*/
|
UDR0 = data;
|
}
|
//
|
|
unsigned char ReceiveByte_M64USART0(void)
|
{
|
unsigned long count = 0;
|
/* µÈ´ý½ÓÊÕÊý¾Ý*/
|
while ( !(UCSR0A & (1<<RXC0)) )
|
{
|
count++;
|
wdt_reset(); //ι¹·
|
if(count>500000)
|
{
|
count = 0;
|
return 0xFF;
|
}
|
}
|
return UDR0; /* ´Ó»º³åÆ÷ÖлñÈ¡²¢·µ»ØÊý¾Ý*/
|
}
|
//
|
unsigned char ReceiveStr_M64USART0(void *buf, const unsigned char len)
|
{
|
unsigned char *pbuf = (unsigned char *)buf;
|
unsigned char count = len;
|
unsigned char Rxdata = 0;
|
while(count--)
|
{
|
Rxdata = ReceiveByte_M64USART0();
|
if(Rxdata == 0xFF)
|
{
|
return 0;
|
}
|
else
|
{
|
*pbuf++ = Rxdata;
|
}
|
}
|
|
return len;
|
}
|
//
|
|
void SendSTR_M64USART0(volatile const void *data, const unsigned int count)
|
{
|
unsigned char *pdata = (unsigned char*)data;
|
unsigned int datalen = count;
|
wdt_reset(); //ι¹·
|
while(datalen--)
|
{
|
/* µÈ´ý·¢ËÍ»º³åÆ÷Ϊ¿Õ */
|
while ( !( UCSR0A & (1<<UDRE0)) )
|
;
|
/* ½«Êý¾Ý·ÅÈ뻺³åÆ÷£¬·¢ËÍÊý¾Ý*/
|
UDR0 = *pdata++;
|
}
|
}
|
//
|