-
Notifications
You must be signed in to change notification settings - Fork 0
/
Uart.c
95 lines (75 loc) · 3.06 KB
/
Uart.c
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
#include "Defines.h"
#include "modem.h"
unsigned char data_rd_UART[MSG_SIZE_RD]; // Входной буфер от кассы
unsigned char data_wr_UART[MSG_SIZE_WR]; // Выходной буфер "в кассу"
uint8_t len_msg_in; //длина сообщения
uint8_t len_msg_out;
BUF_Status buf_status; // Глобальная переменная, по ней определяем состояние
// приема и необходимость обработки команды
unsigned char time_out; // Переменная, хранящая текущий таймаут
UART_CFG_Type UART0_Cfg; // Структура, хранящая параметры UART0
UART_FIFO_CFG_Type UARTFIFOConfigStruct; // Структура упр. FIFO для UART1
//NEW
uint8_t UART_RCV_COUNT; //Количество принятых байт
uint8_t UART_DONE; //состояние UART - > Сообщение принято
//====== Обработчик прерываний UART0 ========================================
void UART0_IRQHandler(void) // прерывание на ввод данных из кассы
{
unsigned char rd_data;
static unsigned char *buf_point;
Int_UART0_Disable();
Channel = UART;
//Timer_Start();
if(!UART_RCV_COUNT)
buf_point = &data_rd_UART[0]; //если не пришло еще данных, указатель в нуле
if(!UART_DONE) rd_data = UART_ReceiveByte(UART0);
if(!UART_DONE) UART_RCV_COUNT++;
if(!UART_DONE) *buf_point++ = rd_data;
if(!UART_DONE) Timer_Restart();
Int_UART0_Enable();
}
//====== Подпрограмма загрузки начальных параметров портов ===================
void Init_Uart_Default(void) {
time_out = 0; // переменная хранится в блоке Timer
UART_ConfigStructInit(&UART0_Cfg);
UART_FIFOConfigStructInit(&UARTFIFOConfigStruct);
}
//==== Инициализация UART0 - обмен с кассой ===================================
void Init_Uart0(void) {
PINSEL_CFG_Type PinCfg;
PinCfg.Funcnum = 1; // Альтернативная функция 1 (т.е. UART0)
PinCfg.OpenDrain = 0; // Не "Открытый коллектор"
PinCfg.Pinmode = 0; // Pull-up резистор
PinCfg.Pinnum = 2; // Пин 2
PinCfg.Portnum = 0; // Порт 0
PINSEL_ConfigPin(&PinCfg); // Настройка P0.2 (TXD0)
PinCfg.Pinnum = 3; // Пин 3
PINSEL_ConfigPin(&PinCfg); // Настройка P0.3 (RXD0)
UART_Init(UART0,&UART0_Cfg); // инициализация порта
UART_TxCmd(UART0, ENABLE); // Разрешение передачи
UART_IntConfig(UART0, UART_INTCFG_RBR, ENABLE);
// Разрешение прерывания по приходу символа
}
//===== Разрешение прерываний от UART0 =======================================
void Int_UART0_Enable(void) {
NVIC_EnableIRQ(UART0_IRQn); // Разрешаем прерывание от UART0
}
//===== Запрет прерываний от UART0 ===========================================
void Int_UART0_Disable(void) {
NVIC_DisableIRQ(UART0_IRQn); // Запрещаем прерывание от UART0
}
//===== Подпрограмма вычисления контрольной суммы ============================
uint8_t Get_CRC(unsigned char* point, uint32_t len) {
uint8_t crc = 0;
while (len) {
crc ^= *point++;
len--;
}
return crc;
}
void UART_refresh()
{
UART_RCV_COUNT = 0;
UART_DONE=0;
Timer_Start();
}