123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306 |
- #ifndef USART_DRIVER_H
- #define USART_DRIVER_H
- #include "avr_compiler.h"
- #define USART_RX_BUFFER_SIZE 4
- #define USART_TX_BUFFER_SIZE 4
- #define USART_RX_BUFFER_MASK ( USART_RX_BUFFER_SIZE - 1 )
- #define USART_TX_BUFFER_MASK ( USART_TX_BUFFER_SIZE - 1 )
- #if ( USART_RX_BUFFER_SIZE & USART_RX_BUFFER_MASK )
- #error RX buffer size is not a power of 2
- #endif
- #if ( USART_TX_BUFFER_SIZE & USART_TX_BUFFER_MASK )
- #error TX buffer size is not a power of 2
- #endif
- typedef struct USART_Buffer
- {
-
- volatile uint8_t RX[USART_RX_BUFFER_SIZE];
-
- volatile uint8_t TX[USART_TX_BUFFER_SIZE];
-
- volatile uint8_t RX_Head;
-
- volatile uint8_t RX_Tail;
-
- volatile uint8_t TX_Head;
-
- volatile uint8_t TX_Tail;
- } USART_Buffer_t;
- typedef struct Usart_and_buffer
- {
-
- USART_t * usart;
-
- USART_DREINTLVL_t dreIntLevel;
-
- USART_Buffer_t buffer;
- } USART_data_t;
- #define USART_Format_Set(_usart, _charSize, _parityMode, _twoStopBits) \
- (_usart)->CTRLC = (uint8_t) _charSize | _parityMode | \
- (_twoStopBits ? USART_SBMODE_bm : 0)
- #define USART_Baudrate_Set(_usart, _bselValue, _bScaleFactor) \
- (_usart)->BAUDCTRLA =(uint8_t)_bselValue; \
- (_usart)->BAUDCTRLB =(_bScaleFactor << USART_BSCALE0_bp)|(_bselValue >> 8)
- #define USART_Rx_Enable(_usart) ((_usart)->CTRLB |= USART_RXEN_bm)
- #define USART_Rx_Disable(_usart) ((_usart)->CTRLB &= ~USART_RXEN_bm)
- #define USART_Tx_Enable(_usart) ((_usart)->CTRLB |= USART_TXEN_bm)
- #define USART_Tx_Disable(_usart) ((_usart)->CTRLB &= ~USART_TXEN_bm)
- #define USART_RxdInterruptLevel_Set(_usart, _rxdIntLevel) \
- ((_usart)->CTRLA = ((_usart)->CTRLA & ~USART_RXCINTLVL_gm) | _rxdIntLevel)
- #define USART_TxdInterruptLevel_Set(_usart, _txdIntLevel) \
- (_usart)->CTRLA = ((_usart)->CTRLA & ~USART_TXCINTLVL_gm) | _txdIntLevel
- #define USART_DreInterruptLevel_Set(_usart, _dreIntLevel) \
- (_usart)->CTRLA = ((_usart)->CTRLA & ~USART_DREINTLVL_gm) | _dreIntLevel
- #define USART_SetMode(_usart, _usartMode) \
- ((_usart)->CTRLC = ((_usart)->CTRLC & (~USART_CMODE_gm)) | _usartMode)
- #define USART_IsTXDataRegisterEmpty(_usart) (((_usart)->STATUS & USART_DREIF_bm) != 0)
- #define USART_PutChar(_usart, _data) ((_usart)->DATA = _data)
- #define USART_IsRXComplete(_usart) (((_usart)->STATUS & USART_RXCIF_bm) != 0)
- #define USART_GetChar(_usart) ((_usart)->DATA)
- void USART_InterruptDriver_Initialize(USART_data_t * usart_data,
- USART_t * usart,
- USART_DREINTLVL_t dreIntLevel );
- void USART_InterruptDriver_DreInterruptLevel_Set(USART_data_t * usart_data,
- USART_DREINTLVL_t dreIntLevel);
- bool USART_TXBuffer_FreeSpace(USART_data_t * usart_data);
- bool USART_TXBuffer_PutByte(USART_data_t * usart_data, uint8_t data);
- bool USART_RXBufferData_Available(USART_data_t * usart_data);
- uint8_t USART_RXBuffer_GetByte(USART_data_t * usart_data);
- bool USART_RXComplete(USART_data_t * usart_data);
- void USART_DataRegEmpty(USART_data_t * usart_data);
- void USART_NineBits_PutChar(USART_t * usart, uint16_t data);
- uint16_t USART_NineBits_GetChar(USART_t * usart);
- #endif
|