各種通信協議速度分析
協議 | 最高速度(btis/s) |
---|---|
I2C | 400K |
CAN | 1M |
CAN-FD | 5M |
485 | 10M |
SPI | 36M |
CAN協議圖和通信幀
CubeMX CAN配置說明
CAN通信波特率 = APB1頻率 / 分頻系數 /(BS1 + BS2 + 同步通信段)* 1000
? = 42 / 1 / (1+1+1) * 1000
? = 14,000 KHz
? = 14000000 bit/s
CAN最高只有1M,支持CAN-FD的單片機可以為8M
Time Triggered Communication Mode:
時間觸發模式,用于生成時間戳,可以實現分時同步功能
Automatic Bus-Off Management
自動離線管理,當節點檢測到它發送錯誤或接收錯誤超過一定值時,會自動進入離線狀態
Automatic Wake-Up Mode
自動喚醒功能,CAN 外設可以使用軟件進入低功耗的睡眠模式,如果使能了這個自動喚醒功能,當 CAN 檢測到總線活動的時候,會自動喚醒
Automatic Retransmission
報文自動重傳功能,設置這個功能后,當報文發送失敗時會自動重傳至成功為止
Receive Fifo Locked Mode
FIFO 鎖定模式,該功能用于鎖定接收 FIFO。鎖定后,當接收 FIFO 溢出時,會丟棄下一個接收的報文。若不鎖定,則下一個接收到的報文會覆蓋原報文
Transmit Fifo Priority
報文發送優先級的判定方法,ID 優先級還是報文存進郵箱的順序來發送
Operating Mode:
CAN模式
自發自收模式配置
示例程序
如果是GD32系列單片機需要在stm32f4xx_hal_can.c文件中添加如下代碼,解決初始化CAN死機問題
CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_SLEEP);
// 申明使用到的變量
uint8_t TX_data[20];
uint8_t RX_data[20];
uint32_t mailbox;
int back;
static CAN_TxHeaderTypeDef Tx_Header;
static CAN_FilterTypeDef can_filter;// CAN接收回調
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{if(hcan->Instance == CAN1){CAN_RxHeaderTypeDef RxHeader;// 當接收到數據后放到TX數組,把數據返回去HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO0, &RxHeader, TX_data);//HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO0, &RxHeader, RX_data);HAL_GPIO_WritePin(GPIOD, GPIO_PIN_5, GPIO_PIN_SET);}
}int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_DMA_Init();// 初始化CAN1MX_CAN1_Init();// 啟用CAN的中斷通知功能HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING);// 啟動CAN1HAL_CAN_Start(&hcan1);// 設置CAN過濾器(CAN配置詳解請看下一點)can_filter.FilterActivation = CAN_FILTER_ENABLE; can_filter.FilterMode = CAN_FILTERMODE_IDMASK;can_filter.FilterScale = CAN_FILTERSCALE_32BIT;can_filter.FilterIdHigh = 0x0000; can_filter.FilterIdLow = 0x0000;can_filter.FilterMaskIdHigh = 0x0000; can_filter.FilterMaskIdLow = 0x0000;can_filter.FilterBank = 0;can_filter.FilterFIFOAssignment = CAN_RX_FIFO0;can_filter.SlaveStartFilterBank = 14; HAL_CAN_ConfigFilter(&hcan1, &can_filter);// 初始數據TX_data[0] = 0x01;TX_data[1] = 0x02;TX_data[2] = 0x03;TX_data[3] = 0x01;TX_data[4] = 0x02;TX_data[5] = 0x03;TX_data[6] = 0x01;TX_data[7] = 0x02;while (1){ // 設置CAN發送信息Tx_Header.StdId=0x12345678; Tx_Header.ExtId=0; Tx_Header.IDE=CAN_ID_STD; Tx_Header.RTR=CAN_RTR_DATA; Tx_Header.DLC=8; // 發送數據back = HAL_CAN_AddTxMessage(&hcan1, &Tx_Header, TX_data, &mailbox);if(back == HAL_OK){// 發送成功亮燈HAL_GPIO_WritePin(GPIOD, GPIO_PIN_4, GPIO_PIN_SET);}HAL_Delay(1000);HAL_GPIO_WritePin(GPIOD, GPIO_PIN_4, GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOD, GPIO_PIN_5, GPIO_PIN_RESET);HAL_Delay(1000);}
}
https://download.csdn.net/download/hmxm6/89341938