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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
/**
******************************************************************************
* @file sci_common.h
* @author CMS Application Team
* @version V1.0.2
* @date 2-April-2024
* @brief This file provides firmware functions to manage the following
* functionalities of the Serial Controllor Unit(SCI):
@verbatim
===============================================================================
##### How to use this driver #####
===============================================================================
[..]
@endverbatim
******************************************************************************
* @attention
*
*
******************************************************************************
*/
#ifndef __SCI_COMMON_H__
#define __SCI_COMMON_H__
#include <stdio.h>
#include <stdlib.h>
#include "common.h"
#define SCI_ERROR_LOG(err) sci_error_log((err),__FILE__, __LINE__);
#define SCI_DEFAULT_MODE 0
#define FCLK_DIV_1 ((uint16_t)0x0000)//Operation clock slection 2^0
#define FCLK_DIV_2 ((uint16_t)0x0001)//Operation clock slection 2^1
#define FCLK_DIV_4 ((uint16_t)0x0002)//Operation clock slection 2^2
#define FCLK_DIV_8 ((uint16_t)0x0003)//Operation clock slection 2^3
#define FCLK_DIV_16 ((uint16_t)0x0004)//Operation clock slection 2^4
#define FCLK_DIV_32 ((uint16_t)0x0005)//Operation clock slection 2^5
#define FCLK_DIV_64 ((uint16_t)0x0006)//Operation clock slection 2^6
#define FCLK_DIV_128 ((uint16_t)0x0007)//Operation clock slection 2^7
#define FCLK_DIV_256 ((uint16_t)0x0008)//Operation clock slection 2^8
#define FCLK_DIV_512 ((uint16_t)0x0009)//Operation clock slection 2^9
#define FCLK_DIV_1024 ((uint16_t)0x000A)//Operation clock slection 2^10
#define FCLK_DIV_2048 ((uint16_t)0x000B)//Operation clock slection 2^11
#define FCLK_DIV_4096 ((uint16_t)0x000C)//Operation clock slection 2^12
#define FCLK_DIV_8192 ((uint16_t)0x000D)//Operation clock slection 2^13
#define FCLK_DIV_16384 ((uint16_t)0x000E)//Operation clock slection 2^14
#define FCLK_DIV_32768 ((uint16_t)0x000F)//Operation clock slection 2^15
/**
* SCI uart baudrate error
*/
#define SCI_UART_MAX_ERROR 1.0
/**
* SCI uart mode
*/
#define SCI_UART_Mode_Rx ((uint16_t)0x0012)
#define SCI_UART_Mode_Tx ((uint16_t)0x0022)
/**
* SCI error code macro
*/
#define SCI_SUCCESS (0) //< SCI ok
#define SCI_ERR (-1) //< Normal error
#define SCI_ERR_BUSY (-2) //< Communication unit busy
#define SCI_ERR_ISR (-3) //< Interrupt be used by other function
#define SCI_ERR_CHANNEL_INVALID (-4) //< Selected channel does not exist
#define SCI_ERR_MODE_INVALID (-5) //< Unsupported or incorrect mode
#define SCI_ERR_BAUDRATE (-6) //< Baudrate caculate error
/**
* @brief SCI unit ST register
*/
#define SCI_STOP_EN ((uint16_t)0x0001)
#define SCI_STOP_DIS ((uint16_t)0x0000)
/**
* @brief SCI unit SS register
*/
#define SCI_START_EN ((uint16_t)0x0001)
#define SCI_START_DIS ((uint16_t)0x0000)
/***********************************************************************************************************************
Macro definitions
***********************************************************************************************************************/
/* Clear trigger of framing error of channel n (FECTmn) */
#define SCI_SIRMN_FECTMN (0x0004U) // clears the FEFmn bit of the SSRmn register to 0
/* Clear trigger of parity error flag of channel n (PECTmn) */
#define SCI_SIRMN_PECTMN (0x0002U) // clears the PEFmn bit of the SSRmn register to 0
/* Clear trigger of overrun error flag of channel n (OVCTmn) */
#define SCI_SIRMN_OVCTMN (0x0001U) // clears the OVFmn bit of the SSRmn register to 0
/* Selection of operation clock (fMCK) of channel n (CKSmn) */
#define SCI_CLOCK_SELECT_CK00 (0x0000U) // operation clock CKm0 set by the SPSm register
#define SCI_CLOCK_SELECT_CK01 (0x8000U) // operation clock CKm1 set by the SPSm register
/* Selection of transfer clock (fTCLK) of channel n (CCSmn) */
#define SCI_CLOCK_MODE_CKS (0x0000U) // divided operation clock fMCK specified by the CKSmn bit
#define SCI_CLOCK_MODE_TI0N (0x4000U) // clock input fSCK from the SCKp pin (slave transfer in SPI mode)
/* Selection of start trigger source (STSmn) */
#define SCI_TRIGGER_SOFTWARE (0x0000U) // only software trigger is valid (selected for SPI, UART transmission, and simplified I2C) */
#define SCI_TRIGGER_RXD (0x0100U) // valid edge of the RxDq pin (selected for UART reception)
/* Controls inversion of level of receive data of channel n in UART mode (SISmn0) */
#define SCI_EDGE_FALL (0x0000U) // falling edge is detected as the start bit.
#define SCI_EDGE_RISING (0x0040U) // rising edge is detected as the start bit.
/* Setting of operation mode of channel n (MDmn2,MDmn1) */
#define SCI_MODE_SPI (0x0000U) // SPI mode
#define SCI_MODE_UART (0x0002U) // UART mode
#define SCI_MODE_IIC (0x0004U) // simplified I2C mode
/* Selection of interrupt source of channel n (MDmn0) */
#define SCI_TRANSFER_END (0x0000U) // transfer end interrupt
#define SCI_BUFFER_EMPTY (0x0001U) // buffer empty interrupt
#define SCI_SMRMN_DEFAULT_VALUE (0x0020U) // SMRmn default value
#define SCI_SCRMN_DEFAULT_VALUE (0x0004U) // SCRmn default value
#define IIC_WAITTIME (14U) // change the waiting time according to the system
/* Setting of operation mode of channel n (TXEmn,RXEmn) */
#define SCI_NOT_COMMUNICATION (0x0000U) // disable communication
#define SCI_RECEPTION (0x4000U) // reception only
#define SCI_TRANSMISSION (0x8000U) // transmission only
#define SCI_RECEPTION_TRANSMISSION (0xC000U) // transmission/reception
/* Selection of data and clock phase in SPI mode (DAPmn,CKPmn) */
#define SCI_TIMING_1 (0x0000U) // type 1
#define SCI_TIMING_2 (0x1000U) // type 2
#define SCI_TIMING_3 (0x2000U) // type 3
#define SCI_TIMING_4 (0x3000U) // type 4
/* Mask control of error interrupt signal (INTSREx (x = 0 to 3)) (EOCmn) */
#define SCI_INTSRE_MASK (0x0000U) // disables generation of error interrupt INTSREx (INTSRx is generated) */
#define SCI_INTSRE_ENABLE (0x0400U) // enables generation of error interrupt INTSREx (INTSRx is not generated if an error occurs) */
/* Use of noise filter of RxD2 pin (SNFEN20) */
#define SCI_RXD2_FILTER_OFF (0x00U) // noise filter off
#define SCI_RXD2_FILTER_ON (0x10U) // noise filter on
/* Use of noise filter of RxD1 pin (SNFEN10) */
#define SCI_RXD1_FILTER_OFF (0x00U) // noise filter off
#define SCI_RXD1_FILTER_ON (0x04U) // noise filter on
/* Use of noise filter of RxD0 pin (SNFEN00) */
#define SCI_RXD0_FILTER_OFF (0x00U) // noise filter off
#define SCI_RXD0_FILTER_ON (0x01U) // noise filter on
/*
Serial status register mn (SSRmn)
*/
/* Communication status indication flag of channel n (TSFmn) */
#define SCI_UNDER_EXECUTE (0x0040U) // communication is in progress
#define SCI_VALID_STORED (0x0020U) // valid data is stored in the SDRmn register
/* Framing error detection flag of channel n (FEFmn) */
#define SCI_FRAM_ERROR (0x0004U) // an error occurs (during UART reception)
/* Parity error detection flag of channel n (PEFmn) */
#define SCI_PARITY_ERROR (0x0002U) // an error occurs (during UART reception) or ACK is not detected (during I2C transmission) */
/* Overrun error detection flag of channel n (OVFmn) */
#define SCI_OVERRUN_ERROR (0x0001U) // an overrun error occurs
#define SCI_CH00_PHASE_MASK ((uint16_t)(1 << 0))
#define SCI_CH02_PHASE_MASK ((uint16_t)(1 << 2))
#define SCI_CH10_PHASE_MASK ((uint16_t)(1 << 0))
/*
Serial output register m (SOm)
*/
/* Serial clock output of channel 3 (CKOm3) */
#define SCI_CH3_CLOCK_OUTPUT_0 (0x0000U) // serial clock output value is 0
#define SCI_CH3_CLOCK_OUTPUT_1 (0x0800U) // serial clock output value is 1
/* Serial clock output of channel 2 (CKOm2) */
#define SCI_CH2_CLOCK_OUTPUT_0 (0x0000U) // serial clock output value is 0
#define SCI_CH2_CLOCK_OUTPUT_1 (0x0400U) // serial clock output value is 1
/* Serial clock output of channel 1 (CKOm1) */
#define SCI_CH1_CLOCK_OUTPUT_0 (0x0000U) // serial clock output value is 0
#define SCI_CH1_CLOCK_OUTPUT_1 (0x0200U) // serial clock output value is 1
/***********************************************************************************************************************
* SCI Chanel Rules: | bit15~bit12 | bit7~bit4 | bit3~bit0 |
* | unit index |function index |channel position |
* unit index : unit0:0 unit1:1 unit2:2
* function index : uart:1 spi:2 iic:4
* channel position: uart occupies 2 channels, position begins at firt channel position
***********************************************************************************************************************/
#define SCI_UINT_MASK ((uint16_t)0x7000)
#define SCI_UINT_OFFSET ((uint8_t)0x04)
#define SCI_UNIT_ID0 ((uint16_t)0x1000)
#define SCI_UNIT_ID1 ((uint16_t)0x2000)
#define SCI_UNIT_ID2 ((uint16_t)0x4000)
#define SCI_UART_MASK ((uint8_t)0x10)
#define SCI_SSPI_MASK ((uint8_t)0x20)
#define SCI_I2C_MASK ((uint8_t)0x40)
#define SCI_UNIT_CHANNEL0 ((uint8_t)0x00)
#define SCI_UNIT_CHANNEL1 ((uint8_t)0x01)
#define SCI_UNIT_CHANNEL2 ((uint8_t)0x02)
#define SCI_UNIT_CHANNEL3 ((uint8_t)0x03)
typedef enum
{
UART0 = (SCI_UNIT_ID0 + SCI_UART_MASK + SCI_UNIT_CHANNEL0),
UART1 = (SCI_UNIT_ID0 + SCI_UART_MASK + SCI_UNIT_CHANNEL2),
SSPI00 = (SCI_UNIT_ID0 + SCI_SSPI_MASK + SCI_UNIT_CHANNEL0),
SSPI01 = (SCI_UNIT_ID0 + SCI_SSPI_MASK + SCI_UNIT_CHANNEL1),
SSPI10 = (SCI_UNIT_ID0 + SCI_SSPI_MASK + SCI_UNIT_CHANNEL2),
SSPI11 = (SCI_UNIT_ID0 + SCI_SSPI_MASK + SCI_UNIT_CHANNEL3),
I2C00 = (SCI_UNIT_ID0 + SCI_I2C_MASK + SCI_UNIT_CHANNEL0),
I2C01 = (SCI_UNIT_ID0 + SCI_I2C_MASK + SCI_UNIT_CHANNEL1),
I2C10 = (SCI_UNIT_ID0 + SCI_I2C_MASK + SCI_UNIT_CHANNEL2),
I2C11 = (SCI_UNIT_ID0 + SCI_I2C_MASK + SCI_UNIT_CHANNEL3),
UART2 = (SCI_UNIT_ID1 + SCI_UART_MASK + SCI_UNIT_CHANNEL0),
SSPI20 = (SCI_UNIT_ID1 + SCI_SSPI_MASK + SCI_UNIT_CHANNEL0),
SSPI21 = (SCI_UNIT_ID1 + SCI_SSPI_MASK + SCI_UNIT_CHANNEL1),
I2C20 = (SCI_UNIT_ID1 + SCI_I2C_MASK + SCI_UNIT_CHANNEL0),
I2C21 = (SCI_UNIT_ID1 + SCI_I2C_MASK + SCI_UNIT_CHANNEL1),
#if defined(BAT32A2X9_80PIN) || defined(BAT32A2X9_100PIN)
UART3 = (SCI_UNIT_ID2 + SCI_UART_MASK + SCI_UNIT_CHANNEL0),
SSPI30 = (SCI_UNIT_ID2 + SCI_SSPI_MASK + SCI_UNIT_CHANNEL0),
SSPI31 = (SCI_UNIT_ID2 + SCI_SSPI_MASK + SCI_UNIT_CHANNEL1),
I2C30 = (SCI_UNIT_ID2 + SCI_I2C_MASK + SCI_UNIT_CHANNEL0),
I2C31 = (SCI_UNIT_ID2 + SCI_I2C_MASK + SCI_UNIT_CHANNEL1),
#endif
} SCIAFSelect_TypeDef;
#define IS_ALL_SCIUNIT(unit) (((unit) & (uint16_t)0xFFFC) == 0x0000)
#define IS_ALL_SCICH(chx) (((chx) & (uint16_t)0xFFFC) == 0x0000)
#define IS_ALL_SCIAF(func) ((((func) & (uint16_t)0x8F8C) == 0x0000) && ((func) != (uint16_t)0x0000))
typedef struct
{
uint8_t sps;
uint8_t sdr;
} SCIPeriph_Clock_TypeDef;
void sci_error_log(int8_t err, const char * file, int32_t line);
int SCIChannel_Alloca(SCIAFSelect_TypeDef func, uint16_t mode);
void SCIChannel_Free(SCIAFSelect_TypeDef func, uint16_t mode);
float SCIPeriphal_ClockUpdate(SCIAFSelect_TypeDef func, uint32_t fclk, uint32_t ftclk, uint8_t osps, SCIPeriph_Clock_TypeDef *clock);
uint8_t SCI_GetErrStaus(SCIAFSelect_TypeDef SCIx, uint16_t FLAG);
FlagStatus SCI_GetFlagStatus(uint16_t reg, uint16_t FLAG);
void SCI_ClearFlag(SCIAFSelect_TypeDef SCIx, uint16_t FLAG);
#endif