STM32:CAN總線通信初始化配置
一、CAN總線通信 發送
1. CAN總線通信發送配置流程
- 寫入識別符號
- 寫入識別符號型別(標準幀/擴展幀)
- 寫入幀型別(遠程幀/資料幀)
- 寫入資料長度
- 寫入資料
- 發送資料
2. CAN總線通信發送相關庫函式
發送資料結構體:
typedef struct
{
uint32_t StdId; /*!<指定標準識別符號
該引數可以是0到0x7FF之間的值 */
uint32_t ExtId; /*!< 指定擴展識別符號
該引數可以是0到0x1FFFFFFF之間的值 */
uint8_t IDE; /*!< 指定要傳輸的訊息的識別符號型別
標準幀:CAN_ID_STD
擴展幀:CAN_ID_EXT */
uint8_t RTR; /*!< 指定要傳輸的訊息的幀型別
資料幀:CAN_RTR_DATA
遠程幀:CAN_RTR_REMOTE */
uint8_t DLC; /*!< 指定將要傳輸的幀的長度,
取值范圍為0 ~ 8 */
uint8_t Data[8]; /*!< 包含要傳輸的資料,
取值范圍是0 ~ 0xFF */
} CanTxMsg;
發送庫函式:
/**
* @brief Initiates the transmission of a message.
* @param CANx: where x can be 1 or 2 to to select the CAN peripheral.
* @param TxMessage: pointer to a structure which contains CAN Id, CAN
* DLC and CAN data.
* @retval The number of the mailbox that is used for transmission
* or CAN_TxStatus_NoMailBox if there is no empty mailbox.
*/
uint8_t CAN_Transmit(CAN_TypeDef* CANx, CanTxMsg* TxMessage);
3.CAN總線通信發送程式
標準幀具體代碼如下:
/* 發送資料*/
void CAN_TX(void)
{
TxMessage.StdId=0x01; //標準識別符號為0x01
TxMessage.IDE=CAN_ID_STD; //使用標準識別符號 CAN_ID_STD
TxMessage.RTR=CAN_RTR_DATA; //為資料幀
TxMessage.DLC=0x08; //訊息的資料長度為2個位元組
TxMessage.Data[0]=0x01; //第1個位元組資料
TxMessage.Data[1]=0x02; //第2個位元組資料
TxMessage.Data[2]=0x03; //第3個位元組資料
TxMessage.Data[3]=0x04; //第4個位元組資料
TxMessage.Data[4]=0x05; //第5個位元組資料
TxMessage.Data[5]=0x06; //第6個位元組資料
TxMessage.Data[6]=0x07; //第7個位元組資料
TxMessage.Data[7]=0x08; //第8個位元組資料
CAN_Transmit(CAN1, &TxMessage); //發送資料
}
擴展幀具體代碼如下:
/* 發送兩個位元組的資料*/
void CAN_TX(void)
{
TxMessage.ExtId=0x1FFFFFFF; //擴展識別符號 0x1FFFFFFF
TxMessage.IDE=CAN_ID_EXT; //使用標準識別符號 CAN_ID_EXT
TxMessage.RTR=CAN_RTR_DATA; //為資料幀
TxMessage.DLC=0x08; //訊息的資料長度為2個位元組
TxMessage.Data[0]=0x01; //第1個位元組資料
TxMessage.Data[1]=0x02; //第2個位元組資料
TxMessage.Data[2]=0x03; //第3個位元組資料
TxMessage.Data[3]=0x04; //第4個位元組資料
TxMessage.Data[4]=0x05; //第5個位元組資料
TxMessage.Data[5]=0x06; //第6個位元組資料
TxMessage.Data[6]=0x07; //第7個位元組資料
TxMessage.Data[7]=0x08; //第8個位元組資料
CAN_Transmit(CAN1, &TxMessage); //發送資料
}
二、CAN總線通信 接收
1. CAN總線通信接收配置流程
- 進入CAN總線接收中斷
- CAN總線接收庫函式接收資料
- 決議接收資料
- 實作對應功能
2. CAN總線通信接收相關庫函式
接收資料結構體:
typedef struct
{
uint32_t StdId; /*!<指定標準識別符號
該引數可以是0到0x7FF之間的值 */
uint32_t ExtId; /*!< 指定擴展識別符號
該引數可以是0到0x1FFFFFFF之間的值 */
uint8_t IDE; /*!< 指定要傳輸的訊息的識別符號型別
標準幀:CAN_ID_STD
擴展幀:CAN_ID_EXT */
uint8_t RTR; /*!< 指定要傳輸的訊息的幀型別
資料幀:CAN_RTR_DATA
遠程幀:CAN_RTR_REMOTE */
uint8_t DLC; /*!< 指定將要傳輸的幀的長度,
取值范圍為0 ~ 8 */
uint8_t Data[8]; /*!< 包含要傳輸的資料,
取值范圍是0 ~ 0xFF */
uint8_t FMI; /*!< 指定存盤在郵箱中的訊息所經過的篩選器的索引
該引數可以是0到0xFF之間的值 */
} CanRxMsg;
接收庫函式:
/**
* @brief Receives a message.
* @param CANx: where x can be 1 or 2 to to select the CAN peripheral.
* @param FIFONumber: Receive FIFO number, CAN_FIFO0 or CAN_FIFO1.
* @param RxMessage: pointer to a structure receive message which contains
* CAN Id, CAN DLC, CAN datas and FMI number.
* @retval None.
*/
void CAN_Receive(CAN_TypeDef* CANx, uint8_t FIFONumber, CanRxMsg* RxMessage);
3. CAN總線通信接收程式
具體代碼如下:
//接收中斷
void USB_LP_CAN1_RX0_IRQHandler(void)
{
CAN_Receive(CAN1, CAN_FIFO0, &RxMessage); //接收FIFO0中的資料
get_data(); //接收資料處理函式
}
//接收資料處理函式
void get_data(void)
{
switch(RxMessage.StdId + RxMessage.ExtId)
{
case 0x0x1FFFFFFF:
//要實作的功能
break;
case 0x0f0:
//要實作的功能
break;
default :
break;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/253551.html
標籤:其他
上一篇:Linux基礎知識總結(命令列)
