77#include <string.h>
88#include "AvrUart.h"
99/*********************************************************************************/
10- #if (AVR_UART_REVISION_DATE != 20170726 )
10+ #if (AVR_UART_REVISION_DATE != 20191010 )
1111#error wrong include file. (AvrUart.h)
1212#endif
1313/*********************************************************************************/
1919
2020
2121/*********************************************************************************/
22- static char CheckAllOfInit (tag_AvrUartCtrl * Com )
22+ static tU8 CheckAllOfInit (tag_AvrUartCtrl * Com )
2323{
2424 /*
2525 1) 인수
2626 - Com : tag_AvrUartCtrl 인스턴스의 주소.
2727
2828 2) 반환
29- - 0 : 초기화 실패.
29+ - 0 : 초기화 실패.
3030 - 1 : 초기화 성공.
3131
3232 3) 설명
@@ -36,7 +36,7 @@ static char CheckAllOfInit(tag_AvrUartCtrl *Com)
3636 return (Com -> Bit .InitRegister && Com -> Bit .InitBuffer && Com -> Bit .InitGeneral ) ? true : false;
3737}
3838/*********************************************************************************/
39- char AvrUartLinkRegister (tag_AvrUartCtrl * Com , char * pUDR , char * pUCSRA , char * pEnablePort , char EnablePin )
39+ tU8 AvrUartLinkRegister (tag_AvrUartCtrl * Com , tU8 * pUDR , tU8 * pUCSRA , tU8 * pEnablePort , tU8 EnablePin )
4040{
4141 /*
4242 1) 인수
@@ -47,7 +47,7 @@ char AvrUartLinkRegister(tag_AvrUartCtrl *Com, char *pUDR, char *pUCSRA, char *p
4747 - EnablePin : pin 번호. (Tx enable)
4848
4949 2) 반환
50- - 0 : 초기화 실패
50+ - 0 : 초기화 실패
5151 - 1 : 초기화 성공
5252
5353 3) 설명
@@ -65,7 +65,7 @@ char AvrUartLinkRegister(tag_AvrUartCtrl *Com, char *pUDR, char *pUCSRA, char *p
6565 return Com -> Bit .InitRegister ;
6666}
6767/*********************************************************************************/
68- char AvrUartLinkBuffer (tag_AvrUartCtrl * Com , char * TxBuf , int TxBufSize , char * RxBuf , int RxBufSize )
68+ tU8 AvrUartLinkBuffer (tag_AvrUartCtrl * Com , tU8 * TxBuf , tU16 TxBufSize , tU8 * RxBuf , tU16 RxBufSize )
6969{
7070 /*
7171 1) 인수
@@ -76,7 +76,7 @@ char AvrUartLinkBuffer(tag_AvrUartCtrl *Com, char *TxBuf, int TxBufSize, char *R
7676 - RxBufSize : 수신 버퍼의 크기 (Byte)
7777
7878 2) 반환
79- - 0 : 초기화 실패
79+ - 0 : 초기화 실패
8080 - 1 : 초기화 성공
8181
8282 3) 설명
@@ -95,14 +95,14 @@ char AvrUartLinkBuffer(tag_AvrUartCtrl *Com, char *TxBuf, int TxBufSize, char *R
9595 return Com -> Bit .InitBuffer ;
9696}
9797/*********************************************************************************/
98- char AvrUartGeneralInit (tag_AvrUartCtrl * Com )
98+ tU8 AvrUartGeneralInit (tag_AvrUartCtrl * Com )
9999{
100100 /*
101101 1) 인수
102102 - Com : tag_AvrUartCtrl 인스턴스의 주소.
103103
104104 2) 반환
105- - 0 : 초기화 실패
105+ - 0 : 초기화 실패
106106 - 1 : 초기화 성공
107107
108108 3) 설명
@@ -122,14 +122,15 @@ char AvrUartGeneralInit(tag_AvrUartCtrl *Com)
122122 Com -> Bit .InitGeneral = true;
123123 }
124124
125+ Com -> TxEndDelay = 0 ;
125126 Com -> Bit .InitComplete = CheckAllOfInit (Com );
126127
127128 return Com -> Bit .InitGeneral ;
128129}
129130/*********************************************************************************/
130- void AvrUartPutData (tag_AvrUartCtrl * Com , char * Buf , int Length )
131+ void AvrUartPutData (tag_AvrUartCtrl * Com , tU8 * Buf , tU16 Length )
131132{
132- int i ;
133+ tU16 i ;
133134
134135 /*
135136 1) 인수
@@ -138,7 +139,7 @@ void AvrUartPutData(tag_AvrUartCtrl *Com, char *Buf, int Length)
138139 - Length : 길이 (Byte)
139140
140141 2) 반환
141- - 없음.
142+ - 없음.
142143
143144 3) 설명
144145 - 설정한 길이만큼 지정한 버퍼의 데이터를 송신 버퍼에 저장.
@@ -156,7 +157,7 @@ void AvrUartPutData(tag_AvrUartCtrl *Com, char *Buf, int Length)
156157 }
157158}
158159/*********************************************************************************/
159- void AvrUartPutChar (tag_AvrUartCtrl * Com , char Char )
160+ void AvrUartPutChar (tag_AvrUartCtrl * Com , tU8 Char )
160161{
161162 tag_AvrUartRingBuf * TxQue = & Com -> TxQueue ;
162163
@@ -166,7 +167,7 @@ void AvrUartPutChar(tag_AvrUartCtrl *Com, char Char)
166167 - Char : 송신할 데이터 (1Byte)
167168
168169 2) 반환
169- - 없음.
170+ - 없음.
170171
171172 3) 설명
172173 - 1Byte 데이터를 송신 버퍼에 저장.
@@ -196,7 +197,7 @@ void AvrUartTxQueueControl(tag_AvrUartCtrl *Com)
196197 - Com : tag_AvrUartCtrl 인스턴스의 주소.
197198
198199 2) 반환
199- - 없음.
200+ - 없음.
200201
201202 3) 설명
202203 - UART 채널의 송신 관리.
@@ -214,14 +215,15 @@ void AvrUartTxQueueControl(tag_AvrUartCtrl *Com)
214215 * Com -> pUDR = * TxQue -> OutPtr ;
215216
216217 INC_BUF_POINTER (TxQue -> OutPtr , TxQue );
218+ Com -> TxEndCnt = Com -> TxEndDelay ;
217219 }
218- else
220+ else if ( Com -> TxEndDelay == 0 )
219221 {
220222 Com -> Bit .DataSend = false;
221223 * Com -> pEnablePort &= ~(1 << Com -> EnablePin );
222- if (TxQue -> OutPtr != TxQue -> InPtr )
224+ if (Com -> TxQueue . OutPtr != Com -> TxQueue . InPtr )
223225 {
224- AvrUartClearQueueBuf (TxQue );
226+ AvrUartClearQueueBuf (& Com -> TxQueue );
225227 }
226228 }
227229}
@@ -233,7 +235,7 @@ void AvrUartStartTx(tag_AvrUartCtrl *Com)
233235 - Com : tag_AvrUartCtrl 인스턴스의 주소.
234236
235237 2) 반환
236- - 없음.
238+ - 없음.
237239
238240 3) 설명
239241 - 본 함수를 호출할 경우 송신 버퍼에 저장된 데이터 송신을 시작함.
@@ -247,21 +249,22 @@ void AvrUartStartTx(tag_AvrUartCtrl *Com)
247249
248250 while ((* Com -> pUCSRA & 0x20 ) == 0 );
249251 Com -> Bit .DataSend = true;
252+ Com -> TxEndCnt = Com -> TxEndDelay ;
250253 * Com -> pEnablePort |= (1 << Com -> EnablePin );
251254 AvrUartTxQueueControl (Com );
252255}
253256/*********************************************************************************/
254257void AvrUartRxQueueControl (tag_AvrUartCtrl * Com )
255258{
256- volatile char Temp ;
259+ volatile tU8 Temp ;
257260 tag_AvrUartRingBuf * RxQue = & Com -> RxQueue ;
258261
259262 /*
260263 1) 인수
261264 - Com : tag_AvrUartCtrl 인스턴스의 주소.
262265
263266 2) 반환
264- - 없음.
267+ - 없음.
265268
266269 3) 설명
267270 - UART 채널의 수신 관리.
@@ -287,39 +290,7 @@ void AvrUartRxQueueControl(tag_AvrUartCtrl *Com)
287290 }
288291}
289292/*********************************************************************************/
290- int AvrUartCheckRx (tag_AvrUartCtrl * Com )
291- {
292- /*
293- 1) 인수
294- - Com : tag_AvrUartCtrl 인스턴스의 주소.
295-
296- 2) 반환
297- - 수신한 데이터의 길이 반환 (Byte)
298-
299- 3) 설명
300- - 수신 버퍼에 저장된 데이터의 길이를 반환함.
301- */
302-
303- return Com -> RxQueue .Ctr ;
304- }
305- /*********************************************************************************/
306- int AvrUartCheckTx (tag_AvrUartCtrl * Com )
307- {
308- /*
309- 1) 인수
310- - Com : tag_AvrUartCtrl 인스턴스의 주소.
311-
312- 2) 반환
313- - 송신할 데이터의 길이 반환 (Byte)
314-
315- 3) 설명
316- - 송신 버퍼에 저장된 데이터의 길이를 반환함.
317- */
318-
319- return Com -> TxQueue .Ctr ;
320- }
321- /*********************************************************************************/
322- void AvrUartGetChar (tag_AvrUartCtrl * Com , char * Char )
293+ void AvrUartGetChar (tag_AvrUartCtrl * Com , tU8 * Char )
323294{
324295 tag_AvrUartRingBuf * RxQue = & Com -> RxQueue ;
325296
@@ -329,7 +300,7 @@ void AvrUartGetChar(tag_AvrUartCtrl *Com, char *Char)
329300 - Char : 수신 버퍼의 데이터를 저장할 변수의 주소.
330301
331302 2) 반환
332- - 없음.
303+ - 없음.
333304
334305 3) 설명
335306 - 수신 버퍼의 데이터 1Byte를 읽어 지정한 변수에 저장.
@@ -350,9 +321,9 @@ void AvrUartGetChar(tag_AvrUartCtrl *Com, char *Char)
350321 }
351322}
352323/*********************************************************************************/
353- void AvrUartGetData (tag_AvrUartCtrl * Com , char * Buf , int Length )
324+ void AvrUartGetData (tag_AvrUartCtrl * Com , tU8 * Buf , tU16 Length )
354325{
355- int i ;
326+ tU16 i ;
356327
357328 /*
358329 1) 인수
@@ -361,7 +332,7 @@ void AvrUartGetData(tag_AvrUartCtrl *Com, char *Buf, int Length)
361332 - Length : 읽어올 데이터의 길이 (Byte)
362333
363334 2) 반환
364- - 없음.
335+ - 없음.
365336
366337 3) 설명
367338 - 수신 버퍼의 데이터를 지정한 길이 만큼 읽어 지정한 버퍼에 저장.
@@ -386,7 +357,7 @@ void AvrUartClearQueueBuf(tag_AvrUartRingBuf *Queue)
386357 - Queue : tag_AvrUartRingBuf 인스턴스의 주소.
387358
388359 2) 반환
389- - 없음.
360+ - 없음.
390361
391362 3) 설명
392363 - 지정한 RingBuf 초기화.
@@ -396,14 +367,14 @@ void AvrUartClearQueueBuf(tag_AvrUartRingBuf *Queue)
396367 Queue -> Ctr = 0 ;
397368}
398369/*********************************************************************************/
399- char AvrUartCheckReceiving (tag_AvrUartCtrl * Com )
370+ tU8 AvrUartCheckReceiving (tag_AvrUartCtrl * Com )
400371{
401372 /*
402373 1) 인수
403374 - Com : tag_AvrUartCtrl 인스턴스의 주소.
404375
405376 2) 반환
406- - 0 : 수신 대기
377+ - 0 : 수신 대기
407378 - 1 : 수신 중
408379
409380 3) 설명
@@ -419,28 +390,37 @@ char AvrUartCheckReceiving(tag_AvrUartCtrl *Com)
419390 return Com -> ReceivingCnt ? true : false;
420391}
421392/*********************************************************************************/
422- void AvrUartFixTxEnableFloating (tag_AvrUartCtrl * Com )
393+ void AvrUartControlTxEnd (tag_AvrUartCtrl * Com )
423394{
424395 /*
425396 1) 인수
426397 - Com : tag_AvrUartCtrl 인스턴스의 주소.
427398
428399 2) 반환
429- - 없음.
400+ - 없음.
430401
431402 3) 설명
432- - 송신완료 후 TX enable pin이 간헐적으로 disable 되지 않는 현상이 있어 추가 .
433- - AvrUart 모듈을 사용하며 Slave일 경우 반드시 본 함수를 주기적으로 호출 .
403+ - Main Loop에서 일정한 주기로 본 함수 호출 .
404+ - 송신 종료를 확인하며 마지막 송신으로부터 일정 지연시간 후 수신으로 전환 .
434405 */
435-
406+
436407 if (Com -> Bit .InitComplete == false)
437408 {
438409 return ;
439410 }
440-
441- if (( Com -> Bit . DataSend == false) && ( * Com -> pEnablePort & ( 1 << Com -> EnablePin )) )
411+
412+ if (Com -> TxEndCnt == 0 )
442413 {
414+ Com -> Bit .DataSend = false;
443415 * Com -> pEnablePort &= ~(1 << Com -> EnablePin );
416+ if (Com -> TxQueue .OutPtr != Com -> TxQueue .InPtr )
417+ {
418+ AvrUartClearQueueBuf (& Com -> TxQueue );
419+ }
420+ }
421+ else
422+ {
423+ Com -> TxEndCnt -- ;
444424 }
445425}
446426/*********************************************************************************/
0 commit comments