tao_z
2021-04-11 6d4ddf7d2a2cd72c58876257700b34c63e5063d3
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
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
/**
  ******************************************************************************
  * @file    stm8s_can.h
  * @author  MCD Application Team
  * @version V2.2.0
  * @date    30-September-2014
  * @brief   This file contains all the functions for the CAN peripheral.
   ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; COPYRIGHT 2014 STMicroelectronics</center></h2>
  *
  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
  * You may not use this file except in compliance with the License.
  * You may obtain a copy of the License at:
  *
  *        http://www.st.com/software_license_agreement_liberty_v2
  *
  * Unless required by applicable law or agreed to in writing, software 
  * distributed under the License is distributed on an "AS IS" BASIS, 
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  *
  ******************************************************************************
  */
 
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __STM8S_CAN_H
#define __STM8S_CAN_H
 
/* Includes ------------------------------------------------------------------*/
#include "stm8s.h"
 
/* Exported constants --------------------------------------------------------*/
#define CAN_STDID_SIZE ((uint16_t)0x07FF)
#define CAN_EXTID_SIZE ((uint32_t)0x1FFFFFFF)
#define CAN_DLC_MAX ((uint8_t)0x08)
 
 
/** @addtogroup CAN_Exported_Types
  * @{
  */
 
 
/**
  * @brief  CAN Page Mapping
 */
typedef enum
{
 CAN_Page_TxMailBox0  = ((uint8_t) 0), /*!< CAN TX mailbox 0 reg page */
 CAN_Page_TxMailBox1  = ((uint8_t) 1), /*!< CAN TX mailbox 1 reg page */
 CAN_Page_TxMailBox2  = ((uint8_t) 5), /*!< CAN TX mailbox 2 reg page */
 CAN_Page_Filter01    = ((uint8_t) 2), /*!< CAN Filters 0 & 1 reg page*/
 CAN_Page_Filter23    = ((uint8_t) 3), /*!< CAN Filters 2 & 3 reg page*/
 CAN_Page_Filter45    = ((uint8_t) 4), /*!< CAN Filters 4 & 5 reg page*/
 CAN_Page_Config      = ((uint8_t) 6), /*!< CAN Configuration control/status reg page*/
 CAN_Page_RxFifo      = ((uint8_t) 7) /*!< CAN RX FIFO registers page */
}CAN_Page_TypeDef;
 
 
 
/**
  * @brief   CAN sleep constants 
 */
typedef enum {
  CAN_InitStatus_Failed =0,                        /*!< CAN initialization failed */
  CAN_InitStatus_Success =! CAN_InitStatus_Failed  /*!< CAN initialization OK*/
} CAN_InitStatus_TypeDef;
 
 
 /**
  * @brief  CAN operating mode */
 typedef enum
{
  CAN_OperatingMode_Initialization    =((uint8_t)0x00),    /*!< Initialization mode */
  CAN_OperatingMode_Normal            =((uint8_t)0x01),    /*!< Normal mode */
  CAN_OperatingMode_Sleep             =((uint8_t)0x02)    /*!< sleep mode */
}CAN_OperatingMode_TypeDef;
 
 /**
  * @brief  CAN operating mode status */
 typedef enum
{
  CAN_ModeStatus_Failed    = ((uint8_t)0x00),          /*!< CAN entering the specific mode failed */
  CAN_ModeStatus_Success    =! CAN_ModeStatus_Failed   /*!< CAN entering the specific mode Succeed */
}CAN_ModeStatus_TypeDef;
 
 /**
  * @brief   CAN Time Triggered Communication mode 
  */
typedef enum
{
 CAN_MasterCtrl_AllDisabled          =((uint8_t)0x00),  /*!<  CAN  ALL Master Control Option are DISABLED */
 CAN_MasterCtrl_AllEnabled           =((uint8_t)0xFC),  /*!<  CAN  ALL Master Control Option are DISABLED */
 CAN_MasterCtrl_TimeTriggerCOMMode   =((uint8_t)0x80),  /*!<  CAN Time Triggered Communication mode ENABLED */
 CAN_MasterCtrl_AutoBusOffManagement =((uint8_t)0x40),  /*!<  CAN Auto Bus Off Management ENABLED */
 CAN_MasterCtrl_AutoWakeUpMode       =((uint8_t)0x20),  /*!<  CAN Automatic WakeUp Mode ENABLED , sleep mode is left automatically by hardware  */
 CAN_MasterCtrl_NoAutoReTx           =((uint8_t)0x10),  /*!<  CAN Non Automatic Retransmission ENABLED, MSG  will be transmitted only once */
 CAN_MasterCtrl_RxFifoLockedMode     =((uint8_t)0x08),  /*!<  CAN Receive FIFO Locked  against overrun ENABLED */
 CAN_MasterCtrl_TxFifoPriority       =((uint8_t)0x04)   /*!<  CAN Transmit FIFO Priority  driven by the request order (not by the identifier of the MSG) */
 }CAN_MasterCtrl_TypeDef;
 
/**
  * @brief   CAN  mode options */
typedef enum
{
  CAN_Mode_Normal             =((uint8_t)0x00),  /*!< normal mode */
  CAN_Mode_LoopBack           =((uint8_t)0x01),  /*!< loopback mode */
  CAN_Mode_Silent             =((uint8_t)0x02),  /*!< silent mode */
  CAN_Mode_Silent_LoopBack    =((uint8_t)0x03)  /*!< loopback combined with silent mode */
}CAN_Mode_TypeDef;
 
/**
  * @brief  CAN synchronisation jump width (SJW)*/
typedef enum
{
  CAN_SynJumpWidth_1TimeQuantum                 =((uint8_t)0x00),  /*!< 1 time quantum */
  CAN_SynJumpWidth_2TimeQuantum                 =((uint8_t)0x40),  /*!< 2 time quantum */
  CAN_SynJumpWidth_3TimeQuantum                 =((uint8_t)0x80),  /*!< 3 time quantum */
  CAN_SynJumpWidth_4TimeQuantum                 =((uint8_t)0xC0)  /*!< 4 time quantum */
}CAN_SynJumpWidth_TypeDef;
 
/**
  * @brief   time quantum in bit segment 1 */
typedef enum
{
  CAN_BitSeg1_1TimeQuantum                 =((uint8_t)0x00),  /*!< 1 time quantum */
  CAN_BitSeg1_2TimeQuantum                 =((uint8_t)0x01),  /*!< 2 time quantum */
  CAN_BitSeg1_3TimeQuantum                 =((uint8_t)0x02),  /*!< 3 time quantum */
  CAN_BitSeg1_4TimeQuantum                 =((uint8_t)0x03) , /*!< 4 time quantum */
  CAN_BitSeg1_5TimeQuantum                 =((uint8_t)0x04) , /*!< 5 time quantum */
  CAN_BitSeg1_6TimeQuantum                 =((uint8_t)0x05) , /*!< 6 time quantum */
  CAN_BitSeg1_7TimeQuantum                 =((uint8_t)0x06) , /*!< 7 time quantum */
  CAN_BitSeg1_8TimeQuantum                 =((uint8_t)0x07),  /*!< 8 time quantum */
  CAN_BitSeg1_9TimeQuantum                 =((uint8_t)0x08),  /*!< 9 time quantum */
  CAN_BitSeg1_10TimeQuantum                =((uint8_t)0x09),  /*!< 10 time quantum */
  CAN_BitSeg1_11TimeQuantum                =((uint8_t)0x0A),  /*!< 11 time quantum */
  CAN_BitSeg1_12TimeQuantum                =((uint8_t)0x0B),  /*!< 12 time quantum */
  CAN_BitSeg1_13TimeQuantum                =((uint8_t)0x0C),  /*!< 13 time quantum */
  CAN_BitSeg1_14TimeQuantum                =((uint8_t)0x0D),  /*!< 14 time quantum */
  CAN_BitSeg1_15TimeQuantum                =((uint8_t)0x0E),  /*!< 15 time quantum */
  CAN_BitSeg1_16TimeQuantum                =((uint8_t)0x0F)  /*!< 16 time quantum */
}CAN_BitSeg1_TypeDef;
 
/**
  * @brief   time quantum in bit segment 2 */
typedef enum
{
  CAN_BitSeg2_1TimeQuantum                = ((uint8_t)0x00),  /*!< 1 time quantum */
  CAN_BitSeg2_2TimeQuantum                = ((uint8_t)0x10),  /*!< 2 time quantum */
  CAN_BitSeg2_3TimeQuantum                = ((uint8_t)0x20),  /*!< 3 time quantum */
  CAN_BitSeg2_4TimeQuantum                = ((uint8_t)0x30),  /*!< 4 time quantum */
  CAN_BitSeg2_5TimeQuantum                = ((uint8_t)0x40),  /*!< 5 time quantum */
  CAN_BitSeg2_6TimeQuantum                = ((uint8_t)0x50),  /*!< 6 time quantum */
  CAN_BitSeg2_7TimeQuantum                = ((uint8_t)0x60),  /*!< 7 time quantum */
  CAN_BitSeg2_8TimeQuantum                = ((uint8_t)0x70)   /*!< 8 time quantum */
}CAN_BitSeg2_TypeDef;
 
 
/**
  * @brief   CAN filter number */
typedef enum
{                                                                  
  CAN_FilterNumber_0                = ((uint8_t)0x00),  /*!< Filter number 0 */ 
  CAN_FilterNumber_1                = ((uint8_t)0x01),  /*!< Filter number 1 */ 
  CAN_FilterNumber_2                = ((uint8_t)0x02),  /*!< Filter number 2 */
  CAN_FilterNumber_3                = ((uint8_t)0x03),  /*!< Filter number 3 */
  CAN_FilterNumber_4                = ((uint8_t)0x04),  /*!< Filter number 4 */ 
  CAN_FilterNumber_5                = ((uint8_t)0x05)   /*!< Filter number 5 */ 
}CAN_FilterNumber_TypeDef;
 
/**
  * @brief   CAN filter mode */
typedef enum
{
  CAN_FilterMode_IdMask                  =  ((uint8_t)0x00),    /*!< id/mask mode */
  CAN_FilterMode_IdMask_IdList           =  ((uint8_t)0x10),    /*!< Id/Mask mode First and IdList mode second */
  CAN_FilterMode_IdList_IdMask           =  ((uint8_t)0x11),    /*!< IdList mode First and IdMask mode second */
  CAN_FilterMode_IdList                  =  ((uint8_t)0x01)     /*!< identifier list mode */
}CAN_FilterMode_TypeDef;
 
/**
  * @brief   CAN filter scale */
typedef enum
{
  CAN_FilterScale_8Bit       =((uint8_t)0x00), /*!< 8-bit filter scale */
  CAN_FilterScale_16_8Bit    =((uint8_t)0x02), /*!< 16/8-bit filter scale */
  CAN_FilterScale_16Bit      =((uint8_t)0x04), /*!< 16-bit filter scale */
  CAN_FilterScale_32Bit      =((uint8_t)0x06)  /*!< 32-bit filter scale */
}CAN_FilterScale_TypeDef;
 
 
/**
  * @brief   CAN Tx mailboxes*/
typedef enum
{
 CAN_TransmitMailBox_0       = ((uint8_t) 0x00),  /*!< CAN TX mailbox 0 reg page */
 CAN_TransmitMailBox_1       = ((uint8_t) 0x01),  /*!< CAN TX mailbox 1 reg page */
 CAN_TransmitMailBox_2       = ((uint8_t) 0x05)   /*!< CAN TX mailbox 2 reg page */
}CAN_TransmitMailBox_TypeDef;
 
/**
  * @brief   CAN Pending Messages number*/
typedef enum
{
  CAN_NbrPendingMessage_0     =  ((uint8_t)0x00),  /*!< No Msg Pending */
  CAN_NbrPendingMessage_1     =  ((uint8_t)0x01),  /*!< 1 Msg Pending */
  CAN_NbrPendingMessage_2     =  ((uint8_t)0x02),  /*!< 2 Msg Pending */
  CAN_NbrPendingMessage_3     =  ((uint8_t)0x03)  /*!< 3 Msg Pending */
}CAN_NbrPendingMessage_TypeDef;
 
/**
  * @brief   CAN identifier type */
typedef enum
{
  CAN_Id_Standard                 =((uint8_t)0x00),  /*!< Standard Id */
  CAN_Id_Extended                 =((uint8_t)0x40)  /*!< Extended Id */
}CAN_Id_TypeDef;
 
/**
  * @brief   CAN remote transmission request */
typedef enum
{
  CAN_RTR_Data               = ((uint8_t)0x00),  /*!< Data frame */
  CAN_RTR_Remote             = ((uint8_t)0x20)  /*!< Remote frame */
}CAN_RTR_TypeDef;
 
/**
  * @brief   CAN transmit Status */
typedef enum
{
  CAN_TxStatus_Failed                 =((uint8_t)0xF0), /*!< CAN transmission failed */
  CAN_TxStatus_Ok                     =((uint8_t)0xF1), /*!< CAN transmission succeeded */
  CAN_TxStatus_Pending                =((uint8_t)0xF2), /*!< CAN transmission pending */
  CAN_TxStatus_NoMailBox              =((uint8_t)0xF4), /*!< CAN cell did not provide an empty mailbox */
  CAN_TxStatus_MailBoxEmpty           =((uint8_t)0xF5), /*!< CAN Tx mailbox is Empty */
  CAN_TxStatus_MailBox0Ok             =((uint8_t)0x00), /*!< CAN transmission succeeded by mail box 1*/
  CAN_TxStatus_MailBox1Ok             =((uint8_t)0x01), /*!< CAN transmission succeeded by mail box 2*/
  CAN_TxStatus_MailBox2Ok             =((uint8_t)0x05) /*!< CAN transmission succeeded by mail box 3*/
}CAN_TxStatus_TypeDef;
 
/**
  * @brief   CAN sleep Status */
typedef enum
{
  CAN_Sleep_Failed             = ((uint8_t)0x00), /*!< CAN did not enter the sleep mode */
  CAN_Sleep_Ok                 = ((uint8_t)0x01) /*!< CAN entered the sleep mode */
}CAN_Sleep_TypeDef;
/**
  * @brief   CAN wake up status */
typedef enum
{
 CAN_WakeUp_Failed          =   ((uint8_t)0x00), /*!< CAN did not leave the sleep mode */
 CAN_WakeUp_Ok              =   ((uint8_t)0x01) /*!< CAN leaved the sleep mode */
}CAN_WakeUp_TypeDef;
 
/**
  * @brief   CAN flags */
typedef enum
{
  /* if the flag is 0x3XXX, it means that it can be got (CAN_GetFlagStatus) and Cleared (CAN_ClearFlag) */
  /* if the flag is 0x1XXX, it means that it can only be got (CAN_GetFlagStatus)  */
  /*Transmit Flags*/
  CAN_FLAG_RQCP0            =((uint16_t)0x3401), /*!< Request MailBox0  Flag */
  CAN_FLAG_RQCP1            =((uint16_t)0x3402), /*!< Request MailBox1  Flag */
  CAN_FLAG_RQCP2            =((uint16_t)0x3404), /*!< Request MailBox2  Flag */
  /*Receive Flags*/
  CAN_FLAG_FMP              =((uint16_t)0x1203), /*!< FIFO Message Pending Flag */
  CAN_FLAG_FF               =((uint16_t)0x3208), /*!< FIFO Full  Flag */
  CAN_FLAG_FOV              =((uint16_t)0x3210), /*!< FIFO Overrun  Flag */
  /*Wake up Flag*/
  CAN_FLAG_WKU              =((uint16_t)0x3108), /*!< wake up   Flag */
  /*Error Flags*/
  CAN_FLAG_EWG              =((uint16_t)0x1001), /*!< Error Warning Flag */
  CAN_FLAG_EPV              =((uint16_t)0x1002), /*!< Error Passive Flag */
  CAN_FLAG_BOF              =((uint16_t)0x1004), /*!< Bus-Off Flag */
  CAN_FLAG_LEC              =((uint16_t)0x3070) /*!< Last error code Flag */
}CAN_FLAG_TypeDef;
 
/**
  * @brief   CAN interrupts */
typedef enum
{
  /*Transmit Interruption*/
  CAN_IT_TME                  =((uint16_t)0x0001), /*!< Transmit mailbox empty interrupt */
  /*Receive Interruptions*/
  CAN_IT_FMP                  =((uint16_t)0x0002), /*!< FIFO  message pending interrupt   */  
  CAN_IT_FF                   =((uint16_t)0x0004), /*!< FIFO  full    interrupt                    */
  CAN_IT_FOV                  =((uint16_t)0x0008), /*!< FIFO  overrun  interrupt               */
  /*Wake Up Interruption*/
  CAN_IT_WKU                  =((uint16_t)0x0080), /*!< Wake-up interrupt                         */
  /*Error Interruptions*/
  CAN_IT_ERR                  =((uint16_t)0x4000), /*!< Genaral Error interrupt                 */
  CAN_IT_EWG                  =((uint16_t)0x0100), /*!< Error warning interrupt                */
  CAN_IT_EPV                  =((uint16_t)0x0200), /*!< Error passive  interrupt                */
  CAN_IT_BOF                  =((uint16_t)0x0400), /*!< Bus-off   interrupt                        */
  CAN_IT_LEC                  =((uint16_t)0x0800)  /*!< Last error code interrupt              */
} CAN_IT_TypeDef;
 
/**
  * @brief   CAN ST7 Compatibility*/
typedef enum
{
  CAN_ST7Compatibility_Enable     =  ((uint8_t)0x00), /*!< CAN is compatible with ST7 beCAN (only 2 mailboxes are available)*/
  CAN_ST7Compatibility_Disable    =  ((uint8_t)0x10)  /*!< CAN is not compatible with ST7 beCAN ( 3 mailboxes are available)*/
}CAN_ST7Compatibility_TypeDef;
 
/**
  * @brief   CAN Error Code description */
typedef enum
{                                                                  
  CAN_ErrorCode_NoErr                 = ((uint8_t)0x00),  /*!< No Error  */ 
  CAN_ErrorCode_StuffErr              = ((uint8_t)0x10),  /*!< Stuff Error  */ 
  CAN_ErrorCode_FormErr               = ((uint8_t)0x20),  /*!< Form Error  */ 
  CAN_ErrorCode_ACKErr                = ((uint8_t)0x30),  /*!< Acknowledgment Error  */ 
  CAN_ErrorCode_BitRecessiveErr       = ((uint8_t)0x40),  /*!< Bit Recessive Error  */ 
  CAN_ErrorCode_BitDominantErr        = ((uint8_t)0x50),  /*!< Bit Dominant Error  */ 
  CAN_ErrorCode_CRCErr                = ((uint8_t)0x60),  /*!< CRC Error  */ 
  CAN_ErrorCode_SoftwareSetErr        = ((uint8_t)0x70)  /*!< Software Set Error  */ 
}CAN_ErrorCode_TypeDef;
/**
  * @}
  */
/* Private macros ------------------------------------------------------------*/
/** @addtogroup CAN_Private_Macros
  * @{
  */
/**
  * @brief  Macro used by the assert function in order to check the CAN ST7 Compatibility parameters.
  */
#define IS_CAN_ST7_COMPATIBILITY_OK(STATE) (((STATE) == CAN_ST7Compatibility_Enable) || ((STATE) == CAN_ST7Compatibility_Disable))
/**
  * @brief  Macro used by the assert function in order to check  CAN operating mode.
  */
#define IS_CAN_OPERATINGMODE_OK(MODE) (((MODE) == CAN_OperatingMode_Initialization) ||\
                                    ((MODE) == CAN_OperatingMode_Normal)|| \
                        ((MODE) == CAN_OperatingMode_Sleep))
/**
  * @brief  Macro used by the assert function in order to check CAN Time Triggered Communication mode.
  */
#define IS_CAN_MASTERCTRL_OK(MODE) (((MODE) == CAN_MasterCtrl_AllDisabled) || \
                                    (((MODE) <= CAN_MasterCtrl_AllEnabled) && ((MODE) >= CAN_MasterCtrl_TxFifoPriority)))
/**
  * @brief  Macro used by the assert function in order to check   CAN  mode options .
  */
#define IS_CAN_MODE_OK(MODE) (((MODE) == CAN_Mode_Normal) || ((MODE) == CAN_Mode_LoopBack)|| \
                           ((MODE) == CAN_Mode_Silent) || ((MODE) == CAN_Mode_Silent_LoopBack))
/**
  * @brief  Macro used by the assert function in order to check the CAN synchronisation jump width (SJW).
  */
#define IS_CAN_SYNJUMPWIDTH_OK(SJW) (((SJW) == CAN_SynJumpWidth_1TimeQuantum) || ((SJW) == CAN_SynJumpWidth_2TimeQuantum)|| \
                         ((SJW) == CAN_SynJumpWidth_3TimeQuantum) || ((SJW) == CAN_SynJumpWidth_4TimeQuantum))
/**
  * @brief  Macro used by the assert function in order to check time quantum in bit segment 1 .
  */
#define IS_CAN_BITSEG1_OK(BS1) ((BS1) <= CAN_BitSeg1_16TimeQuantum)
/**
  * @brief  Macro used by the assert function in order to check time quantum in bit segment 2.
  */
#define IS_CAN_BITSEG2_OK(BS2) ((((BS2) >= CAN_BitSeg2_2TimeQuantum) && ((BS2) <= CAN_BitSeg2_8TimeQuantum))|| ((BS2) == CAN_BitSeg2_1TimeQuantum))
/**
  * @brief  Macro used by the assert function in order to check CAN clock prescaler.
  */
#define IS_CAN_PRESCALER_OK(PRESCALER) (((PRESCALER) >= 1) && ((PRESCALER) <= 64))
/**
  * @brief  Macro used by the assert function in order to check CAN filter number.
  */
#define IS_CAN_FILTER_NUMBER_OK(NUMBER) (((NUMBER) == CAN_FilterNumber_0) || \
                                       ((NUMBER) == CAN_FilterNumber_1) || \
                                       ((NUMBER) == CAN_FilterNumber_2) || \
                                       ((NUMBER) == CAN_FilterNumber_3) || \
                                       ((NUMBER) == CAN_FilterNumber_4) || \
                                       ((NUMBER) == CAN_FilterNumber_5))
/**
  * @brief  Macro used by the assert function in order to check  CAN filter mode.
  */
#define IS_CAN_FILTER_MODE_OK(MODE) (((MODE) == CAN_FilterMode_IdMask) || \
                                     ((MODE) == CAN_FilterMode_IdMask_IdList) || \
                                     ((MODE) == CAN_FilterMode_IdList_IdMask) || \
                                  ((MODE) == CAN_FilterMode_IdList))
/**
  * @brief  Macro used by the assert function in order to check CAN filter scale.
  */
#define IS_CAN_FILTER_SCALE_OK(SCALE) (((SCALE) == CAN_FilterScale_8Bit)|| \
                                    ((SCALE) == CAN_FilterScale_16_8Bit) ||\
                                    ((SCALE) == CAN_FilterScale_16Bit  )||\
                                    ((SCALE) == CAN_FilterScale_32Bit))
/**
  * @brief  Macro used by the assert function in order to check CAN Tx mailboxes.
  */
#define IS_CAN_TRANSMITMAILBOX_OK(TRANSMITMAILBOX) (((TRANSMITMAILBOX) == CAN_TransmitMailBox_0) || \
                                                 ((TRANSMITMAILBOX) == CAN_TransmitMailBox_1) || \
                                                 ((TRANSMITMAILBOX) == CAN_TransmitMailBox_2))
/**
  * @brief  Macro used by the assert function in order to check the Standard ID to be sent.
  */
#define IS_CAN_STDID_OK(STDID)   ((STDID) <= ((uint16_t)CAN_STDID_SIZE))
/**
  * @brief  Macro used by the assert function in order to check the Extended ID to be sent.
  */
#define IS_CAN_EXTID_OK(EXTID)   ((EXTID) <= ((uint32_t)CAN_EXTID_SIZE))
/**
  * @brief  Macro used by the assert function in order to check the DLC to be sent.
  */
#define IS_CAN_DLC_OK(DLC)       ((DLC) <= CAN_DLC_MAX)
/**
  * @brief  Macro used by the assert function in order to check the type of the ID to be sent.
  */
#define IS_CAN_IDTYPE_OK(IDTYPE) (((IDTYPE) == CAN_Id_Standard) || ((IDTYPE) == CAN_Id_Extended))
/**
  * @brief  Macro used by the assert function in order to check CAN  transmission  Frame Type.
  */
#define IS_CAN_RTR_OK(RTR) (((RTR) == CAN_RTR_Data) || ((RTR) == CAN_RTR_Remote))
 
/**
  * @brief  Macro used by the assert function in order to check  CAN flags which can be got by @ref CAN_GetFlagStatus
  */
#define IS_CAN_FLAG_STATUS_OK(FLAG) (((FLAG) == CAN_FLAG_RQCP0) || ((FLAG) == CAN_FLAG_RQCP1) ||\
                                  ((FLAG) == CAN_FLAG_RQCP2) || ((FLAG) == CAN_FLAG_FMP) ||\
                                  ((FLAG) == CAN_FLAG_FF) || ((FLAG) == CAN_FLAG_FOV) ||\
                                  ((FLAG) == CAN_FLAG_WKU) || ((FLAG) == CAN_FLAG_EWG) ||\
                                  ((FLAG) == CAN_FLAG_EPV) || ((FLAG) == CAN_FLAG_BOF) ||\
                                  ((FLAG) == CAN_FLAG_LEC))
/**
  * @brief  Macro used by the assert function in order to check  CAN flags which can be cleared by @ref CAN_ClearFlag
  */
#define IS_CAN_FLAG_CLEAR_OK(FLAG) (((FLAG) == CAN_FLAG_RQCP0) || ((FLAG) == CAN_FLAG_RQCP1) ||\
                                    ((FLAG) == CAN_FLAG_RQCP2) ||  ((FLAG) == CAN_FLAG_FF)   ||\
                                    ((FLAG) == CAN_FLAG_FOV)  ||  ((FLAG) == CAN_FLAG_WKU) ||\
                                    ((FLAG) == CAN_FLAG_LEC))
/**
  * @brief  Macro used by the assert function in order to check the  CAN Configuration interrupts.
  */
#define CAN_IT_CONFIG_MASK  ~(uint16_t)(CAN_IT_TME|CAN_IT_FMP|CAN_IT_FF|CAN_IT_FOV|CAN_IT_WKU|CAN_IT_EWG|CAN_IT_EPV|CAN_IT_BOF|CAN_IT_LEC|CAN_IT_ERR)
#define IS_CAN_IT_CONFIG_OK(IT) (((IT) != 0x0000) && ((uint16_t)((uint16_t)(IT) & (uint16_t)CAN_IT_CONFIG_MASK) == 0x0000))
/**
  * @brief  Macro used by the assert function in order to check the  CAN status interrupts.
  */
#define IS_CAN_IT_STATUS_OK(IT) (((IT) == CAN_IT_TME)   || ((IT) == CAN_IT_FMP) ||\
                             ((IT) == CAN_IT_FF)    || ((IT) == CAN_IT_FOV) || \
                             ((IT) == CAN_IT_WKU)   || ((IT) == CAN_IT_ERR)  || \
                             ((IT) == CAN_IT_EWG)   || ((IT) == CAN_IT_EPV)  || \
                             ((IT) == CAN_IT_BOF)   || ((IT) == CAN_IT_LEC)  )
/**
  * @brief  Macro used by the assert function in order to check the  CAN Pending bit interrupts.
  */
#define IS_CAN_IT_PENDING_BIT_OK(IT) (((IT) == CAN_IT_TME) || ((IT) == CAN_IT_FF)  ||\
                                      ((IT) == CAN_IT_FOV)  || ((IT) == CAN_IT_WKU) ||\
                                      ((IT) == CAN_IT_ERR)  || ((IT) == CAN_IT_EWG) ||\
                                      ((IT) == CAN_IT_EPV) || ((IT) == CAN_IT_BOF)||\
                                      ((IT) == CAN_IT_LEC))
/**
  * @brief  Macro used by the assert function in order to check the Last Error Code.
  */
#define IS_CAN_LAST_ERROR_CODE_OK(CODE)  (((CODE) & 0x8F) == 0x00)
/**
  * @}
  */
 
/* Exported function prototypes --------------------------------------------- */
/** @addtogroup CAN_Exported_Functions
  * @{
  */
void CAN_DeInit(void);
CAN_InitStatus_TypeDef CAN_Init(CAN_MasterCtrl_TypeDef CAN_MasterCtrl,
                                CAN_Mode_TypeDef CAN_Mode,
                                CAN_SynJumpWidth_TypeDef CAN_SynJumpWidth,
                                CAN_BitSeg1_TypeDef CAN_BitSeg1,
                                CAN_BitSeg2_TypeDef CAN_BitSeg2,
                                uint8_t CAN_Prescaler);
 
void CAN_FilterInit(CAN_FilterNumber_TypeDef CAN_FilterNumber,
                    FunctionalState CAN_FilterActivation,
                    CAN_FilterMode_TypeDef CAN_FilterMode,
                    CAN_FilterScale_TypeDef CAN_FilterScale,
                    uint8_t CAN_FilterID1,  
                    uint8_t CAN_FilterID2,
                    uint8_t CAN_FilterID3,
                     uint8_t CAN_FilterID4,
                    uint8_t CAN_FilterIDMask1,
                     uint8_t CAN_FilterIDMask2,
                    uint8_t CAN_FilterIDMask3,
                    uint8_t CAN_FilterIDMask4);
void CAN_ITConfig(CAN_IT_TypeDef CAN_IT, FunctionalState NewState);
void CAN_ST7CompatibilityCmd(CAN_ST7Compatibility_TypeDef CAN_ST7Compatibility);
CAN_TxStatus_TypeDef CAN_Transmit( uint32_t CAN_Id,
                                   CAN_Id_TypeDef CAN_IDE,
                                   CAN_RTR_TypeDef CAN_RTR,
                                   uint8_t CAN_DLC,
                                   uint8_t *CAN_Data);
void CAN_TTComModeCmd(FunctionalState NewState);
CAN_TxStatus_TypeDef CAN_TransmitStatus(CAN_TransmitMailBox_TypeDef CAN_TransmitMailbox);
void CAN_CancelTransmit(CAN_TransmitMailBox_TypeDef CAN_TransmitMailbox);
void CAN_FIFORelease(void);
CAN_NbrPendingMessage_TypeDef CAN_MessagePending(void);
void CAN_Receive(void);
uint32_t CAN_GetReceivedId(void);
CAN_Id_TypeDef CAN_GetReceivedIDE(void);
CAN_RTR_TypeDef CAN_GetReceivedRTR(void);
uint8_t CAN_GetReceivedDLC(void);
uint8_t CAN_GetReceivedData(uint8_t CAN_DataIndex);
uint8_t CAN_GetReceivedFMI(void);
uint16_t CAN_GetMessageTimeStamp(void);
CAN_Sleep_TypeDef CAN_Sleep(void);
CAN_WakeUp_TypeDef CAN_WakeUp(void);
CAN_ModeStatus_TypeDef CAN_OperatingModeRequest(CAN_OperatingMode_TypeDef CAN_OperatingMode);
CAN_ErrorCode_TypeDef CAN_GetLastErrorCode(void);
CAN_Page_TypeDef CAN_GetSelectedPage(void);
void CAN_SelectPage(CAN_Page_TypeDef CAN_Page);
FlagStatus CAN_GetFlagStatus(CAN_FLAG_TypeDef CAN_Flag);
void CAN_ClearFlag(CAN_FLAG_TypeDef CAN_Flag);
ITStatus CAN_GetITStatus(CAN_IT_TypeDef CAN_IT);
void CAN_ClearITPendingBit(CAN_IT_TypeDef CAN_IT);
/**
  * @}
  */
#endif /* __STM8S_CAN_H */
 
 
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/