微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 之————07 CAN通信实验

之————07 CAN通信实验

时间:10-02 整理:3721RD 点击:
   关于CAN通信的问题由于不熟悉,试了好几天,现在终于解决了,先记下来担心时间长了又忘记了。一、硬件设置
     1.1 要进行CAN通信首先要建立通信网络。本次实验是CAN与PC进行通信。
     1.2 虽然STM32F412还有两路CAN,但是要通信还要增加CAN通信芯片。


     1.3 TX与RX分别接到开发板的PG0与PG1此为开发板CAN1的接口
     1.4 还要准备一个CAN分析仪,安装好相应驱动。
     1.5 CANH与分析仪的CANH连接,CANL与分析仪的CANL连接。这样就组成了CAN网络。
二、配置
     2.1 打开CubeMX软件进行CAN与外部时钟配置
      


    2.2 配置时钟
     


   2.3配置CAN



  准备设置波特率为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 设置 中断
   


  为了能接收数据要开接收中断。
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测试


小结
1.HAL_CAN_Receive_IT(&hcan1,CAN_FIFO0);   //开启中断接收  开始将CAN_FIFO0定错了一直进不了中断

在RX上接收到数据,就是进不了中断。后来才发现FIFO0写错了。
2.后来进行了回调中断但,数据接收不到。是因为
  hcan1.pTxMsg =&TxMessage;         
  hcan1.pRxMsg =&RxMessage;       // 没有进行初始化。



      


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top