whycyhl
2022-05-05 683c912f9ac1935a7b109fb402bb276dba450f6b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/************************** 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++;
    }
}
//