forked from SZV10X_Software/SZV103_FM33A0xxEV_SiZhu

jinlicong
2024-05-15 d14dd3a2106de793fbe08dc5a12cf80defd3258a
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
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
/**
  ******************************************************************************
  * @file    fm33a0xxev_spi.h
  * @author  FM33A0XXEV Application Team
  * @version V1.0.0
  * @date    16-April-2020
  * @brief   This file contains all the functions prototypes for the SPI firmware library.  
  ******************************************************************************
  */
  
/* Define to prevent recursive inclusion -------------------------------------*/
 
#ifndef __FM33A0XXEV_SPI_H
#define __FM33A0XXEV_SPI_H
 
 
#ifdef __cplusplus
 extern "C" {
#endif
 
/* Includes ------------------------------------------------------------------*/
 
#include "FM33A0XXEV.h" 
   
//------------------------------------------------------------------------------
     
#define    SPIx_CR1_IOSWAP_Pos    11    /* MOSIºÍMISOÒý½Å½»»» (IO swapping)
0£ºÄ¬ÈÏÒý½Å˳Ðò
1£º½»»»Òý½Å˳Ðò */
#define    SPIx_CR1_IOSWAP_Msk    (0x1U << SPIx_CR1_IOSWAP_Pos)
#define    SPIx_CR1_IOSWAP_DEFAULT    (0x0U << SPIx_CR1_IOSWAP_Pos)    /* Ä¬ÈÏÒý½Å˳Ðò */
#define    SPIx_CR1_IOSWAP_EXCHANGE    (0x1U << SPIx_CR1_IOSWAP_Pos)    /* ½»»»Òý½Å˳Ðò */
 
#define    SPIx_CR1_MSPA_Pos    10    /* Master Sampling Position Adjustment£¬Master¶ÔMISOÐźŵIJÉÑùλÖõ÷Õû£¬ÓÃÓÚ¸ßËÙͨÐÅʱ²¹³¥PCB×ßÏßÑÓ³Ù
1£º²ÉÑùµãÑÓ³Ù°ë¸öSCKÖÜÆÚ
0£º²»µ÷Õû */
#define    SPIx_CR1_MSPA_Msk    (0x1U << SPIx_CR1_MSPA_Pos)
#define    SPIx_CR1_MSPA_DELAY    (0x1U << SPIx_CR1_MSPA_Pos)    /* ²ÉÑùµãÑÓ³Ù°ë¸öSCKÖÜÆÚ */
#define    SPIx_CR1_MSPA_NORMAL    (0x0U << SPIx_CR1_MSPA_Pos)    /* ²»µ÷Õû */
 
#define    SPIx_CR1_SSPA_Pos    9    /* Slave Sending Position Adjustment£¬Slave MISO·¢ËÍλÖõ÷Õû
1£ºÌáǰ°ë¸öSCKÖÜÆÚ·¢ËÍ
0£º²»µ÷Õû */
#define    SPIx_CR1_SSPA_Msk    (0x1U << SPIx_CR1_SSPA_Pos)
#define    SPIx_CR1_SSPA_EARLY    (0x1U << SPIx_CR1_SSPA_Pos)    /* Ìáǰ°ë¸öSCKÖÜÆÚ·¢ËÍ */
#define    SPIx_CR1_SSPA_NORMAL    (0x0U << SPIx_CR1_SSPA_Pos)    /* ²»µ÷Õû */
 
#define    SPIx_CR1_MM_Pos    8    /* Master/SlaveģʽѡÔñ¡£(Master Mode) 1£ºMasterģʽ 0£ºSlaveģʽ */
#define    SPIx_CR1_MM_Msk    (0x1U << SPIx_CR1_MM_Pos)
#define    SPIx_CR1_MM_MASTER    (0x1U << SPIx_CR1_MM_Pos)
#define    SPIx_CR1_MM_SLAVE    (0x0U << SPIx_CR1_MM_Pos)
 
#define    SPIx_CR1_WAIT_Pos    6    /* MasterģʽÏ£¬Ã¿·¢ËÍÍêÒ»Ö¡ºó¼ÓÈëÖÁÉÙ(1+WAIT)¸öSCK cycleµÈ´ýʱ¼ä£¬ÔÙ´«ÊäÏÂÒ»Ö¡µÄÊý¾Ý¡£Èç¹ûSSNÓÉÓ²¼þ¿ØÖÆ£¬²¢ÇÒSSNM=1£¬ÔòÓ²¼þ»á×Ô¶¯À­¸ßSSN¡£ */
#define    SPIx_CR1_WAIT_Msk    (0x3U << SPIx_CR1_WAIT_Pos)
#define    SPIx_CR1_WAIT_1WAIT    (0x0U << SPIx_CR1_WAIT_Pos)
#define    SPIx_CR1_WAIT_2WAIT    (0x1U << SPIx_CR1_WAIT_Pos)
#define    SPIx_CR1_WAIT_3WAIT    (0x2U << SPIx_CR1_WAIT_Pos)
#define    SPIx_CR1_WAIT_4WAIT    (0x3U << SPIx_CR1_WAIT_Pos)
 
#define    SPIx_CR1_BAUD_Pos    3    /* Masterģʽ²¨ÌØÂÊÅäÖÃλ: (Baud rate) 000£º fAPBCLK/2 001£º fAPBCLK/4 010£º fAPBCLK/8 011£º fAPBCLK/16 100£º fAPBCLK/32 101£º fAPBCLK/64 110£º fAPBCLK/128 111£º fAPBCLK/256 µ±Í¨ÐÅÕýÔÚ½øÐеÄʱºò£¬²»ÄÜÐÞ¸ÄÕâЩλ¡£ */
#define    SPIx_CR1_BAUD_Msk    (0x7U << SPIx_CR1_BAUD_Pos)
#define    SPIx_CR1_BAUD_DIV2    (0x0U << SPIx_CR1_BAUD_Pos)
#define    SPIx_CR1_BAUD_DIV4    (0x1U << SPIx_CR1_BAUD_Pos)
#define    SPIx_CR1_BAUD_DIV8    (0x2U << SPIx_CR1_BAUD_Pos)
#define    SPIx_CR1_BAUD_DIV16    (0x3U << SPIx_CR1_BAUD_Pos)
#define    SPIx_CR1_BAUD_DIV32    (0x4U << SPIx_CR1_BAUD_Pos)
#define    SPIx_CR1_BAUD_DIV64    (0x5U << SPIx_CR1_BAUD_Pos)
#define    SPIx_CR1_BAUD_DIV128    (0x6U << SPIx_CR1_BAUD_Pos)
#define    SPIx_CR1_BAUD_DIV256    (0x7U << SPIx_CR1_BAUD_Pos)
 
#define    SPIx_CR1_LSBF_Pos    2    /* Ö¡¸ñʽ (LSB First)  0£ºÏÈ·¢ËÍMSB 1£ºÏÈ·¢ËÍLSB ×¢£ºµ±Í¨ÐÅÔÚ½øÐÐʱ²»Äܸıä¸ÃλµÄÖµ¡£ */
#define    SPIx_CR1_LSBF_Msk    (0x1U << SPIx_CR1_LSBF_Pos)
#define    SPIx_CR1_LSBF_MSB    (0x0U << SPIx_CR1_LSBF_Pos)
#define    SPIx_CR1_LSBF_LSB    (0x1U << SPIx_CR1_LSBF_Pos)
 
#define    SPIx_CR1_CPHOL_Pos    1
#define    SPIx_CR1_CPHOL_Msk    (0x1U << SPIx_CR1_CPHOL_Pos)
#define    SPIx_CR1_CPHOL_LOW    (0x0U << SPIx_CR1_CPHOL_Pos)
#define    SPIx_CR1_CPHOL_HIGH    (0x1U << SPIx_CR1_CPHOL_Pos)
 
#define    SPIx_CR1_CPHA_Pos    0    /* Ê±ÖÓÏàλѡÔñ (Clock Phase) 1£ºµÚ¶þ¸öʱÖÓ±ßÑØÊǵÚÒ»¸ö²¶×½±ßÑØ 0£ºµÚÒ»¸öʱÖÓ±ßÑØÊǵÚÒ»¸ö²¶×½±ßÑØ ×¢£ºµ±Í¨ÐÅÔÚ½øÐÐʱ²»Äܸıä¸ÃλµÄÖµ¡£ */
#define    SPIx_CR1_CPHA_Msk    (0x1U << SPIx_CR1_CPHA_Pos)
#define    SPIx_CR1_CPHA_1CLOCK    (0x0U << SPIx_CR1_CPHA_Pos)
#define    SPIx_CR1_CPHA_2CLOCK    (0x1U << SPIx_CR1_CPHA_Pos)
 
#define    SPIx_CR2_DUMMY_EN_Pos    15    /* 4Ïß°ëË«¹¤Ð­ÒéÏÂÊÇ·ñÔÚ¶Á²Ù×÷ÖвåÈëdummy cycle
(Dummy cycle Enable)
0£º²»²åÈëdummy cycle
1£ºÔÚ¶ÁÃüÁîÖ®ºó²åÈëÒ»¸ödummy cycle */
#define    SPIx_CR2_DUMMY_EN_Msk    (0x1U << SPIx_CR2_DUMMY_EN_Pos)
    /* ²»²åÈëdummy cycle */
    /* ÔÚ¶ÁÃüÁîÖ®ºó²åÈëÒ»¸ödummy cycle */
 
#define    SPIx_CR2_RXO_Pos    11    /* RXONLY¿ØÖÆÎ»£¬´Ë¼Ä´æÆ÷ÖÃλʱ£¬SPI¿ÉÒÔÁ¬Ðø½ÓÊÕ£¬ÎÞÐèÈí¼þдTXBUF (Receive Only mode)
1£ºÆô¶¯MasterµÄµ¥½ÓÊÕģʽ
0£º¹Ø±Õµ¥½ÓÊÕģʽ£¨ÊÕ·¢È«Ë«¹¤£© */
#define    SPIx_CR2_RXO_Msk    (0x1U << SPIx_CR2_RXO_Pos)
    /* Æô¶¯MasterµÄµ¥½ÓÊÕģʽ */
    /* ¹Ø±Õµ¥½ÓÊÕģʽ£¨ÊÕ·¢È«Ë«¹¤£© */
 
#define    SPIx_CR2_DLEN_Pos    9    /* Í¨ÐÅÊý¾Ý×Ö³¤ÅäÖà(Data Length)
00£º8bit
01£º16bit
10£º24bit
11£º32bit */
#define    SPIx_CR2_DLEN_Msk    (0x3U << SPIx_CR2_DLEN_Pos)
#define    SPIx_CR2_DLEN_8BIT    (0x0U << SPIx_CR2_DLEN_Pos)    /* 8bit */
#define    SPIx_CR2_DLEN_16BIT    (0x1U << SPIx_CR2_DLEN_Pos)    /* 16bit */
#define    SPIx_CR2_DLEN_24BIT    (0x2U << SPIx_CR2_DLEN_Pos)    /* 24bit */
#define    SPIx_CR2_DLEN_32BIT    (0x3U << SPIx_CR2_DLEN_Pos)    /* 32bit */
 
#define    SPIx_CR2_HALFDUPLEX_Pos    8    /* Í¨ÐÅģʽѡÔñ (Half-Duplex mode)
0£º±ê×¼SPIģʽ£¬4Ïßȫ˫¹¤
1£ºDCNģʽ£¬4Ïß°ëË«¹¤ */
#define    SPIx_CR2_HALFDUPLEX_Msk    (0x1U << SPIx_CR2_HALFDUPLEX_Pos)
#define    SPIx_CR2_HALFDUPLEX_SPI    (0x0U << SPIx_CR2_HALFDUPLEX_Pos)    /* ±ê×¼SPIģʽ£¬4Ïßȫ˫¹¤ */
#define    SPIx_CR2_HALFDUPLEX_DCN    (0x1U << SPIx_CR2_HALFDUPLEX_Pos)    /* DCNģʽ£¬4Ïß°ëË«¹¤ */
 
#define    SPIx_CR2_HD_RW_Pos    7    /* °ëË«¹¤Ä£Ê½ÏÂÖ÷»ú¶Áд²Ù×÷ÅäÖà(Read/Write config for Half-Duplex mode)
0£º4Ïß°ëË«¹¤Ð­ÒéÏÂÖ÷»úдÈë´Ó»ú
1£º4Ïß°ëË«¹¤Ð­ÒéÏÂÖ÷»ú¶ÁÈ¡´Ó»ú */
#define    SPIx_CR2_HD_RW_Msk    (0x1U << SPIx_CR2_HD_RW_Pos)
#define    SPIx_CR2_HD_RW_WRITE    (0x0U << SPIx_CR2_HD_RW_Pos)    /* 4Ïß°ëË«¹¤Ð­ÒéÏÂÖ÷»úдÈë´Ó»ú */
#define    SPIx_CR2_HD_RW_READ    (0x1U << SPIx_CR2_HD_RW_Pos)    /* 4Ïß°ëË«¹¤Ð­ÒéÏÂÖ÷»ú¶ÁÈ¡´Ó»ú */
 
#define    SPIx_CR2_CMD8b_Pos    6    /* °ëË«¹¤Ä£Ê½Ï¶¨ÒåcommandÖ¡³¤¶È (Command 8 bits)
1£ºcommandÖ¡¹Ì¶¨Îª8bit
0£ºcommandÖ¡³¤¶ÈÓÉDLEN¶¨Òå */
#define    SPIx_CR2_CMD8b_Msk    (0x1U << SPIx_CR2_CMD8b_Pos)
#define    SPIx_CR2_CMD8b_8BIT    (0x1U << SPIx_CR2_CMD8b_Pos)    /* commandÖ¡¹Ì¶¨Îª8bit */
#define    SPIx_CR2_CMD8b_DLEN    (0x0U << SPIx_CR2_CMD8b_Pos)    /* commandÖ¡³¤¶ÈÓÉDLEN¶¨Òå */
 
#define    SPIx_CR2_SSNM_Pos    5    /* MasterģʽÏÂSSN¿ØÖÆÄ£Ê½Ñ¡Ôñ (SSN mode)
1£ºÃ¿·¢ËÍÍêÒ»Ö¡ºóMasterÀ­¸ßSSN£¬Î¬³Ö¸ßµçƽʱ¼äÓÉWAIT¼Ä´æÆ÷¿ØÖÆ
0£ºÃ¿·¢ËÍÍêÒ»Ö¡ºóMaster±£³ÖSSNΪµÍ */
#define    SPIx_CR2_SSNM_Msk    (0x1U << SPIx_CR2_SSNM_Pos)
#define    SPIx_CR2_SSNM_HIGH    (0x1U << SPIx_CR2_SSNM_Pos)    /* Ã¿·¢ËÍÍêÒ»Ö¡ºóMasterÀ­¸ßSSN£¬Î¬³Ö¸ßµçƽʱ¼äÓÉWAIT¼Ä´æÆ÷¿ØÖÆ */
#define    SPIx_CR2_SSNM_LOW    (0x0U << SPIx_CR2_SSNM_Pos)    /* Ã¿·¢ËÍÍêÒ»Ö¡ºóMaster±£³ÖSSNΪµÍ */
 
#define    SPIx_CR2_TXO_AC_Pos    4    /* TXONLYÓ²¼þ×Ô¶¯Çå¿ÕµÄʹÄÜ (TXONLY auto-clear enable) 1£ºTXONLYÓ²¼þ×Ô¶¯ÇåÁãÓÐЧ£¬Èí¼þʹÄÜTXOºó£¬µÈ´ý·¢ËÍÍê±Ïºó£¬Ó²¼þÇåÁã 0£º¹Ø±ÕTXONLYÓ²¼þ×Ô¶¯ÇåÁã */
#define    SPIx_CR2_TXO_AC_Msk    (0x1U << SPIx_CR2_TXO_AC_Pos)
 
#define    SPIx_CR2_TXO_Pos    3    /* TXONLY¿ØÖÆÎ» (Transmit Only mode enable)
1£ºÆô¶¯MasterµÄµ¥·¢ËÍģʽ
0£º¹Ø±Õµ¥·¢ËÍģʽ£¨ÊÕ·¢È«Ë«¹¤£© */
#define    SPIx_CR2_TXO_Msk    (0x1U << SPIx_CR2_TXO_Pos)
    /* Æô¶¯MasterµÄµ¥·¢ËÍģʽ */
    /* ¹Ø±Õµ¥·¢ËÍģʽ£¨ÊÕ·¢È«Ë«¹¤£© */
 
#define    SPIx_CR2_SSN_Pos    2    /* MasterģʽÏ£¬Èç¹ûSSNSENΪ1£¬Èí¼þ¿ÉÒÔͨ¹ý´Ëλ¿ØÖÆSSNÊä³öµçƽ  1£ºSSNÊä³ö¸ßµçƽ
0£ºSSNÊä³öµÍµçƽ */
#define    SPIx_CR2_SSN_Msk    (0x1U << SPIx_CR2_SSN_Pos)
#define    SPIx_CR2_SSN_LOW    (0x0U << SPIx_CR2_SSN_Pos)    /* SSNÊä³ö¸ßµçƽ */
#define    SPIx_CR2_SSN_HIGH    (0x1U << SPIx_CR2_SSN_Pos)    /* SSNÊä³öµÍµçƽ */
 
#define    SPIx_CR2_SSNSEN_Pos    1    /* MasterģʽÏ£¬Èí¼þ¿ØÖÆSSNʹÄÜ (SSN Software Enable)
1£ºMasterģʽÏÂSSNÊä³öÓÉÈí¼þ¿ØÖÆ
0£ºMasterģʽÏÂSSNÊä³öÓÉÓ²¼þ×Ô¶¯¿ØÖÆ */
#define    SPIx_CR2_SSNSEN_Msk    (0x1U << SPIx_CR2_SSNSEN_Pos)
    /* MasterģʽÏÂSSNÊä³öÓÉÈí¼þ¿ØÖÆ */
    /* MasterģʽÏÂSSNÊä³öÓÉÓ²¼þ×Ô¶¯¿ØÖÆ */
 
#define    SPIx_CR2_SPIEN_Pos    0    /* SPIʹÄÜ (SPI enable) 1£ºÊ¹ÄÜSPI 0£º¹Ø±ÕSPI£¬Çå¿Õ·¢ËͽÓÊÕ»º´æ */
#define    SPIx_CR2_SPIEN_Msk    (0x1U << SPIx_CR2_SPIEN_Pos)
 
#define    SPIx_CR3_TXBFC_Pos    3    /* Transmit Buffer Clear£¬Èí¼þд1Çå³ý·¢ËÍ»º´æ£¬Ð´0ÎÞЧ */
#define    SPIx_CR3_TXBFC_Msk    (0x1U << SPIx_CR3_TXBFC_Pos)
 
#define    SPIx_CR3_RXBFC_Pos    2    /* Receive Buffer Clear£¬Èí¼þд1Çå³ý·¢ËÍ»º´æ£¬Ð´0ÎÞЧ */
#define    SPIx_CR3_RXBFC_Msk    (0x1U << SPIx_CR3_RXBFC_Pos)
 
#define    SPIx_CR3_MERRC_Pos    1    /* Master Error Clear£¬Èí¼þд1Çå³ýHSPISTA.MERR¼Ä´æÆ÷ */
#define    SPIx_CR3_MERRC_Msk    (0x1U << SPIx_CR3_MERRC_Pos)
 
#define    SPIx_CR3_SERRC_Pos    0    /* Slave Error Clear£¬Èí¼þд1Çå³ýHSPISTA.SERR¼Ä´æÆ÷ */
#define    SPIx_CR3_SERRC_Msk    (0x1U << SPIx_CR3_SERRC_Pos)
 
#define    SPIx_IER_ERRIE_Pos    2    /* SPI´íÎóÖжÏʹÄÜ (Error Interrupt Enable) */
#define    SPIx_IER_ERRIE_Msk    (0x1U << SPIx_IER_ERRIE_Pos)
 
#define    SPIx_IER_TXIE_Pos    1    /* ·¢ËÍÍê³ÉÖжÏʹÄÜ (Transmit Interrupt Enable) */
#define    SPIx_IER_TXIE_Msk    (0x1U << SPIx_IER_TXIE_Pos)
 
#define    SPIx_IER_RXIE_Pos    0    /* ½ÓÊÕÍê³ÉÖжÏʹÄÜ (Receive Interrupt Enable) */
#define    SPIx_IER_RXIE_Msk    (0x1U << SPIx_IER_RXIE_Pos)
 
#define    SPIx_ISR_DCN_TX_Pos    12    /* °ëË«¹¤Ä£Ê½Ï£¨HALFDUPLEX=1£©£¬ÅäÖÃÔÚÿ¸öÊý¾ÝÖ¡µÄ×îºóbit·¢Ë͵ÄDCNÐÅºÅµçÆ½ (Data/Command transmit config)
0£ºDCN=0£¬±íʾÃüÁîÖ¡
1£ºDCN=1£¬±íʾÊý¾ÝÖ¡
Èí¼þÓ¦ÔÚ·¢ËÍǰÉèÖÃDCN_TX¼Ä´æÆ÷£¬Èç¹ûDCN_TX=0£¬Ó²¼þÔÚÍê³ÉÒ»Ö¡·¢Ëͺó£¬×Ô¶¯½«DCN_TXÖÃ1£¬¼´Ä¬ÈÏÖ»»á·¢ËÍÒ»¸öÃüÁîÖ¡£¬ºóÐø¶¼ÊÇÊý¾ÝÖ¡¡£ */
#define    SPIx_ISR_DCN_TX_Msk    (0x1U << SPIx_ISR_DCN_TX_Pos)
#define    SPIx_ISR_DCN_TX_COMMAND    (0x0U << SPIx_ISR_DCN_TX_Pos)    /* DCN=0£¬±íʾÃüÁîÖ¡ */
#define    SPIx_ISR_DCN_TX_DATA    (0x1U << SPIx_ISR_DCN_TX_Pos)    /* DCN=1£¬±íʾÊý¾ÝÖ¡ */
 
#define    SPIx_ISR_RXCOL_Pos    10    /* ½ÓÊÕ»º´æÒç³ö£¬Èí¼þд1ÇåÁã (Receive Collision flag,write 1 to flag) */
#define    SPIx_ISR_RXCOL_Msk    (0x1U << SPIx_ISR_RXCOL_Pos)
 
#define    SPIx_ISR_TXCOL_Pos    9    /* ·¢ËÍ»º´æÒç³ö£¬Èí¼þд1ÇåÁã (Transmit Collision flag,write 1 to clear) */
#define    SPIx_ISR_TXCOL_Msk    (0x1U << SPIx_ISR_TXCOL_Pos)
 
#define    SPIx_ISR_BUSY_Pos    8    /* SPI¿ÕÏбêÖ¾£¬Ö»¶Á (busy flag)
1£ºSPI´«Êä½øÐÐÖÐ
0£ºSPI´«Êä¿ÕÏР*/
#define    SPIx_ISR_BUSY_Msk    (0x1U << SPIx_ISR_BUSY_Pos)
 
#define    SPIx_ISR_MERR_Pos    6    /* Master Error±êÖ¾(Master Error flag)
µ±MasterÏ´«ÊäδÂú8λSSN¾Í±»À­¸ßʱ£¬MERRÖÃλ */
#define    SPIx_ISR_MERR_Msk    (0x1U << SPIx_ISR_MERR_Pos)
 
#define    SPIx_ISR_SERR_Pos    5    /* Slave Error±êÖ¾(Slave Error flag)
µ±SlaveÏ´«ÊäδÂú8λSSN¾Í±»À­¸ßʱ£¬SERRÖÃλ */
#define    SPIx_ISR_SERR_Msk    (0x1U << SPIx_ISR_SERR_Pos)
 
#define    SPIx_ISR_TXBE_Pos    1    /* TX Buffer Empty±ê־λ(TX Buffer Empty flag)
1£º·¢ËÍ»º´æ¿Õ£¬Èí¼þдTXBUFÇåÁã
0£º·¢ËÍ»º´æÂú */
#define    SPIx_ISR_TXBE_Msk    (0x1U << SPIx_ISR_TXBE_Pos)
 
#define    SPIx_ISR_RXBF_Pos    0    /* RX Buffer Full±ê־λ(RX Buffer Full flag)
1£º½ÓÊÕ»º´æÂú£¬Èí¼þ¶ÁRXBUFÇåÁã
0£º½ÓÊÕ»º´æ¿Õ */
#define    SPIx_ISR_RXBF_Msk    (0x1U << SPIx_ISR_RXBF_Pos)
 
#define    SPIx_TXBUF_TXBUF_Pos    0    /* SPI·¢ËÍ»º´æ (Transmit Buffer) */
#define    SPIx_TXBUF_TXBUF_Msk    (0xffffffffU << SPIx_TXBUF_TXBUF_Pos)
 
#define    SPIx_RXBUF_RXBUF_Pos    0    /* SPI½ÓÊÕ»º´æ (Receive Buffer) */
#define    SPIx_RXBUF_RXBUF_Msk    (0xffffffffU << SPIx_RXBUF_RXBUF_Pos)
//Macro_End
 
/* Exported functions --------------------------------------------------------*/ 
extern void SPIx_Deinit(SPI_Type* SPIx);
 
/* MOSIºÍMISOÒý½Å½»»» (IO swapping)
0£ºÄ¬ÈÏÒý½Å˳Ðò
1£º½»»»Òý½Å˳Ðò Ïà¹Øº¯Êý */
extern void SPIx_CR1_IOSWAP_Set(SPI_Type* SPIx, uint32_t SetValue);
extern uint32_t SPIx_CR1_IOSWAP_Get(SPI_Type* SPIx);
 
/* Master Sampling Position Adjustment£¬Master¶ÔMISOÐźŵIJÉÑùλÖõ÷Õû£¬ÓÃÓÚ¸ßËÙͨÐÅʱ²¹³¥PCB×ßÏßÑÓ³Ù
1£º²ÉÑùµãÑÓ³Ù°ë¸öSCKÖÜÆÚ
0£º²»µ÷Õû Ïà¹Øº¯Êý */
extern void SPIx_CR1_MSPA_Set(SPI_Type* SPIx, uint32_t SetValue);
extern uint32_t SPIx_CR1_MSPA_Get(SPI_Type* SPIx);
 
/* Slave Sending Position Adjustment£¬Slave MISO·¢ËÍλÖõ÷Õû
1£ºÌáǰ°ë¸öSCKÖÜÆÚ·¢ËÍ
0£º²»µ÷Õû Ïà¹Øº¯Êý */
extern void SPIx_CR1_SSPA_Set(SPI_Type* SPIx, uint32_t SetValue);
extern uint32_t SPIx_CR1_SSPA_Get(SPI_Type* SPIx);
 
/* Master/SlaveģʽѡÔñ¡£(Master Mode) 1£ºMasterģʽ 0£ºSlaveģʽ Ïà¹Øº¯Êý */
extern void SPIx_CR1_MM_Set(SPI_Type* SPIx, uint32_t SetValue);
extern uint32_t SPIx_CR1_MM_Get(SPI_Type* SPIx);
 
/* MasterģʽÏ£¬Ã¿·¢ËÍÍêÒ»Ö¡ºó¼ÓÈëÖÁÉÙ(1+WAIT)¸öSCK cycleµÈ´ýʱ¼ä£¬ÔÙ´«ÊäÏÂÒ»Ö¡µÄÊý¾Ý¡£Èç¹ûSSNÓÉÓ²¼þ¿ØÖÆ£¬²¢ÇÒSSNM=1£¬ÔòÓ²¼þ»á×Ô¶¯À­¸ßSSN¡£ Ïà¹Øº¯Êý */
extern void SPIx_CR1_WAIT_Set(SPI_Type* SPIx, uint32_t SetValue);
extern uint32_t SPIx_CR1_WAIT_Get(SPI_Type* SPIx);
 
/* Masterģʽ²¨ÌØÂÊÅäÖÃλ: (Baud rate) 000£º fAPBCLK/2 001£º fAPBCLK/4 010£º fAPBCLK/8 011£º fAPBCLK/16 100£º fAPBCLK/32 101£º fAPBCLK/64 110£º fAPBCLK/128 111£º fAPBCLK/256 µ±Í¨ÐÅÕýÔÚ½øÐеÄʱºò£¬²»ÄÜÐÞ¸ÄÕâЩλ¡£ Ïà¹Øº¯Êý */
extern void SPIx_CR1_BAUD_Set(SPI_Type* SPIx, uint32_t SetValue);
extern uint32_t SPIx_CR1_BAUD_Get(SPI_Type* SPIx);
 
/* Ö¡¸ñʽ (LSB First)  0£ºÏÈ·¢ËÍMSB 1£ºÏÈ·¢ËÍLSB ×¢£ºµ±Í¨ÐÅÔÚ½øÐÐʱ²»Äܸıä¸ÃλµÄÖµ¡£ Ïà¹Øº¯Êý */
extern void SPIx_CR1_LSBF_Set(SPI_Type* SPIx, uint32_t SetValue);
extern uint32_t SPIx_CR1_LSBF_Get(SPI_Type* SPIx);
extern void SPIx_CR1_CPHOL_Set(SPI_Type* SPIx, uint32_t SetValue);
extern uint32_t SPIx_CR1_CPHOL_Get(SPI_Type* SPIx);
 
/* Ê±ÖÓÏàλѡÔñ (Clock Phase) 1£ºµÚ¶þ¸öʱÖÓ±ßÑØÊǵÚÒ»¸ö²¶×½±ßÑØ 0£ºµÚÒ»¸öʱÖÓ±ßÑØÊǵÚÒ»¸ö²¶×½±ßÑØ ×¢£ºµ±Í¨ÐÅÔÚ½øÐÐʱ²»Äܸıä¸ÃλµÄÖµ¡£ Ïà¹Øº¯Êý */
extern void SPIx_CR1_CPHA_Set(SPI_Type* SPIx, uint32_t SetValue);
extern uint32_t SPIx_CR1_CPHA_Get(SPI_Type* SPIx);
 
/* 4Ïß°ëË«¹¤Ð­ÒéÏÂÊÇ·ñÔÚ¶Á²Ù×÷ÖвåÈëdummy cycle
(Dummy cycle Enable)
0£º²»²åÈëdummy cycle
1£ºÔÚ¶ÁÃüÁîÖ®ºó²åÈëÒ»¸ödummy cycle Ïà¹Øº¯Êý */
extern void SPIx_CR2_DUMMY_EN_Setable(SPI_Type* SPIx, FunState NewState);
extern FunState SPIx_CR2_DUMMY_EN_Getable(SPI_Type* SPIx);
 
/* RXONLY¿ØÖÆÎ»£¬´Ë¼Ä´æÆ÷ÖÃλʱ£¬SPI¿ÉÒÔÁ¬Ðø½ÓÊÕ£¬ÎÞÐèÈí¼þдTXBUF (Receive Only mode)
1£ºÆô¶¯MasterµÄµ¥½ÓÊÕģʽ
0£º¹Ø±Õµ¥½ÓÊÕģʽ£¨ÊÕ·¢È«Ë«¹¤£© Ïà¹Øº¯Êý */
extern void SPIx_CR2_RXO_Setable(SPI_Type* SPIx, FunState NewState);
extern FunState SPIx_CR2_RXO_Getable(SPI_Type* SPIx);
 
/* Í¨ÐÅÊý¾Ý×Ö³¤ÅäÖà(Data Length)
00£º8bit
01£º16bit
10£º24bit
11£º32bit Ïà¹Øº¯Êý */
extern void SPIx_CR2_DLEN_Set(SPI_Type* SPIx, uint32_t SetValue);
extern uint32_t SPIx_CR2_DLEN_Get(SPI_Type* SPIx);
 
/* Í¨ÐÅģʽѡÔñ (Half-Duplex mode)
0£º±ê×¼SPIģʽ£¬4Ïßȫ˫¹¤
1£ºDCNģʽ£¬4Ïß°ëË«¹¤ Ïà¹Øº¯Êý */
extern void SPIx_CR2_HALFDUPLEX_Set(SPI_Type* SPIx, uint32_t SetValue);
extern uint32_t SPIx_CR2_HALFDUPLEX_Get(SPI_Type* SPIx);
 
/* °ëË«¹¤Ä£Ê½ÏÂÖ÷»ú¶Áд²Ù×÷ÅäÖà(Read/Write config for Half-Duplex mode)
0£º4Ïß°ëË«¹¤Ð­ÒéÏÂÖ÷»úдÈë´Ó»ú
1£º4Ïß°ëË«¹¤Ð­ÒéÏÂÖ÷»ú¶ÁÈ¡´Ó»ú Ïà¹Øº¯Êý */
extern void SPIx_CR2_HD_RW_Set(SPI_Type* SPIx, uint32_t SetValue);
extern uint32_t SPIx_CR2_HD_RW_Get(SPI_Type* SPIx);
 
/* °ëË«¹¤Ä£Ê½Ï¶¨ÒåcommandÖ¡³¤¶È (Command 8 bits)
1£ºcommandÖ¡¹Ì¶¨Îª8bit
0£ºcommandÖ¡³¤¶ÈÓÉDLEN¶¨Òå Ïà¹Øº¯Êý */
extern void SPIx_CR2_CMD8b_Set(SPI_Type* SPIx, uint32_t SetValue);
extern uint32_t SPIx_CR2_CMD8b_Get(SPI_Type* SPIx);
 
/* MasterģʽÏÂSSN¿ØÖÆÄ£Ê½Ñ¡Ôñ (SSN mode)
1£ºÃ¿·¢ËÍÍêÒ»Ö¡ºóMasterÀ­¸ßSSN£¬Î¬³Ö¸ßµçƽʱ¼äÓÉWAIT¼Ä´æÆ÷¿ØÖÆ
0£ºÃ¿·¢ËÍÍêÒ»Ö¡ºóMaster±£³ÖSSNΪµÍ Ïà¹Øº¯Êý */
extern void SPIx_CR2_SSNM_Set(SPI_Type* SPIx, uint32_t SetValue);
extern uint32_t SPIx_CR2_SSNM_Get(SPI_Type* SPIx);
 
/* TXONLYÓ²¼þ×Ô¶¯Çå¿ÕµÄʹÄÜ (TXONLY auto-clear enable) 1£ºTXONLYÓ²¼þ×Ô¶¯ÇåÁãÓÐЧ£¬Èí¼þʹÄÜTXOºó£¬µÈ´ý·¢ËÍÍê±Ïºó£¬Ó²¼þÇåÁã 0£º¹Ø±ÕTXONLYÓ²¼þ×Ô¶¯ÇåÁã Ïà¹Øº¯Êý */
extern void SPIx_CR2_TXO_AC_Setable(SPI_Type* SPIx, FunState NewState);
extern FunState SPIx_CR2_TXO_AC_Getable(SPI_Type* SPIx);
 
/* TXONLY¿ØÖÆÎ» (Transmit Only mode enable)
1£ºÆô¶¯MasterµÄµ¥·¢ËÍģʽ
0£º¹Ø±Õµ¥·¢ËÍģʽ£¨ÊÕ·¢È«Ë«¹¤£© Ïà¹Øº¯Êý */
extern void SPIx_CR2_TXO_Setable(SPI_Type* SPIx, FunState NewState);
extern FunState SPIx_CR2_TXO_Getable(SPI_Type* SPIx);
 
/* MasterģʽÏ£¬Èç¹ûSSNSENΪ1£¬Èí¼þ¿ÉÒÔͨ¹ý´Ëλ¿ØÖÆSSNÊä³öµçƽ  1£ºSSNÊä³ö¸ßµçƽ
0£ºSSNÊä³öµÍµçƽ Ïà¹Øº¯Êý */
extern void SPIx_CR2_SSN_Set(SPI_Type* SPIx, uint32_t SetValue);
extern uint32_t SPIx_CR2_SSN_Get(SPI_Type* SPIx);
 
/* MasterģʽÏ£¬Èí¼þ¿ØÖÆSSNʹÄÜ (SSN Software Enable)
1£ºMasterģʽÏÂSSNÊä³öÓÉÈí¼þ¿ØÖÆ
0£ºMasterģʽÏÂSSNÊä³öÓÉÓ²¼þ×Ô¶¯¿ØÖÆ Ïà¹Øº¯Êý */
extern void SPIx_CR2_SSNSEN_Setable(SPI_Type* SPIx, FunState NewState);
extern FunState SPIx_CR2_SSNSEN_Getable(SPI_Type* SPIx);
 
/* SPIʹÄÜ (SPI enable) 1£ºÊ¹ÄÜSPI 0£º¹Ø±ÕSPI£¬Çå¿Õ·¢ËͽÓÊÕ»º´æ Ïà¹Øº¯Êý */
extern void SPIx_CR2_SPIEN_Setable(SPI_Type* SPIx, FunState NewState);
extern FunState SPIx_CR2_SPIEN_Getable(SPI_Type* SPIx);
 
/* Transmit Buffer Clear£¬Èí¼þд1Çå³ý·¢ËÍ»º´æ£¬Ð´0ÎÞЧ Ïà¹Øº¯Êý */
extern void SPIx_CR3_TXBFC_Clr(SPI_Type* SPIx);
 
/* Receive Buffer Clear£¬Èí¼þд1Çå³ý·¢ËÍ»º´æ£¬Ð´0ÎÞЧ Ïà¹Øº¯Êý */
extern void SPIx_CR3_RXBFC_Clr(SPI_Type* SPIx);
 
/* Master Error Clear£¬Èí¼þд1Çå³ýHSPISTA.MERR¼Ä´æÆ÷ Ïà¹Øº¯Êý */
extern void SPIx_CR3_MERRC_Clr(SPI_Type* SPIx);
 
/* Slave Error Clear£¬Èí¼þд1Çå³ýHSPISTA.SERR¼Ä´æÆ÷ Ïà¹Øº¯Êý */
extern void SPIx_CR3_SERRC_Clr(SPI_Type* SPIx);
 
/* SPI´íÎóÖжÏʹÄÜ (Error Interrupt Enable) Ïà¹Øº¯Êý */
extern void SPIx_IER_ERRIE_Setable(SPI_Type* SPIx, FunState NewState);
extern FunState SPIx_IER_ERRIE_Getable(SPI_Type* SPIx);
 
/* ·¢ËÍÍê³ÉÖжÏʹÄÜ (Transmit Interrupt Enable) Ïà¹Øº¯Êý */
extern void SPIx_IER_TXIE_Setable(SPI_Type* SPIx, FunState NewState);
extern FunState SPIx_IER_TXIE_Getable(SPI_Type* SPIx);
 
/* ½ÓÊÕÍê³ÉÖжÏʹÄÜ (Receive Interrupt Enable) Ïà¹Øº¯Êý */
extern void SPIx_IER_RXIE_Setable(SPI_Type* SPIx, FunState NewState);
extern FunState SPIx_IER_RXIE_Getable(SPI_Type* SPIx);
 
/* °ëË«¹¤Ä£Ê½Ï£¨HALFDUPLEX=1£©£¬ÅäÖÃÔÚÿ¸öÊý¾ÝÖ¡µÄ×îºóbit·¢Ë͵ÄDCNÐÅºÅµçÆ½ (Data/Command transmit config)
0£ºDCN=0£¬±íʾÃüÁîÖ¡
1£ºDCN=1£¬±íʾÊý¾ÝÖ¡
Èí¼þÓ¦ÔÚ·¢ËÍǰÉèÖÃDCN_TX¼Ä´æÆ÷£¬Èç¹ûDCN_TX=0£¬Ó²¼þÔÚÍê³ÉÒ»Ö¡·¢Ëͺó£¬×Ô¶¯½«DCN_TXÖÃ1£¬¼´Ä¬ÈÏÖ»»á·¢ËÍÒ»¸öÃüÁîÖ¡£¬ºóÐø¶¼ÊÇÊý¾ÝÖ¡¡£ Ïà¹Øº¯Êý */
extern void SPIx_ISR_DCN_TX_Set(SPI_Type* SPIx, uint32_t SetValue);
extern uint32_t SPIx_ISR_DCN_TX_Get(SPI_Type* SPIx);
 
/* ½ÓÊÕ»º´æÒç³ö£¬Èí¼þд1ÇåÁã (Receive Collision flag,write 1 to flag) Ïà¹Øº¯Êý */
extern void SPIx_ISR_RXCOL_Clr(SPI_Type* SPIx);
extern FlagStatus SPIx_ISR_RXCOL_Chk(SPI_Type* SPIx);
 
/* ·¢ËÍ»º´æÒç³ö£¬Èí¼þд1ÇåÁã (Transmit Collision flag,write 1 to clear) Ïà¹Øº¯Êý */
extern void SPIx_ISR_TXCOL_Clr(SPI_Type* SPIx);
extern FlagStatus SPIx_ISR_TXCOL_Chk(SPI_Type* SPIx);
 
/* SPI¿ÕÏбêÖ¾£¬Ö»¶Á (busy flag)
1£ºSPI´«Êä½øÐÐÖÐ
0£ºSPI´«Êä¿ÕÏРÏà¹Øº¯Êý */
extern FlagStatus SPIx_ISR_BUSY_Chk(SPI_Type* SPIx);
 
/* Master Error±êÖ¾(Master Error flag)
µ±MasterÏ´«ÊäδÂú8λSSN¾Í±»À­¸ßʱ£¬MERRÖÃλ Ïà¹Øº¯Êý */
extern FlagStatus SPIx_ISR_MERR_Chk(SPI_Type* SPIx);
 
/* Slave Error±êÖ¾(Slave Error flag)
µ±SlaveÏ´«ÊäδÂú8λSSN¾Í±»À­¸ßʱ£¬SERRÖÃλ Ïà¹Øº¯Êý */
extern FlagStatus SPIx_ISR_SERR_Chk(SPI_Type* SPIx);
 
/* TX Buffer Empty±ê־λ(TX Buffer Empty flag)
1£º·¢ËÍ»º´æ¿Õ£¬Èí¼þдTXBUFÇåÁã
0£º·¢ËÍ»º´æÂú Ïà¹Øº¯Êý */
extern FlagStatus SPIx_ISR_TXBE_Chk(SPI_Type* SPIx);
 
/* RX Buffer Full±ê־λ(RX Buffer Full flag)
1£º½ÓÊÕ»º´æÂú£¬Èí¼þ¶ÁRXBUFÇåÁã
0£º½ÓÊÕ»º´æ¿Õ Ïà¹Øº¯Êý */
extern FlagStatus SPIx_ISR_RXBF_Chk(SPI_Type* SPIx);
 
/* SPI·¢ËÍ»º´æ (Transmit Buffer) Ïà¹Øº¯Êý */
extern void SPIx_TXBUF_Write(SPI_Type* SPIx, uint32_t SetValue);
 
/* SPI½ÓÊÕ»º´æ (Receive Buffer) Ïà¹Øº¯Êý */
extern uint32_t SPIx_RXBUF_Read(SPI_Type* SPIx);
//Announce_End
 
void SPIx_Deinit(SPI_Type* SPIx);
void SPI_SSN_Set_Low(SPI_Type* SPIx);
void SPI_SSN_Set_High(SPI_Type* SPIx);
uint8_t SPI_RW_Byte(SPI_Type* SPIx, uint8_t data);
 
#ifdef __cplusplus
}
#endif
 
#endif /*__FM33A0XXEV_SPI_H */