source: rtos_arduino/trunk/arduino_lib/hardware/arduino/samd/cores/arduino/SERCOM.h@ 136

Last change on this file since 136 was 136, checked in by ertl-honda, 8 years ago

ライブラリとOS及びベーシックなサンプルの追加.

File size: 4.4 KB
Line 
1#ifndef _SERCOM_CLASS_
2#define _SERCOM_CLASS_
3
4#include "sam.h"
5
6#define SERCOM_FREQ_REF 48000000
7
8typedef enum
9{
10 UART_EXT_CLOCK = 0,
11 UART_INT_CLOCK = 0x1u
12} SercomUartMode;
13
14typedef enum
15{
16 SPI_SLAVE_OPERATION = 0x2u,
17 SPI_MASTER_OPERATION = 0x3u
18} SercomSpiMode;
19
20typedef enum
21{
22 I2C_SLAVE_OPERATION = 0x4u,
23 I2C_MASTER_OPERATION = 0x5u
24} SercomI2CMode;
25
26typedef enum
27{
28 SERCOM_EVEN_PARITY = 0,
29 SERCOM_ODD_PARITY,
30 SERCOM_NO_PARITY
31} SercomParityMode;
32
33typedef enum
34{
35 SERCOM_STOP_BIT_1 = 0,
36 SERCOM_STOP_BITS_2
37} SercomNumberStopBit;
38
39typedef enum
40{
41 MSB_FIRST = 0,
42 LSB_FIRST
43} SercomDataOrder;
44
45typedef enum
46{
47 UART_CHAR_SIZE_8_BITS = 0,
48 UART_CHAR_SIZE_9_BITS,
49 UART_CHAR_SIZE_5_BITS = 0x5u,
50 UART_CHAR_SIZE_6_BITS,
51 UART_CHAR_SIZE_7_BITS
52} SercomUartCharSize;
53
54typedef enum
55{
56 SERCOM_RX_PAD_0 = 0,
57 SERCOM_RX_PAD_1,
58 SERCOM_RX_PAD_2,
59 SERCOM_RX_PAD_3
60} SercomRXPad;
61
62typedef enum
63{
64 UART_TX_PAD_0 = 0x0ul, //Only for UART
65 UART_TX_PAD_2 = 0x1ul, //Only for UART
66} SercomUartTXPad;
67
68typedef enum
69{
70 SAMPLE_RATE_x16 = 0, //Arithmetic
71 SAMPLE_RATE_x8 = 0x2, //Arithmetic
72 SAMPLE_RATE_x3 = 0x3 //Arithmetic
73} SercomUartSampleRate;
74
75typedef enum
76{
77 SERCOM_SPI_MODE_0 = 0, // CPOL : 0 | CPHA : 0
78 SERCOM_SPI_MODE_1, // CPOL : 0 | CPHA : 1
79 SERCOM_SPI_MODE_2, // CPOL : 1 | CPHA : 0
80 SERCOM_SPI_MODE_3 // CPOL : 1 | CPHA : 1
81} SercomSpiClockMode;
82
83typedef enum
84{
85 SPI_PAD_0_SCK_1 = 0,
86 SPI_PAD_2_SCK_3,
87 SPI_PAD_3_SCK_1,
88 SPI_PAD_0_SCK_3
89} SercomSpiTXPad;
90
91typedef enum
92{
93 SPI_CHAR_SIZE_8_BITS = 0x0ul,
94 SPI_CHAR_SIZE_9_BITS
95} SercomSpiCharSize;
96
97typedef enum
98{
99 WIRE_UNKNOWN_STATE = 0x0ul,
100 WIRE_IDLE_STATE,
101 WIRE_OWNER_STATE,
102 WIRE_BUSY_STATE
103} SercomWireBusState;
104
105typedef enum
106{
107 WIRE_WRITE_FLAG = 0x0ul,
108 WIRE_READ_FLAG
109} SercomWireReadWriteFlag;
110
111typedef enum
112{
113 WIRE_MASTER_ACT_NO_ACTION = 0,
114 WIRE_MASTER_ACT_REPEAT_START,
115 WIRE_MASTER_ACT_READ,
116 WIRE_MASTER_ACT_STOP
117} SercomMasterCommandWire;
118
119typedef enum
120{
121 WIRE_MASTER_ACK_ACTION = 0,
122 WIRE_MASTER_NACK_ACTION
123} SercomMasterAckActionWire;
124
125class SERCOM
126{
127 public:
128 SERCOM(Sercom* s) ;
129
130 /* ========== UART ========== */
131 void initUART(SercomUartMode mode, SercomUartSampleRate sampleRate, uint32_t baudrate=0) ;
132 void initFrame(SercomUartCharSize charSize, SercomDataOrder dataOrder, SercomParityMode parityMode, SercomNumberStopBit nbStopBits) ;
133 void initPads(SercomUartTXPad txPad, SercomRXPad rxPad) ;
134
135 void resetUART( void ) ;
136 void enableUART( void ) ;
137 void flushUART( void ) ;
138 void clearStatusUART( void ) ;
139 bool availableDataUART( void ) ;
140 bool isBufferOverflowErrorUART( void ) ;
141 bool isFrameErrorUART( void ) ;
142 bool isParityErrorUART( void ) ;
143 bool isDataRegisterEmptyUART( void ) ;
144 uint8_t readDataUART( void ) ;
145 int writeDataUART(uint8_t data) ;
146
147 /* ========== SPI ========== */
148 void initSPI(SercomSpiTXPad mosi, SercomRXPad miso, SercomSpiCharSize charSize, SercomDataOrder dataOrder) ;
149 void initSPIClock(SercomSpiClockMode clockMode, uint32_t baudrate) ;
150
151 void resetSPI( void ) ;
152 void enableSPI( void ) ;
153 void disableSPI( void ) ;
154 void setDataOrderSPI(SercomDataOrder dataOrder) ;
155 void setBaudrateSPI(uint8_t divider) ;
156 void setClockModeSPI(SercomSpiClockMode clockMode) ;
157 void writeDataSPI(uint8_t data) ;
158 uint16_t readDataSPI( void ) ;
159 bool isBufferOverflowErrorSPI( void ) ;
160 bool isDataRegisterEmptySPI( void ) ;
161 bool isTransmitCompleteSPI( void ) ;
162 bool isReceiveCompleteSPI( void ) ;
163
164 /* ========== WIRE ========== */
165 void initSlaveWIRE(uint8_t address) ;
166 void initMasterWIRE(uint32_t baudrate) ;
167
168 void resetWIRE( void ) ;
169 void enableWIRE( void ) ;
170 void disableWIRE( void );
171 void prepareNackBitWIRE( void ) ;
172 void prepareAckBitWIRE( void ) ;
173 void prepareCommandBitsWire(SercomMasterCommandWire cmd);
174 bool startTransmissionWIRE(uint8_t address, SercomWireReadWriteFlag flag) ;
175 bool sendDataMasterWIRE(uint8_t data) ;
176 bool sendDataSlaveWIRE(uint8_t data) ;
177 bool isMasterWIRE( void ) ;
178 bool isSlaveWIRE( void ) ;
179 bool isBusIdleWIRE( void ) ;
180 bool isDataReadyWIRE( void ) ;
181 bool isStopDetectedWIRE( void ) ;
182 bool isRestartDetectedWIRE( void ) ;
183 bool isAddressMatch( void ) ;
184 bool isMasterReadOperationWIRE( void ) ;
185 bool isRXNackReceivedWIRE( void ) ;
186 int availableWIRE( void ) ;
187 uint8_t readDataWIRE( void ) ;
188
189 private:
190 Sercom* sercom;
191 uint8_t calculateBaudrateSynchronous(uint32_t baudrate) ;
192 uint32_t division(uint32_t dividend, uint32_t divisor) ;
193 void initClockNVIC( void ) ;
194};
195
196#endif
Note: See TracBrowser for help on using the repository browser.