#ifndef _UART_H_
#define _UART_H_
#include "DSP280x_Device.h"
#define LSPCLK 100000000 / 4
#define UART_BUFF_SIZE 100 // размер буффера
#define SCI_TRA_MUX GpioCtrlRegs.GPAMUX2.bit.GPIO24
#define SCI_TRB_MUX GpioCtrlRegs.GPAMUX2.bit.GPIO25
#define SCI_TRA_DIR GpioCtrlRegs.GPADIR.bit.GPIO24
#define SCI_TRB_DIR GpioCtrlRegs.GPADIR.bit.GPIO25
#define SCI_TRA_DATA GpioDataRegs.GPADAT.bit.GPIO24
#define SCI_TRB_DATA GpioDataRegs.GPADAT.bit.GPIO25
#define SCI_TRA_DATA_ON SCI_TRA_DATA=1
#define SCI_TRA_DATA_OFF SCI_TRA_DATA=0
#define SCI_TRB_DATA_ON SCI_TRB_DATA=1
#define SCI_TRB_DATA_OFF SCI_TRB_DATA=1 // все времЯ настороен на передачу
#define SCI_A_INT_TX_OFF PieCtrlRegs.PIEIER9.bit.INTx2=0 // PIE Group 9, INT3
#define SCI_A_INT_TX_ON PieCtrlRegs.PIEIER9.bit.INTx2=1 // PIE Group 9, INT3
#define SCI_B_INT_TX_OFF PieCtrlRegs.PIEIER9.bit.INTx4=0 // PIE Group 9, INT3
#define SCI_B_INT_TX_ON PieCtrlRegs.PIEIER9.bit.INTx4=1 // PIE Group 9, INT3
typedef enum { _1200, _2400, _4800, _9600, _19200, _38400, _57600, _115200 } UART_SPEED;
typedef enum { _INFORMATION_CH, _MODBUS } UART_WORK_MODE;
#pragma pack(push, 1) // выравнивание структуры в 1 байт(инфа в нете по структурам)
struct UART_PARAMS {
UART_SPEED UartSpeed;
UART_WORK_MODE WorkMode;
int ParityControl;
};
#pragma pack(pop)
extern "C"
{
interrupt void RX_Interrupt_A();
interrupt void TX_Interrupt_A();
interrupt void RX_Interrupt_B();
interrupt void TX_Interrupt_B();
}
class Uart
{
public:
Uart();
virtual ~Uart() {}
volatile struct SCI_REGS *SciRegister;
UART_PARAMS Parameters;
void ReceiveData(char byte);
void Processing();
void ReceiveDataTimer();
void SetParityControl();
void CalcBaudRate();
void SendPackage();
virtual void SetWorkMode(Uint16 mode) { }
virtual void TransmitData(Uint16 byteCount) { }
protected:
virtual void StopTransmit() { }
virtual bool CheckForAvailable() { return 0; }
virtual void RX_Interrupt() { }
virtual void TX_Interrupt() { }
protected:
char RX_TX_Buffer[UART_BUFF_SIZE]; // буффер для приема данных
Uint16 byteCounter; // для подсчета количества принятых дынных
Uint16 sendBytesCount; // сичатет сколько отправили байт
bool endOfTX; // флаг окончания передачи данных
bool activateTimer;
bool startProcessing; // флаг начала обработки пакета
Uint16 timeOut; // время, по истечению которого будет определен конец передачи данных
};
class Uart_A: public Uart
{
public:
Uart_A();
virtual ~Uart_A() {}
void SetSpeed(Uint16 speed);
void TransmitData(Uint16 byteCount);
void StopTransmit();
void SetWorkMode(Uint16 mode) {}
bool CheckForAvailable();
};
class Uart_B: public Uart
{
public:
Uart_B();
virtual ~Uart_B() {}
void SetSpeed(Uint16 speed);
void TransmitData(Uint16 byteCount);
void StopTransmit();
void SetWorkMode(Uint16 mode);
bool CheckForAvailable();
};
#endif
评论0