请问
电脑—stm32—TJA1050— can总线分析仪—电脑
这样连对吗
可以的。在stm32上使用CAN总线需要配置CAN控制器和GPIO引脚。可以使用HAL库函数来配置和控制CAN总线。以下是一个简单的例子:
/* 配置CAN控制器 */
CAN_HandleTypeDef hcan;
hcan.Instance = CAN1;
hcan.Init.Mode = CAN_MODE_NORMAL;
hcan.Init.AutoBusOff = ENABLE;
hcan.Init.AutoRetransmission = ENABLE;
hcan.Init.AutoWakeUp = ENABLE;
hcan.Init.ReceiveFifoLocked = ENABLE;
hcan.Init.TimeTriggeredMode = DISABLE;
hcan.Init.TransmitFifoPriority = DISABLE;
hcan.Init.SyncJumpWidth = CAN_SJW_1TQ;
hcan.Init.TimeSeg1 = CAN_BS1_13TQ;
hcan.Init.TimeSeg2 = CAN_BS2_2TQ;
hcan.Init.Prescaler = 4;
if (HAL_CAN_Init(&hcan) != HAL_OK) {
// 处理错误
}
/* 配置GPIO引脚 */
GPIO_InitTypeDef gpio;
gpio.Pin = GPIO_PIN_12 | GPIO_PIN_11;
gpio.Mode = GPIO_MODE_AF_PP;
gpio.Pull = GPIO_PULLUP;
gpio.Speed = GPIO_SPEED_FREQ_HIGH;
gpio.Alternate = GPIO_AF9_CAN1;
HAL_GPIO_Init(GPIOA, &gpio);
/* 配置CAN过滤器 */
CAN_FilterTypeDef filter;
filter.FilterBank = 0;
filter.FilterMode = CAN_FILTERMODE_IDMASK;
filter.FilterScale = CAN_FILTERSCALE_32BIT;
filter.FilterIdHigh = 0x0000;
filter.FilterIdLow = 0x0000;
filter.FilterMaskIdHigh = 0x0000;
filter.FilterMaskIdLow = 0x0000;
filter.FilterFIFOAssignment = 0;
filter.FilterActivation = ENABLE;
if (HAL_CAN_ConfigFilter(&hcan, &filter) != HAL_OK) {
// 处理错误
}
/* 发送CAN消息 */
CAN_TxHeaderTypeDef txHeader;
uint8_t txData[8] = {1, 2, 3, 4, 5, 6, 7, 8};
uint32_t txMailbox;
txHeader.StdId = 0x123;
txHeader.ExtId = 0;
txHeader.RTR = CAN_RTR_DATA;
txHeader.IDE = CAN_ID_STD;
txHeader.DLC = 8;
if (HAL_CAN_AddTxMessage(&hcan, &txHeader, txData, &txMailbox) != HAL_OK) {
// 处理错误
}
/* 接收CAN消息 */
CAN_RxHeaderTypeDef rxHeader;
uint8_t rxData[8];
if (HAL_CAN_GetRxMessage(&hcan, CAN_RX_FIFO0, &rxHeader, rxData) != HAL_OK) {
// 处理错误
}
将CAN总线分析仪插入电脑并连接到CAN总线上,可以使用CAN总线分析软件来监测CAN通信。
从上图可以看出:STM32F767/429 的 CAN 通过 P10 的设置,连接到 TJA1050 收发芯片,然后通过接线端子(CAN)同外部的 CAN 总线连接.图中可以看出,在阿波罗 STM32 开发板上面是带有 120Ω的终端电阻的,如果我们的开发板不是作为 CAN 的终端的话,需要把这个电阻去掉,以免影响通信.另外,需要注意:CAN1 和USB 共用了 PA11 和 PA12,所以他们不能同时使用.
这里还要注意,我们要设置好开发板上 P10 排针的连接,通过跳线帽将 PA11 和 PA12 分别连接到 CAN_RX 和 CAN_TX 上面
最后,我们用 2 根导线将两个开发板 CAN 端子的 CAN_L 和 CAN_L,CAN_H 和CAN_H
连接起来.这里注意不要接反了(CAN_L 接 CAN_H),接反了会导致通讯异常!