DEVKIT-mpc5744p配置can通信

软件:S32 Design Studio for Power Architecture Version 2.1
新建工程,配置与生成代码
本文工程下载

can协议

  1. CAN: 控制器局域网络, 异步通信, CAN_H & CAN_L构成一组差分信号线
  2. 闭环总线网络: (ISO11898)标准高速, 短距离闭环网络, 最长40m, 最快1Mbps, 两端有120 Ω \Omega Ω电阻
  3. 开环总线网络: (ISO11519-2)标准低速, 长距离开环网络, 最长1km, 最快125kbps, 两线独立不闭环, 各串2.2 k Ω k\Omega kΩ电阻
  4. 不对节点编码, 对内容编码, 可挂载多节点, 负载足够理论上数量不限, 可通过中继器增强负载
  5. 节点: CAN控制器+CAN收发器

    STM32的CAN片上外设即通讯节点的控制器,需要外接收发器(TJA1050)
  6. 差分信号: 逻辑1(隐形电平), 逻辑0(显性电平)
  7. CAN报文: 对数据, 操作命令, 同步信号进行打包
    1. 数据帧: 传输起始标签+片选标签+控制标签+原始数据段+CRC校验标签+应答标签+传输结束标签
      1. 数据帧: 节点向外传送数据
      2. 遥控帧: 向远端节点请求数据
      3. 错误帧: 向远端节点通知校验错误, 请求重发上一个数据
      4. 过载帧: 通知远端节点:本节点尚未准备好接收
      5. 帧间隔: 将数据帧及遥控帧与前面的帧分离开
    2. 数据帧结构
      1. 帧起始: SOF段, 1位,
    3. 仲裁: 有两个报文要发送, 总线根据哪个数据包能被传输, 发送报文时先出现隐形电平则失去对总线占有权, 仲裁段值越小, 优先级越高
  8. 模式
    1. 正常模式: 可收发
    2. 静默模式: 只能向总线发送隐性位, 监测总线数据
    3. 回环模式: 输出->输入 & 总线, 不能接收总线, 用于自检
    4. 回环静默模式: 自我检查, 不干扰总线

配置

  1. component library中双击添加can pal模块
    在这里插入图片描述

  2. 再在components中双击这个模块,进入配置界面,完成配置
    在这里插入图片描述3. 在pins中初始化can的tx和rx pins (容易忘记这一步!)
    在这里插入图片描述

  3. ctrl+s保存, 生成代码
    在这里插入图片描述

  4. 添加发送邮箱和接受邮箱、报文id

    #define TX_MAILBOX  (1UL)
    #define TX_MSG_ID   (0x300)
    #define RX_MAILBOX  (0UL)
    #define RX_MSG_ID   (0x301)
    
  5. 可以开启定时器中断, 中断发送, 也可以在while延时循环发送

    CAN_Init(&can_pal1_instance, &can_pal1_Config0);    //  初始化 
    
    uint8_t CanCount = 0;   // can计数
    uint8_t SendBuff[8] = {1,2,3,4,5,6,7,8};    //  发送内容
    uint8_t ReceiveCount = 0;   //  接收计数, 可忽略
    
    /*** 发送 ***/
    SendBuff[7] = CanCount; //  末位自加1
    can_buff_config_t buffCfg =  {
            .enableFD = false,
            .enableBRS = false,
            .fdPadding = 0U,
            .idType = CAN_MSG_ID_STD,
            .isRemote = false
    };
    /* Configure TX buffer with index TX_MAILBOX*/
    CAN_ConfigTxBuff(&can_pal1_instance, TX_MAILBOX, &buffCfg);
    /* Prepare message to be sent */
    can_message_t message = {
        .cs = 0U,
        .id = 0x300,    //  发送id, 即TX_MSG_ID
        .data[0] = SendBuff[0],
        .data[1] = SendBuff[1],
        .data[2] = SendBuff[2],
        .data[3] = SendBuff[3],
        .data[4] = SendBuff[4],
        .data[5] = SendBuff[5],
        .data[6] = SendBuff[6],
        .data[7] = SendBuff[7],
        .length = 8U    //  发送数据长度
    };
    CanCount++; //  末位自加1, 可不加
    /* Send the information via CAN */
    CAN_Send(&can_pal1_instance, TX_MAILBOX, &message); //  发送
    
  6. while中循环接收

    while(1)
    {
        can_message_t recvMsg;
        /* Start receiving data in RX_MAILBOX. */
        CAN_Receive(&can_pal1_instance, RX_MAILBOX, &recvMsg);
        /* Wait until the previous FlexCAN receive is completed */
        while(CAN_GetTransferStatus(&can_pal1_instance, RX_MAILBOX) == STATUS_BUSY);
        /* Check the received message ID and payload */
        if(recvMsg.id == 0x301)
        {
            PINS_DRV_TogglePins(PTC,(1 << 13));
            SendBuff[ReceiveCount] = recvMsg.data[0];
            ReceiveCount++;
            if(ReceiveCount > 6)
            {
                ReceiveCount = 0;
            }
        }
    }
    
  7. 编译, debug

FlexCan

#define TX_MAILBOX  (1UL)
#define TX_MSG_ID   (1UL)
void SendCANData(uint32_t mailbox, uint32_t messageId, uint8_t * data, uint32_t len)
{
    /* Set information about the data to be sent
     *  - 1 byte in length
     *  - Standard message ID
     *  - Bit rate switch enabled to use a different bitrate for the data segment
     *  - Flexible data rate enabled
     *  - Use zeros for FD padding
     */
    flexcan_data_info_t dataInfo =
    {
            .data_length = len,
            .msg_id_type = FLEXCAN_MSG_ID_STD
    };

    /* Configure TX message buffer with index TX_MSG_ID and TX_MAILBOX*/
    FLEXCAN_DRV_ConfigTxMb(INST_CANCOM1, mailbox, &dataInfo, messageId);

    /* Execute send non-blocking */
    FLEXCAN_DRV_Send(INST_CANCOM1, mailbox, &dataInfo, messageId, data);
}
FLEXCAN_DRV_Init(INST_CANCOM1, &canCom1_State, &canCom1_InitConfig0);
SendCANData(TX_MAILBOX, TX_MSG_ID, &iuiu, 1UL);
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐