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

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

ライブラリを Arduino IDE 1.7.9 にupdate

File size: 5.5 KB
Line 
1/*
2 Copyright (c) 2014 Arduino. All right reserved.
3
4 This library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 2.1 of the License, or (at your option) any later version.
8
9 This library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12 See the GNU Lesser General Public License for more details.
13
14 You should have received a copy of the GNU Lesser General Public
15 License along with this library; if not, write to the Free Software
16 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17*/
18
19#ifndef _SERCOM_CLASS_
20#define _SERCOM_CLASS_
21
22#include "sam.h"
23
24#define SERCOM_FREQ_REF 48000000
25
26typedef enum
27{
28 UART_EXT_CLOCK = 0,
29 UART_INT_CLOCK = 0x1u
30} SercomUartMode;
31
32typedef enum
33{
34 SPI_SLAVE_OPERATION = 0x2u,
35 SPI_MASTER_OPERATION = 0x3u
36} SercomSpiMode;
37
38typedef enum
39{
40 I2C_SLAVE_OPERATION = 0x4u,
41 I2C_MASTER_OPERATION = 0x5u
42} SercomI2CMode;
43
44typedef enum
45{
46 SERCOM_EVEN_PARITY = 0,
47 SERCOM_ODD_PARITY,
48 SERCOM_NO_PARITY
49} SercomParityMode;
50
51typedef enum
52{
53 SERCOM_STOP_BIT_1 = 0,
54 SERCOM_STOP_BITS_2
55} SercomNumberStopBit;
56
57typedef enum
58{
59 MSB_FIRST = 0,
60 LSB_FIRST
61} SercomDataOrder;
62
63typedef enum
64{
65 UART_CHAR_SIZE_8_BITS = 0,
66 UART_CHAR_SIZE_9_BITS,
67 UART_CHAR_SIZE_5_BITS = 0x5u,
68 UART_CHAR_SIZE_6_BITS,
69 UART_CHAR_SIZE_7_BITS
70} SercomUartCharSize;
71
72typedef enum
73{
74 SERCOM_RX_PAD_0 = 0,
75 SERCOM_RX_PAD_1,
76 SERCOM_RX_PAD_2,
77 SERCOM_RX_PAD_3
78} SercomRXPad;
79
80typedef enum
81{
82 UART_TX_PAD_0 = 0x0ul, // Only for UART
83 UART_TX_PAD_2 = 0x1ul, // Only for UART
84 UART_TX_RTS_CTS_PAD_0_2_3 = 0x2ul, // Only for UART with TX on PAD0, RTS on PAD2 and CTS on PAD3
85} SercomUartTXPad;
86
87typedef enum
88{
89 SAMPLE_RATE_x16 = 0x1, //Fractional
90 SAMPLE_RATE_x8 = 0x3, //Fractional
91} SercomUartSampleRate;
92
93typedef enum
94{
95 SERCOM_SPI_MODE_0 = 0, // CPOL : 0 | CPHA : 0
96 SERCOM_SPI_MODE_1, // CPOL : 0 | CPHA : 1
97 SERCOM_SPI_MODE_2, // CPOL : 1 | CPHA : 0
98 SERCOM_SPI_MODE_3 // CPOL : 1 | CPHA : 1
99} SercomSpiClockMode;
100
101typedef enum
102{
103 SPI_PAD_0_SCK_1 = 0,
104 SPI_PAD_2_SCK_3,
105 SPI_PAD_3_SCK_1,
106 SPI_PAD_0_SCK_3
107} SercomSpiTXPad;
108
109typedef enum
110{
111 SPI_CHAR_SIZE_8_BITS = 0x0ul,
112 SPI_CHAR_SIZE_9_BITS
113} SercomSpiCharSize;
114
115typedef enum
116{
117 WIRE_UNKNOWN_STATE = 0x0ul,
118 WIRE_IDLE_STATE,
119 WIRE_OWNER_STATE,
120 WIRE_BUSY_STATE
121} SercomWireBusState;
122
123typedef enum
124{
125 WIRE_WRITE_FLAG = 0x0ul,
126 WIRE_READ_FLAG
127} SercomWireReadWriteFlag;
128
129typedef enum
130{
131 WIRE_MASTER_ACT_NO_ACTION = 0,
132 WIRE_MASTER_ACT_REPEAT_START,
133 WIRE_MASTER_ACT_READ,
134 WIRE_MASTER_ACT_STOP
135} SercomMasterCommandWire;
136
137typedef enum
138{
139 WIRE_MASTER_ACK_ACTION = 0,
140 WIRE_MASTER_NACK_ACTION
141} SercomMasterAckActionWire;
142
143class SERCOM
144{
145 public:
146 SERCOM(Sercom* s) ;
147
148 /* ========== UART ========== */
149 void initUART(SercomUartMode mode, SercomUartSampleRate sampleRate, uint32_t baudrate=0) ;
150 void initFrame(SercomUartCharSize charSize, SercomDataOrder dataOrder, SercomParityMode parityMode, SercomNumberStopBit nbStopBits) ;
151 void initPads(SercomUartTXPad txPad, SercomRXPad rxPad) ;
152
153 void resetUART( void ) ;
154 void enableUART( void ) ;
155 void flushUART( void ) ;
156 void clearStatusUART( void ) ;
157 bool availableDataUART( void ) ;
158 bool isBufferOverflowErrorUART( void ) ;
159 bool isFrameErrorUART( void ) ;
160 bool isParityErrorUART( void ) ;
161 bool isDataRegisterEmptyUART( void ) ;
162 uint8_t readDataUART( void ) ;
163 int writeDataUART(uint8_t data) ;
164 bool isUARTError() ;
165 void acknowledgeUARTError() ;
166
167 /* ========== SPI ========== */
168 void initSPI(SercomSpiTXPad mosi, SercomRXPad miso, SercomSpiCharSize charSize, SercomDataOrder dataOrder) ;
169 void initSPIslave(SercomSpiTXPad mosi, SercomRXPad miso, SercomSpiCharSize charSize, SercomDataOrder dataOrder);
170 void initSPIClock(SercomSpiClockMode clockMode, uint32_t baudrate) ;
171
172 void resetSPI( void ) ;
173 void enableSPI( void ) ;
174 void disableSPI( void ) ;
175 void setDataOrderSPI(SercomDataOrder dataOrder) ;
176 SercomDataOrder getDataOrderSPI( void ) ;
177 void setBaudrateSPI(uint16_t divider) ;
178 void setClockModeSPI(SercomSpiClockMode clockMode) ;
179 void writeDataSPI(uint8_t data) ;
180 uint16_t readDataSPI( void ) ;
181 bool isBufferOverflowErrorSPI( void ) ;
182 bool isDataRegisterEmptySPI( void ) ;
183 bool isTransmitCompleteSPI( void ) ;
184 bool isReceiveCompleteSPI( void ) ;
185
186 /* ========== WIRE ========== */
187 void initSlaveWIRE(uint8_t address) ;
188 void initMasterWIRE(uint32_t baudrate) ;
189
190 void resetWIRE( void ) ;
191 void enableWIRE( void ) ;
192 void disableWIRE( void );
193 void prepareNackBitWIRE( void ) ;
194 void prepareAckBitWIRE( void ) ;
195 void prepareCommandBitsWire(uint8_t cmd);
196 bool startTransmissionWIRE(uint8_t address, SercomWireReadWriteFlag flag) ;
197 bool sendDataMasterWIRE(uint8_t data) ;
198 bool sendDataSlaveWIRE(uint8_t data) ;
199 bool isMasterWIRE( void ) ;
200 bool isSlaveWIRE( void ) ;
201 bool isBusIdleWIRE( void ) ;
202 bool isBusOwnerWIRE( void ) ;
203 bool isDataReadyWIRE( void ) ;
204 bool isStopDetectedWIRE( void ) ;
205 bool isRestartDetectedWIRE( void ) ;
206 bool isAddressMatch( void ) ;
207 bool isMasterReadOperationWIRE( void ) ;
208 bool isRXNackReceivedWIRE( void ) ;
209 int availableWIRE( void ) ;
210 uint8_t readDataWIRE( void ) ;
211
212 private:
213 Sercom* sercom;
214 uint8_t calculateBaudrateSynchronous(uint32_t baudrate) ;
215 uint32_t division(uint32_t dividend, uint32_t divisor) ;
216 void initClockNVIC( void ) ;
217};
218
219#endif
Note: See TracBrowser for help on using the repository browser.