使用STM32F103的CAN通訊就是用這4個結構體函式,把他們理解透了,CAN就好用了
CAN的結構體定義在stm32f10x_can.h裡面
/*********************************************************************************************************************************************************
//CAN初始化結構定義
*************************************************************************************************************************************************************/
typedef struct
{
uint16_t CAN_Prescaler; /*!< Specifies the length of a time quantum. It ranges from 1 to 1024. */預分頻器<指定時間量的長度。範圍從1到1024>
uint8_t CAN_Mode; /*!< Specifies the CAN operating mode.This parameter can be a value of @ref CAN_operating_mode */指定CAN操作模式
/*************
有四種模式可選
相關巨集
#define CAN_Mode_Normal ((uint8_t)0x00) /*!< normal mode */正常模式
#define CAN_Mode_LoopBack ((uint8_t)0x01) /*!< loopback mode */迴環模式
#define CAN_Mode_Silent ((uint8_t)0x02) /*!< silent mode */靜音模式
#define CAN_Mode_Silent_LoopBack ((uint8_t)0x03) /*!< loopback combined with silent mode */環回與靜音模式相結合
****************/
uint8_t CAN_SJW; /*!< Specifies the maximum number of time quanta the CAN hardware is allowed to lengthen or shorten a bit to perform resynchronization.This parameter can be a value of @ref CAN_synchronisation_jump_width */
/**********************************
硬體同步,再同步
指定時間量的最大數量,允許CAN硬體加長或,縮短一點以執行重新同步。此引數的值可以是@參考CAN\U同步\U跳躍\U寬度*
重新同步跳躍寬度間單位
相關巨集
#define CAN_SJW_1tq ((uint8_t)0x00) /*!< 1 time quantum */1個tq
#define CAN_SJW_2tq ((uint8_t)0x01) /*!< 2 time quantum */2個tq
#define CAN_SJW_3tq ((uint8_t)0x02) /*!< 3 time quantum */3個tq
#define CAN_SJW_4tq ((uint8_t)0x03) /*!< 4 time quantum */4個tq
***********************************************/
uint8_t CAN_BS1; /*!< Specifies the number of time quanta in Bit Segment 1. This parameter can be a value of @ref CAN_time_quantum_in_bit_segment_1 */指定時間量(以位為單位)
/*****************************************************
硬體同步,再同步
設定取樣點時間段第一段
相關巨集
#define CAN_BS1_1tq ((uint8_t)0x00) /*!< 1 time quantum */
#define CAN_BS1_2tq ((uint8_t)0x01) /*!< 2 time quantum */
#define CAN_BS1_3tq ((uint8_t)0x02) /*!< 3 time quantum */
#define CAN_BS1_4tq ((uint8_t)0x03) /*!< 4 time quantum */
#define CAN_BS1_5tq ((uint8_t)0x04) /*!< 5 time quantum */
#define CAN_BS1_6tq ((uint8_t)0x05) /*!< 6 time quantum */
#define CAN_BS1_7tq ((uint8_t)0x06) /*!< 7 time quantum */
#define CAN_BS1_8tq ((uint8_t)0x07) /*!< 8 time quantum */
#define CAN_BS1_9tq ((uint8_t)0x08) /*!< 9 time quantum */
#define CAN_BS1_10tq ((uint8_t)0x09) /*!< 10 time quantum */
#define CAN_BS1_11tq ((uint8_t)0x0A) /*!< 11 time quantum */
#define CAN_BS1_12tq ((uint8_t)0x0B) /*!< 12 time quantum */
#define CAN_BS1_13tq ((uint8_t)0x0C) /*!< 13 time quantum */
#define CAN_BS1_14tq ((uint8_t)0x0D) /*!< 14 time quantum */
#define CAN_BS1_15tq ((uint8_t)0x0E) /*!< 15 time quantum */
#define CAN_BS1_16tq ((uint8_t)0x0F) /*!< 16 time quantum */
********************************************************/
uint8_t CAN_BS2; /*!< Specifies the number of time quanta in Bit Segment 2.his parameter can be a value of @ref CAN_time_quantum_in_bit_segment_2 */指定時間量(以位為單位)
/*****************************************************
硬體同步,再同步
設定取樣點時間段第二段
相關巨集
#define CAN_BS2_1tq ((uint8_t)0x00) /*!< 1 time quantum */
#define CAN_BS2_2tq ((uint8_t)0x01) /*!< 2 time quantum */
#define CAN_BS2_3tq ((uint8_t)0x02) /*!< 3 time quantum */
#define CAN_BS2_4tq ((uint8_t)0x03) /*!< 4 time quantum */
#define CAN_BS2_5tq ((uint8_t)0x04) /*!< 5 time quantum */
#define CAN_BS2_6tq ((uint8_t)0x05) /*!< 6 time quantum */
#define CAN_BS2_7tq ((uint8_t)0x06) /*!< 7 time quantum */
#define CAN_BS2_8tq ((uint8_t)0x07) /*!< 8 time quantum */
********************************************************/
unctionalState CAN_TTCM; /*!< Enable or disable the time triggered communication mode. This parameter can be set either to ENABLE or DISABLE.
/************************************************************************
!<啟用或禁用時間觸發模式。可以設定此引數啟用或禁用。*/
ENABLE or DISABLE
*************************************************************************/
FunctionalState CAN_ABOM; /*!< Enable or disable the automatic bus-off management. This parameter can be set either to ENABLE or DISABLE. */
/***********************************************************************
啟用或禁用自動離線管理。此引數可以設定為啟用或禁用。*
ENABLE or DISABLE
************************************************************************/
FunctionalState CAN_AWUM; /*!< Enable or disable the automatic wake-up mode. This parameter can be set either to ENABLE or DISABLE. */
/***********************************************************************
<啟用或禁用自動喚醒模式。此引數可以設定為啟用或禁用。*/
ENABLE or DISABLE
**************************************************************************/
FunctionalState CAN_NART; /*!< Enable or disable the no-automatic retransmission mode. This parameter can be set either to ENABLE or DISABLE. */
/*******************************************************************************
<啟用或禁用no自動
重傳模式。此引數可以是
設定為啟用或禁用。*/
ENABLE or DISABLE
********************************************************************************/
FunctionalState CAN_RFLM; /*!< Enable or disable the Receive FIFO Locked mode.This parameter can be set either to ENABLE or DISABLE. */
/*******************************************************************************
<啟用或禁用接收FIFO鎖定模式。此引數可以設定為啟用或禁用。*/
ENABLE or DISABLE
********************************************************************************/
FunctionalState CAN_TXFP; /*!< Enable or disable the transmit FIFO priority.his parameter can be set either to ENABLE or DISABLE. */
/*******************************************************************************
<啟用或禁用傳輸FIFO優先順序。此引數可以設定為啟用或禁用。*/
ENABLE or DISABLE
********************************************************************************/
} CAN_InitTypeDe
/*********************************************************************************************************************************************************
過濾設定 初始化結構定義
*************************************************************************************************************************************************************/
typedef struct
{
uint16_t CAN_FilterIdHigh; /*!< Specifies the filter identification number (MSBs for a 32-bitconfiguration, first one for a 16-bit configuration).This parameter can be a value between 0x0000 and 0xFFFF */
/*******************************************************************************
/*!<指定32位的過濾器識別符號的高16位值,此引數可以是介於0x0000和0xFFFF之間的值*/
********************************************************************************/
uint16_t CAN_FilterIdLow; /*!< Specifies the filter identification number (LSBs for a 32-bitconfiguration, second one for a 16-bit configuration).This parameter can be a value between 0x0000 and 0xFFFF */
/*******************************************************************************
/*!<指定32位的 過濾器識別符號的低16位值,此引數可以是介於0x0000和0xFFFF之間的值*/
********************************************************************************/
uint16_t CAN_FilterMaskIdHigh; /*!< Specifies the filter mask number or identification number,according to the mode (MSBs for a 32-bit configuration,first one for a 16-bit configuration).This parameter can be a value between 0x0000 and 0xFFFF */
/*******************************************************************************
/*!<指定32位的 過濾器遮蔽識別符號的高16位值,此引數可以是介於0x0000和0xFFFF之間的值*/
********************************************************************************/
uint16_t CAN_FilterMaskIdLow; /*!< Specifies the filter mask number or identification number,according to the mode (LSBs for a 32-bit configuration,second one for a 16-bit configuration).This parameter can be a value between 0x0000 and 0xFFFF */
/*******************************************************************************
/*!<指定32位的 過濾器遮蔽識別符號的低16位值,此引數可以是介於0x0000和0xFFFF之間的值*/
********************************************************************************/
uint16_t CAN_FilterFIFOAssignment; /*!< Specifies the FIFO (0 or 1) which will be assigned to the filter.This parameter can be a value of @ref CAN_filter_FIFO */
/*******************************************************************************
指定將分配給過濾器的FIFO(0或1)。此引數可以是@ref can_filter_FIFO的值*/
#define CAN_Filter_FIFO0 ((uint8_t)0x00) /*!< Filter FIFO 0 assignment for filter x */
#define CAN_Filter_FIFO1 ((uint8_t)0x01) /*!< Filter FIFO 1 assignment for filter x */
********************************************************************************/
uint8_t CAN_FilterNumber; /*!< Specifies the filter which will be initialized. It ranges from 0 to 13. */
/*******************************************************************************
指定要初始化的過濾器。範圍從0到13
********************************************************************************/
uint8_t CAN_FilterMode; /*!< Specifies the filter mode to be initialized.This parameter can be a value of @ref CAN_filter_mode */
/*******************************************************************************
指定要初始化的過濾器模式
相關巨集
#define CAN_FilterMode_IdMask ((uint8_t)0x00) /*!< identifier/mask mode */識別符號/ 掩碼模式
#define CAN_FilterMode_IdList ((uint8_t)0x01) /*!< identifier list mode */識別符號 列表模式
********************************************************************************/
uint8_t CAN_FilterScale; /*!< Specifies the filter scale.This parameter can be a value of @ref CAN_filter_scale */
/*******************************************************************************
指定過濾器過濾器位寬。
#define CAN_FilterScale_16bit ((uint8_t)0x00) /*!< Two 16-bit filters */
#define CAN_FilterScale_32bit ((uint8_t)0x01) /*!< One 32-bit filter */
********************************************************************************/
FunctionalState CAN_FilterActivation; /*!< Enable or disable the filter.This parameter can be set either to ENABLE or DISABLE. */
/*******************************************************************************
<啟用或禁用過濾器。此引數可以設定為啟用或禁用。
ENABLE or DISABLE
********************************************************************************/
} CAN_FilterInitTypeDef;
/*********************************************************************************************************************************************************
CAN傳送訊息初始化結構定義
*************************************************************************************************************************************************************/
typedef struct
{
uint32_t StdId; /*!< Specifies the standard identifier.This parameter can be a value between 0 to 0x7FF. */
/*******************************************************************************
/*!<指定標準識別符號。此引數可以是0到0x7FF之間的值。*/
********************************************************************************/
uint32_t ExtId; /*!< Specifies the extended identifier.This parameter can be a value between 0 to 0x1FFFFFFF. */
/*******************************************************************************
!<指定擴充套件識別符號。此引數可以是0到0x1FFFFFF之間的值。*/
********************************************************************************/
uint8_t IDE; /*!< Specifies the type of identifier for the message that will be transmitted. This parameter can be a value of @ref CAN_identifier_type */
/*******************************************************************************
指定訊息的識別符號型別將被髮送
#define CAN_Id_Standard ((uint32_t)0x00000000) /*!< Standard Id */標準Id
#define CAN_Id_Extended ((uint32_t)0x00000004) /*!< Extended Id */擴充套件Id
********************************************************************************/
uint8_t RTR; /*!< Specifies the type of frame for the message that will be transmitted. This parameter can be a value of @ref CAN_remote_transmission_request */
/*******************************************************************************
指定將要傳輸的訊息的幀型別
#define CAN_RTR_Data ((uint32_t)0x00000000) /*!< Data frame */資料幀
#define CAN_RTR_Remote ((uint32_t)0x00000002) /*!< Remote frame */遠端幀
********************************************************************************/
uint8_t DLC; /*!< Specifies the length of the frame that will be transmitted. This parameter can be a value between 0 to 8 */
/*******************************************************************************
!<指定將要傳輸的幀的長度。此引數可以是介於0到8*/
********************************************************************************/
uint8_t Data[8]; /*!< Contains the data to be transmitted. It ranges from 0 to 0xFF. */
/*******************************************************************************
<包含要傳輸的資料。範圍從0到0xFF。*/
將要傳送的資料存放到這個陣列裡面
for(i = 0;i < 8;i++)
{
TxMessage.Data[i] = *(ptr + i);
}
********************************************************************************/
} CanTxMsg;
/*********************************************************************************************************************************************************
CAN接收訊息初始化結構定義
*************************************************************************************************************************************************************/
typedef struct
{
uint32_t StdId; /*!< Specifies the standard identifier.This parameter can be a value between 0 to 0x7FF. */
/*******************************************************************************
<指定標準識別符號。此引數可以是0到0x7FF之間的值。*/
********************************************************************************/
uint32_t ExtId; /*!< Specifies the extended identifier.This parameter can be a value between 0 to 0x1FFFFFFF. */
/*******************************************************************************
*!<指定擴充套件識別符號。此引數可以是0到0x1FFFFFF之間的值。*/
********************************************************************************/
uint8_t IDE; /*!< Specifies the type of identifier for the message that will be received. This parameter can be a value of @ref CAN_identifier_type */
/*******************************************************************************
/*!<指定將接收的訊息的識別符號型別。此引數可以是@ref can\u identifier\u type的值*/
#define CAN_Id_Standard ((uint32_t)0x00000000) /*!< Standard Id */標準Id
#define CAN_Id_Extended ((uint32_t)0x00000004) /*!< Extended Id */擴充套件Id
********************************************************************************/
uint8_t RTR; /*!< Specifies the type of frame for the received message.This parameter can be a value of @ref CAN_remote_transmission_request */
/*******************************************************************************
<指定接收訊息的幀型別。此引數可以是@ref can\u remote\u transmission\u request的值*/
#define CAN_RTR_Data ((uint32_t)0x00000000) /*!< Data frame *//資料幀
#define CAN_RTR_Remote ((uint32_t)0x00000002) /*!< Remote frame */遠端幀
********************************************************************************/
uint8_t DLC; /*!< Specifies the length of the frame that will be received.This parameter can be a value between 0 to 8 */
/*******************************************************************************
<指定將接收的幀的長度。此引數可以是0到8之間的值*/
********************************************************************************/
uint8_t Data[8]; /*!< Contains the data to be received. It ranges from 0 to 0xFF. */
/*******************************************************************************
<包含要接收的資料。範圍從0到0xFF。*/
接收到的資料存放在這個陣列裡面
********************************************************************************/
uint8_t FMI; /*!< Specifies the index of the filter the message stored in the mailbox passes through. This parameter can be a value between 0 to 0xFF */
/*******************************************************************************
指定郵箱中儲存的郵件通過的篩選器的索引。此引數可以是0到0xFF之間的值*/
********************************************************************************/
} CanRxMsg;