之————07 CAN通信实验
时间:10-02
整理:3721RD
点击:
关于CAN通信的问题由于不熟悉,试了好几天,现在终于解决了,先记下来担心时间长了又忘记了。一、硬件设置
1.1 要进行CAN通信首先要建立通信网络。本次实验是CAN与PC进行通信。
1.2 虽然STM32F412还有两路CAN,但是要通信还要增加CAN通信芯片。
![](../imgqa/ele/mcu/mcu-3721rd.com-272904ks2dlyjril.jpg)
1.3 TX与RX分别接到开发板的PG0与PG1此为开发板CAN1的接口
1.4 还要准备一个CAN分析仪,安装好相应驱动。
1.5 CANH与分析仪的CANH连接,CANL与分析仪的CANL连接。这样就组成了CAN网络。
二、配置
2.1 打开CubeMX软件进行CAN与外部时钟配置
![](../imgqa/ele/mcu/mcu-3721rd.com-27291s3f1ylwlgg4.jpg)
2.2 配置时钟
![](../imgqa/ele/mcu/mcu-3721rd.com-27294rbbd53oqjim.jpg)
2.3配置CAN
![](../imgqa/ele/mcu/mcu-3721rd.com-27295rlsrekbseyj.png)
![](../imgqa/ele/mcu/mcu-3721rd.com-27296uiaz4cvb1il.jpg)
准备设置波特率为500K通信
主频为100M CAN接到APB1 peripheral Colocks上为50M
50M经过分频 Prescaler 5 为了好算先设置为5分,分频为10M
波特率=10M/ (BS1+BS2+SJW )=500K
只要BS1+BS2+SJW=20就可以。所以将BS1=13 BS=6 SJW=1 (其它设置也可以,只要为20就好)
2.4 设置 中断
![](../imgqa/ele/mcu/mcu-3721rd.com-27298atwn5n1kcur.jpg)
为了能接收数据要开接收中断。
2.5基本设置好后输出
三、编程
3.1为了接收数据先重定回调函数
void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef* hcan)
{
if(hcan1.pRxMsg->StdId==0x38 ) //检查接收到的ID是不是0x38发来的
{
for(int i=0;i<8;i++){
hcan1.pTxMsg->Data = hcan1.pRxMsg->Data; } //将PC发来的数据又反回去
HAL_CAN_Transmit(&hcan1,10);
}
HAL_CAN_Receive_IT(&hcan1,CAN_FIFO0); //回调中要重开接收中断。注意CAN_FIFO0。
}
3.2 定义发送与接收的结构体
/* USER CODE BEGIN 1 */
static CanTxMsgTypeDef TxMessage;
static CanRxMsgTypeDef RxMessage;
/* USER CODE END 1 */
/* USER CODE BEGIN 2 */
hcan1.pTxMsg =&TxMessage;
hcan1.pRxMsg =&RxMessage; // 进行初始化,不初始化收不到数据
HAL_CAN_Receive_IT(&hcan1,CAN_FIFO0); //开启中断接收
Can_Date_Read();
/*定义发送参数*/
void Can_Date_Read()
{
hcan1.pTxMsg=&TxMessage;
hcan1.pTxMsg->StdId=0x0135; //发送ID号
hcan1.pTxMsg->RTR=CAN_RTR_DATA; //发送的数据帧
hcan1.pTxMsg->IDE=CAN_ID_STD; //标准数据帧
hcan1.pTxMsg->DLC=8; //数据长度
hcan1.pTxMsg->Data[0] = 0x01; //数据
hcan1.pTxMsg->Data[1] = 0x02;
hcan1.pTxMsg->Data[2] = 0x03;
hcan1.pTxMsg->Data[3] = 0x04;
hcan1.pTxMsg->Data[4] = '5';
hcan1.pTxMsg->Data[5] = '6';
hcan1.pTxMsg->Data[6] = '7';
hcan1.pTxMsg->Data[7] = '8';
}
/* USER CODE END 0 */
3.3测试
![](../imgqa/ele/mcu/mcu-3721rd.com-27300sdfgcuse0zu.jpg)
小结
1.HAL_CAN_Receive_IT(&hcan1,CAN_FIFO0); //开启中断接收 开始将CAN_FIFO0定错了一直进不了中断
在RX上接收到数据,就是进不了中断。后来才发现FIFO0写错了。
2.后来进行了回调中断但,数据接收不到。是因为
hcan1.pTxMsg =&TxMessage;
hcan1.pRxMsg =&RxMessage; // 没有进行初始化。
1.1 要进行CAN通信首先要建立通信网络。本次实验是CAN与PC进行通信。
1.2 虽然STM32F412还有两路CAN,但是要通信还要增加CAN通信芯片。
![](../imgqa/ele/mcu/mcu-3721rd.com-272904ks2dlyjril.jpg)
1.3 TX与RX分别接到开发板的PG0与PG1此为开发板CAN1的接口
1.4 还要准备一个CAN分析仪,安装好相应驱动。
1.5 CANH与分析仪的CANH连接,CANL与分析仪的CANL连接。这样就组成了CAN网络。
二、配置
2.1 打开CubeMX软件进行CAN与外部时钟配置
![](../imgqa/ele/mcu/mcu-3721rd.com-27291s3f1ylwlgg4.jpg)
2.2 配置时钟
![](../imgqa/ele/mcu/mcu-3721rd.com-27294rbbd53oqjim.jpg)
2.3配置CAN
![](../imgqa/ele/mcu/mcu-3721rd.com-27295rlsrekbseyj.png)
![](../imgqa/ele/mcu/mcu-3721rd.com-27296uiaz4cvb1il.jpg)
准备设置波特率为500K通信
主频为100M CAN接到APB1 peripheral Colocks上为50M
50M经过分频 Prescaler 5 为了好算先设置为5分,分频为10M
波特率=10M/ (BS1+BS2+SJW )=500K
只要BS1+BS2+SJW=20就可以。所以将BS1=13 BS=6 SJW=1 (其它设置也可以,只要为20就好)
2.4 设置 中断
![](../imgqa/ele/mcu/mcu-3721rd.com-27298atwn5n1kcur.jpg)
为了能接收数据要开接收中断。
2.5基本设置好后输出
三、编程
3.1为了接收数据先重定回调函数
void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef* hcan)
{
if(hcan1.pRxMsg->StdId==0x38 ) //检查接收到的ID是不是0x38发来的
{
for(int i=0;i<8;i++){
hcan1.pTxMsg->Data = hcan1.pRxMsg->Data; } //将PC发来的数据又反回去
HAL_CAN_Transmit(&hcan1,10);
}
HAL_CAN_Receive_IT(&hcan1,CAN_FIFO0); //回调中要重开接收中断。注意CAN_FIFO0。
}
3.2 定义发送与接收的结构体
/* USER CODE BEGIN 1 */
static CanTxMsgTypeDef TxMessage;
static CanRxMsgTypeDef RxMessage;
/* USER CODE END 1 */
/* USER CODE BEGIN 2 */
hcan1.pTxMsg =&TxMessage;
hcan1.pRxMsg =&RxMessage; // 进行初始化,不初始化收不到数据
HAL_CAN_Receive_IT(&hcan1,CAN_FIFO0); //开启中断接收
Can_Date_Read();
/*定义发送参数*/
void Can_Date_Read()
{
hcan1.pTxMsg=&TxMessage;
hcan1.pTxMsg->StdId=0x0135; //发送ID号
hcan1.pTxMsg->RTR=CAN_RTR_DATA; //发送的数据帧
hcan1.pTxMsg->IDE=CAN_ID_STD; //标准数据帧
hcan1.pTxMsg->DLC=8; //数据长度
hcan1.pTxMsg->Data[0] = 0x01; //数据
hcan1.pTxMsg->Data[1] = 0x02;
hcan1.pTxMsg->Data[2] = 0x03;
hcan1.pTxMsg->Data[3] = 0x04;
hcan1.pTxMsg->Data[4] = '5';
hcan1.pTxMsg->Data[5] = '6';
hcan1.pTxMsg->Data[6] = '7';
hcan1.pTxMsg->Data[7] = '8';
}
/* USER CODE END 0 */
3.3测试
![](../imgqa/ele/mcu/mcu-3721rd.com-27300sdfgcuse0zu.jpg)
小结
1.HAL_CAN_Receive_IT(&hcan1,CAN_FIFO0); //开启中断接收 开始将CAN_FIFO0定错了一直进不了中断
![](../imgqa/ele/mcu/mcu-3721rd.com-273011i4415efaqc.jpg)
2.后来进行了回调中断但,数据接收不到。是因为
hcan1.pTxMsg =&TxMessage;
hcan1.pRxMsg =&RxMessage; // 没有进行初始化。