Skip to content

Commit 465b510

Browse files
Merge pull request #9 from TimerOverflow/20191010
20191010
2 parents 2b7494f + e6dfd50 commit 465b510

File tree

2 files changed

+91
-98
lines changed

2 files changed

+91
-98
lines changed

AvrUart.c

Lines changed: 48 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
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
/*********************************************************************************/
@@ -19,14 +19,14 @@
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
/*********************************************************************************/
254257
void 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

Comments
 (0)