1 |
hedin |
15 |
/*********************************************************************
|
2 |
|
|
*
|
3 |
|
|
* UART access routines for C18 and C30
|
4 |
|
|
*
|
5 |
|
|
*********************************************************************
|
6 |
|
|
* FileName: UART.c
|
7 |
|
|
* Dependencies: UART.h
|
8 |
|
|
* Processor: PIC18, PIC24F/H, dsPIC30F, dsPIC33F
|
9 |
|
|
* Complier: Microchip C18 v3.03 or higher
|
10 |
|
|
* Complier: Microchip C30 v2.01 or higher
|
11 |
|
|
* Company: Microchip Technology, Inc.
|
12 |
|
|
*
|
13 |
|
|
* Software License Agreement
|
14 |
|
|
*
|
15 |
|
|
* Copyright © 2002-2007 Microchip Technology Inc. All rights
|
16 |
|
|
* reserved.
|
17 |
|
|
*
|
18 |
|
|
* Microchip licenses to you the right to use, modify, copy, and
|
19 |
|
|
* distribute:
|
20 |
|
|
* (i) the Software when embedded on a Microchip microcontroller or
|
21 |
|
|
* digital signal controller product (“Device”) which is
|
22 |
|
|
* integrated into Licensee’s product; or
|
23 |
|
|
* (ii) ONLY the Software driver source files ENC28J60.c and
|
24 |
|
|
* ENC28J60.h ported to a non-Microchip device used in
|
25 |
|
|
* conjunction with a Microchip ethernet controller for the
|
26 |
|
|
* sole purpose of interfacing with the ethernet controller.
|
27 |
|
|
*
|
28 |
|
|
* You should refer to the license agreement accompanying this
|
29 |
|
|
* Software for additional information regarding your rights and
|
30 |
|
|
* obligations.
|
31 |
|
|
*
|
32 |
|
|
* THE SOFTWARE AND DOCUMENTATION ARE PROVIDED “AS IS” WITHOUT
|
33 |
|
|
* WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT
|
34 |
|
|
* LIMITATION, ANY WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
35 |
|
|
* PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL
|
36 |
|
|
* MICROCHIP BE LIABLE FOR ANY INCIDENTAL, SPECIAL, INDIRECT OR
|
37 |
|
|
* CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF
|
38 |
|
|
* PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY OR SERVICES, ANY CLAIMS
|
39 |
|
|
* BY THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE
|
40 |
|
|
* THEREOF), ANY CLAIMS FOR INDEMNITY OR CONTRIBUTION, OR OTHER
|
41 |
|
|
* SIMILAR COSTS, WHETHER ASSERTED ON THE BASIS OF CONTRACT, TORT
|
42 |
|
|
* (INCLUDING NEGLIGENCE), BREACH OF WARRANTY, OR OTHERWISE.
|
43 |
|
|
*
|
44 |
|
|
*
|
45 |
|
|
* Author Date Comment
|
46 |
|
|
*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
47 |
|
|
* Howard Schlunder 4/04/06 Copied from dsPIC30 libraries
|
48 |
|
|
* Howard Schlunder 6/16/06 Added PIC18
|
49 |
|
|
********************************************************************/
|
50 |
|
|
#define __UART_C
|
51 |
|
|
|
52 |
|
|
#include "TCPIP Stack/TCPIP.h"
|
53 |
|
|
|
54 |
|
|
#if defined(STACK_USE_UART)
|
55 |
|
|
|
56 |
|
|
BYTE ReadStringUART(BYTE *Dest, BYTE BufferLen)
|
57 |
|
|
{
|
58 |
|
|
BYTE c;
|
59 |
|
|
BYTE count = 0;
|
60 |
|
|
|
61 |
|
|
while(BufferLen--)
|
62 |
|
|
{
|
63 |
|
|
*Dest = '\0';
|
64 |
|
|
|
65 |
|
|
while(!DataRdyUART());
|
66 |
|
|
c = ReadUART();
|
67 |
|
|
|
68 |
|
|
if(c == '\r' || c == '\n')
|
69 |
|
|
break;
|
70 |
|
|
|
71 |
|
|
count++;
|
72 |
|
|
*Dest++ = c;
|
73 |
|
|
}
|
74 |
|
|
|
75 |
|
|
return count;
|
76 |
|
|
}
|
77 |
|
|
|
78 |
|
|
|
79 |
|
|
#if defined(__dsPIC33F__) || defined(__dsPIC30F__) || defined(__PIC24H__) || defined(__PIC24F__)
|
80 |
|
|
|
81 |
|
|
|
82 |
|
|
/***************************************************************************
|
83 |
|
|
* Function Name : putsUART2 *
|
84 |
|
|
* Description : This function puts the data string to be transmitted *
|
85 |
|
|
* into the transmit buffer (till NULL character) *
|
86 |
|
|
* Parameters : unsigned int * address of the string buffer to be *
|
87 |
|
|
* transmitted *
|
88 |
|
|
* Return Value : None *
|
89 |
|
|
***************************************************************************/
|
90 |
|
|
|
91 |
|
|
void putsUART2(unsigned int *buffer)
|
92 |
|
|
{
|
93 |
|
|
char * temp_ptr = (char *) buffer;
|
94 |
|
|
|
95 |
|
|
/* transmit till NULL character is encountered */
|
96 |
|
|
|
97 |
|
|
if(U2MODEbits.PDSEL == 3) /* check if TX is 8bits or 9bits */
|
98 |
|
|
{
|
99 |
|
|
while(*buffer != '\0')
|
100 |
|
|
{
|
101 |
|
|
while(U2STAbits.UTXBF); /* wait if the buffer is full */
|
102 |
|
|
U2TXREG = *buffer++; /* transfer data word to TX reg */
|
103 |
|
|
}
|
104 |
|
|
}
|
105 |
|
|
else
|
106 |
|
|
{
|
107 |
|
|
while(*temp_ptr != '\0')
|
108 |
|
|
{
|
109 |
|
|
while(U2STAbits.UTXBF); /* wait if the buffer is full */
|
110 |
|
|
U2TXREG = *temp_ptr++; /* transfer data byte to TX reg */
|
111 |
|
|
}
|
112 |
|
|
}
|
113 |
|
|
}
|
114 |
|
|
|
115 |
|
|
|
116 |
|
|
/******************************************************************************
|
117 |
|
|
* Function Name : getsUART2 *
|
118 |
|
|
* Description : This function gets a string of data of specified length *
|
119 |
|
|
* if available in the UxRXREG buffer into the buffer *
|
120 |
|
|
* specified. *
|
121 |
|
|
* Parameters : unsigned int length the length expected *
|
122 |
|
|
* unsigned int *buffer the received data to be *
|
123 |
|
|
* recorded to this array *
|
124 |
|
|
* unsigned int uart_data_wait timeout value *
|
125 |
|
|
* Return Value : unsigned int number of data bytes yet to be received *
|
126 |
|
|
******************************************************************************/
|
127 |
|
|
|
128 |
|
|
unsigned int getsUART2(unsigned int length,unsigned int *buffer,
|
129 |
|
|
unsigned int uart_data_wait)
|
130 |
|
|
|
131 |
|
|
{
|
132 |
|
|
unsigned int wait = 0;
|
133 |
|
|
char *temp_ptr = (char *) buffer;
|
134 |
|
|
|
135 |
|
|
while(length) /* read till length is 0 */
|
136 |
|
|
{
|
137 |
|
|
while(!DataRdyUART2())
|
138 |
|
|
{
|
139 |
|
|
if(wait < uart_data_wait)
|
140 |
|
|
wait++ ; /*wait for more data */
|
141 |
|
|
else
|
142 |
|
|
return(length); /*Time out- Return words/bytes to be read */
|
143 |
|
|
}
|
144 |
|
|
wait=0;
|
145 |
|
|
if(U2MODEbits.PDSEL == 3) /* check if TX/RX is 8bits or 9bits */
|
146 |
|
|
*buffer++ = U2RXREG; /* data word from HW buffer to SW buffer */
|
147 |
|
|
else
|
148 |
|
|
*temp_ptr++ = U2RXREG & 0xFF; /* data byte from HW buffer to SW buffer */
|
149 |
|
|
|
150 |
|
|
length--;
|
151 |
|
|
}
|
152 |
|
|
|
153 |
|
|
return(length); /* number of data yet to be received i.e.,0 */
|
154 |
|
|
}
|
155 |
|
|
|
156 |
|
|
|
157 |
|
|
/*********************************************************************
|
158 |
|
|
* Function Name : DataRdyUart2 *
|
159 |
|
|
* Description : This function checks whether there is any data *
|
160 |
|
|
* that can be read from the input buffer, by *
|
161 |
|
|
* checking URXDA bit *
|
162 |
|
|
* Parameters : None *
|
163 |
|
|
* Return Value : char if any data available in buffer *
|
164 |
|
|
*********************************************************************/
|
165 |
|
|
|
166 |
|
|
char DataRdyUART2(void)
|
167 |
|
|
{
|
168 |
|
|
return(U2STAbits.URXDA);
|
169 |
|
|
}
|
170 |
|
|
|
171 |
|
|
|
172 |
|
|
/*************************************************************************
|
173 |
|
|
* Function Name : BusyUART2 *
|
174 |
|
|
* Description : This returns status whether the transmission *
|
175 |
|
|
* is in progress or not, by checking Status bit TRMT *
|
176 |
|
|
* Parameters : None *
|
177 |
|
|
* Return Value : char info whether transmission is in progress *
|
178 |
|
|
*************************************************************************/
|
179 |
|
|
|
180 |
|
|
char BusyUART2(void)
|
181 |
|
|
{
|
182 |
|
|
return(!U2STAbits.TRMT);
|
183 |
|
|
}
|
184 |
|
|
|
185 |
|
|
|
186 |
|
|
/***************************************************************************
|
187 |
|
|
* Function Name : ReadUART2 *
|
188 |
|
|
* Description : This function returns the contents of UxRXREG buffer *
|
189 |
|
|
* Parameters : None *
|
190 |
|
|
* Return Value : unsigned int value from UxRXREG receive buffer *
|
191 |
|
|
***************************************************************************/
|
192 |
|
|
|
193 |
|
|
unsigned int ReadUART2(void)
|
194 |
|
|
{
|
195 |
|
|
if(U2MODEbits.PDSEL == 3)
|
196 |
|
|
return (U2RXREG);
|
197 |
|
|
else
|
198 |
|
|
return (U2RXREG & 0xFF);
|
199 |
|
|
}
|
200 |
|
|
|
201 |
|
|
|
202 |
|
|
/*********************************************************************
|
203 |
|
|
* Function Name : WriteUART2 *
|
204 |
|
|
* Description : This function writes data into the UxTXREG, *
|
205 |
|
|
* Parameters : unsigned int data the data to be written *
|
206 |
|
|
* Return Value : None *
|
207 |
|
|
*********************************************************************/
|
208 |
|
|
|
209 |
|
|
void WriteUART2(unsigned int data)
|
210 |
|
|
{
|
211 |
|
|
if(U2MODEbits.PDSEL == 3)
|
212 |
|
|
U2TXREG = data;
|
213 |
|
|
else
|
214 |
|
|
U2TXREG = data & 0xFF;
|
215 |
|
|
}
|
216 |
|
|
|
217 |
|
|
|
218 |
|
|
#elif defined(__18CXX)
|
219 |
|
|
//
|
220 |
|
|
// PIC18
|
221 |
|
|
//
|
222 |
|
|
|
223 |
|
|
|
224 |
|
|
char BusyUSART(void)
|
225 |
|
|
{
|
226 |
|
|
return !TXSTAbits.TRMT;
|
227 |
|
|
}
|
228 |
|
|
|
229 |
|
|
void CloseUSART(void)
|
230 |
|
|
{
|
231 |
|
|
RCSTA &= 0x4F; // Disable the receiver
|
232 |
|
|
TXSTAbits.TXEN = 0; // and transmitter
|
233 |
|
|
|
234 |
|
|
PIE1 &= 0xCF; // Disable both interrupts
|
235 |
|
|
}
|
236 |
|
|
|
237 |
|
|
char DataRdyUSART(void)
|
238 |
|
|
{
|
239 |
|
|
if(RCSTAbits.OERR)
|
240 |
|
|
{
|
241 |
|
|
RCSTAbits.CREN = 0;
|
242 |
|
|
RCSTAbits.CREN = 1;
|
243 |
|
|
}
|
244 |
|
|
return PIR1bits.RCIF;
|
245 |
|
|
}
|
246 |
|
|
|
247 |
|
|
char ReadUSART(void)
|
248 |
|
|
{
|
249 |
|
|
return RCREG; // Return the received data
|
250 |
|
|
}
|
251 |
|
|
|
252 |
|
|
void WriteUSART(char data)
|
253 |
|
|
{
|
254 |
|
|
TXREG = data; // Write the data byte to the USART
|
255 |
|
|
}
|
256 |
|
|
|
257 |
|
|
void getsUSART(char *buffer, unsigned char len)
|
258 |
|
|
{
|
259 |
|
|
char i; // Length counter
|
260 |
|
|
unsigned char data;
|
261 |
|
|
|
262 |
|
|
for(i=0;i<len;i++) // Only retrieve len characters
|
263 |
|
|
{
|
264 |
|
|
while(!DataRdyUSART());// Wait for data to be received
|
265 |
|
|
|
266 |
|
|
data = getcUART(); // Get a character from the USART
|
267 |
|
|
// and save in the string
|
268 |
|
|
*buffer = data;
|
269 |
|
|
buffer++; // Increment the string pointer
|
270 |
|
|
}
|
271 |
|
|
}
|
272 |
|
|
|
273 |
|
|
void putsUSART( char *data)
|
274 |
|
|
{
|
275 |
|
|
do
|
276 |
|
|
{ // Transmit a byte
|
277 |
|
|
while(BusyUSART());
|
278 |
|
|
putcUART(*data);
|
279 |
|
|
} while( *data++ );
|
280 |
|
|
}
|
281 |
|
|
|
282 |
|
|
void putrsUSART(const rom char *data)
|
283 |
|
|
{
|
284 |
|
|
do
|
285 |
|
|
{ // Transmit a byte
|
286 |
|
|
while(BusyUSART());
|
287 |
|
|
putcUART(*data);
|
288 |
|
|
} while( *data++ );
|
289 |
|
|
}
|
290 |
|
|
|
291 |
|
|
#endif
|
292 |
|
|
|
293 |
|
|
|
294 |
|
|
#endif //STACK_USE_UART
|