TMS320F28377X芯片can通信心得笔记(2)——流程细节

2023-05-16

一,前言

补充上一篇文章“TMS320F28377X芯片can通信心得笔记”,之前一直找不到清晰又压缩的方式把图片缩小

二,补充流程如图片和部分代码

在这里插入图片描述
带颜色 和带**号部分为中断配置

1.CAN配置部分代码

在这里插入代码片
//ui32Base为CANb基础地址      CAN_0_CTL为相应的寄存器组群地址      
//CAN_CTL_SWR为相应位十六进制数(特别注意寄存器初始值)

HWREGH(ui32Base + CAN_O_CTL) = CAN_CTL_INIT;  
//1.开启初始化保护(初始化可用)
 HWREGH(ui32Base + CAN_O_CTL) = CAN_CTL_SWR;
 //寄存器软件重启

while(HWREGH(ui32Base + CAN_O_IF1CMD) & CAN_IF1CMD_BUSY) 
 {
    }// 2.Wait for busy bit to clear  等  busy位清除

 HWREGH(ui32Base + CAN_O_IF1CMD + 2) = (CAN_IF1CMD_DIR | CAN_IF1CMD_ARB |  CAN_IF1CMD_CONTROL) >> 16;
//3.设置方向  ,设置if1写仲裁位,设置if1访问控制位(设置可以访问)

 HWREGH(ui32Base + CAN_O_IF1ARB) = 0;
//4.重置if1仲裁寄存器
 HWREGH(ui32Base + CAN_O_IF1ARB + 2) = 0;

 HWREGH(ui32Base + CAN_O_IF1MCTL) = 0; 
//5.重置if1消息对象控制寄存器
 HWREGH(ui32Base + CAN_O_IF1MCTL + 2) = 0;

 HWREGH(ui32Base + CAN_O_IF2CMD + 2) = (CAN_IF2CMD_DIR | CAN_IF2CMD_ARB | CAN_IF2CMD_CONTROL) >> 16;
//设置方向  ,设置if2写仲裁位,设置if2访问控制位(设置可以访问)

 HWREGH(ui32Base + CAN_O_IF1ARB) = 0;
 //重置if2仲裁寄存器 
 HWREGH(ui32Base + CAN_O_IF1ARB + 2) = 0; 

 HWREGH(ui32Base + CAN_O_IF1MCTL) = 0; 
 //重置if2消息对象控制寄存器
HWREGH(ui32Base + CAN_O_IF1MCTL + 2) = 0;

#if(RX_IE)  // 根据需求设置 //***********************************************************************************************
 HWREGH(ui32Base + CAN_O_IF1MCTL) =HWREGH(ui32Base + CAN_O_IF1MCTL) | CAN_IF1MCTL_RXIE; 
//6.中断方向为接收中断(用于配置消息邮箱内的消息对象)***       //消息对象的接收中断使能   选择编译
#elif(TX_IE) 
 HWREGH(ui32Base + CAN_O_IF1MCTL) =HWREGH(ui32Base + CAN_O_IF1MCTL) | CAN_IF1MCTL_TXIE;
#endif

//******************************************************************************************************************
    // CAN_IF1CMD寄存器(0-7bit)为msg_num,当CPU将消息编号写入其中时,开始传输,相当于清空消息邮箱
    //7.初始化消息对象,清空消息对象
    for(iMsg = 1; iMsg <= 32; iMsg+=2)
    {
        while(HWREGH(ui32Base + CAN_O_IF1CMD) & CAN_IF1CMD_BUSY)
        {
        }
       HWREGH(ui32Base + CAN_O_IF1CMD) = iMsg & 0xff;
        while(HWREGH(ui32Base + CAN_O_IF2CMD) & CAN_IF2CMD_BUSY)
        {
        }
        HWREGH(ui32Base + CAN_O_IF2CMD) = (iMsg + 1) & 0xff;
    }
  EALLOW; 
 switch(ui32Base)           // 8.系统时钟配置
    { 
 case CANA_BASE: 
            ClkCfgRegs.CLKSRCCTL2.bit.CANABCLKSEL = 0;
            break;
 case CANB_BASE:
            ClkCfgRegs.CLKSRCCTL2.bit.CANBBCLKSEL = 0;
             break;
 default:
            break;
    } 
 EDIS;

CANBitRateSet(CANB_BASE, 200000000, 1000000);//9.配置canb波特率为1000k

HWREGH(ui32Base + CAN_O_CTL) = HWREGH(ui32Base + CAN_O_CTL) | (CAN_CTL_ABO | CAN_CTL_INIT | CAN_CTL_CCE);
//10.自动开启总线启用,初始化启用,can模块配置更改启用

HWREG_BP(ui32Base + CAN_O_CTL)  = ((HWREG_BP(ui32Base + CAN_O_CTL) | (CAN_CTL_INIT | CAN_CTL_CCE)) &
 ~(CAN_CTL_INIT | CAN_CTL_CCE));
    //11.把 CAN_CTL_INIT 和 CAN_CTL_CCE位 置0

HWREG_BP(ui32Base + CAN_O_CTL) =(HWREG_BP(ui32Base + CAN_O_CTL) | (CAN_CTL_IE0 | CAN_CTL_EIE)) & 
 ~(CAN_CTL_IE0 | CAN_CTL_EIE); 
 //12.把  CAN_CTL_IE0  和 CAN_CTL_EIE  位 置0 
//cpu控制器选择了DSP的CANB模块    以上HWREG为指针函数
//以下的寄存器 地址 和操作数在  hw_can.h内   和hw_memap.h内
//或者查Ti文档(系列详细那本)can模块 自己配置 ,以下不是全部,仅看看构成
#define CAN_CTL_INIT      0x1U       // Initialization
#define CAN_CTL_IE0       0x2U       // Interrupt line 0 Enable
#define CAN_CTL_SIE       0x4U       // Status Change Interrupt Enable
#define CAN_CTL_EIE       0x8U       // Error Interrupt Enable
#define CAN_CTL_DAR       0x20U      // Disable Automatic Retransmission
#define CAN_CTL_CCE       0x40U      // Configuration Change Enable
#define CAN_CTL_TEST      0x80U      // Test Mode Enable
#define CAN_CTL_IDS       0x100U     // Interruption Debug Support Enable
#define CAN_CTL_ABO       0x200U     // Auto-Bus-On Enable
#define CAN_CTL_PMD_S     10U
#define CAN_CTL_PMD_M     0x3C00U    // Parity on/off
#define CAN_CTL_SWR       0x8000U    // SW Reset Enable
#define CAN_CTL_INITDBG   0x10000U   // Debug Mode Status
#define CAN_CTL_IE1       0x20000U   // Interrupt line 1 Enable Disabled

2.CAN中断配置代码

DINT;//1.禁用中断

InitPieCtrl();//2.初始化PIE 控制寄存器

IER=0x0000;  //3.清空中断使能寄存器
IFR=0x0000;  //4.清空中断标志寄存器

InitPieVectTable();//5.初始化PIE中断向量表


//6.    can中断配置//***************************************************************
     while(HWREGH(CANB_BASE + CAN_O_IF1CMD) & CAN_IF1CMD_BUSY) //***
     {
     }//a,等待中断忙位清空

     HWREGH(CANB_BASE + CAN_O_CTL) |= (CAN_CTL_INIT | CAN_CTL_CCE);  //b,开启an初始化   和 启用配置更改

     HWREG_BP(CANB_BASE + CAN_O_CTL)   | = CAN_CTL_IE0 ; 
                                                        //| CAN_CTL_EIE | CAN_CTL_SIE);
                                                            //c,只开启IE0
     CanbRegs.CAN_GLB_INT_CLR.bit.INT0_FLG_CLR = 1;//d,清除CANb中断int0 flag

     HWREG_BP(CANB_BASE + CAN_O_GLB_INT_EN ) = CAN_GLB_INT_EN_GLBINT0_EN;//e,CAN GLB全局中断*******

 EALLOW;
       PieVectTable.CANB0_INT = &IntHandler;  //7.pie 中断向量表canB0中断关联中断函数(链接函数地址)
 EDIS;

PieCtrlRegs.PIEIER9.bit.INTx7 = 1;   //8.pie 控制开启canb0,查PIE通道映射  canb0中断在组群9 位置7
    
 IER |= 0x0100;   // 9.M_INT9  中断使能  使能中断组群9

 EINT;//10.使能中断,开启中断
//*******************************************************************************************************

3.CAN邮箱建立

CAN_Setup_Msg_Obj(&CanbRegs, 17, EXT_ID, TEST_CAN_CONNECT_RX_ID_1, Len_8, MSG_OBJ_RECEIVE);
CAN_Setup_Msg_Obj(&CanbRegs, 18, EXT_ID, TEST_CAN_CONNECT_RX_ID_2, Len_8, MSG_OBJ_RECEIVE);

    //最多可设置32个消息对象    消息邮箱号     是否扩展帧,  消息ID    数据长度  ,消息的方向(接收与发送)
     //创建一个Canb模块  消息邮箱号17,扩展帧,ID为TEST_CAN_CONNECT_RX_ID_1,数据长度为8,方向为接收的  消息邮箱

仅仅做参考,Ti 提供有相应的函数可以拿来用

4.CAN中断注意部分

Uint16 Status;  //这部分必须放在中断函数内,前面
        //CAN中断数据处理
 Status = CanbRegs.CAN_INT.bit.INT0ID;  //触发中断的消息邮箱号

 CanbRegs.CAN_GLB_INT_CLR.bit.INT0_FLG_CLR = 1;  
//清除Interrupt 0 Flag
    if(Status == 0x8000)                            //故障状态
    {
        Status = CanbRegs.CAN_ES.all;               //最低3位为故障码
    }    //cpu读取es才能清楚该寄存器位(只读不能写)
    
PieCtrlRegs.PIEACK.all = PIEACK_GROUP9;//此句放中断函数最后面
//PIE中断确认寄存器  清除中断组群9,允许同组群中断产生(其他或本身)

以上仅是我个人心得,可能不是很适合新人,你还是得翻阅下Ti 提供的技术文件can模块的和 中断相关的(去官网上下)《TMS320F2837xD Dual-Core Microcontrollers Technical Reference Manual》 F2837xD和F2837xS的CAN模块是一样的模式结构, 你若是用的F2837xS你也还是要去下该芯片的技术文件。谢谢

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TMS320F28377X芯片can通信心得笔记(2)——流程细节 的相关文章

  • 四、数据转换、ros-CAN通讯

    1 CAN通讯 1 1驱动安装 1 1 1在我的gitee上下载test功能包 xff0c 将libusbcan so文件复制到 lib 其他位置 计算机 lib 目录下 1 2参考 我另一篇博客一 2 1 3 下载功能包 1 3 1 在我
  • 自动驾驶之——CAN总线简介

    自动驾驶技术之 无人驾驶中的CAN总线 CAN 是Controller AreaNetwork 的缩写 xff0c 中文名为控制器局域网络 xff0c 是ISO国际标准化的串行通信协议 xff0c 是一种用于实时应用的串行通讯协议总线 xf
  • Linux下CAN总线速率设置,socketCAN。

    背景 xff1a 飞思卡尔Freescale的ARM9处理器i MX25系列 socketCAN对于在Linux下操作CAN总线非常的快捷方便 xff0c 其配置方法和在Linux下对网卡的配置相似 xff0c 方法如下 xff1a 1 i
  • 【车载开发系列】CAN总线帧种类介绍篇

    车载开发系列 CAN总线帧种类介绍篇 CAN总线帧种类介绍篇 车载开发系列 CAN总线帧种类介绍篇一 CAN总线当中帧的种类二 五种类型帧用途说明三 数据帧的组成1 xff09 帧起始2 xff09 仲裁段3 xff09 控制段4 xff0
  • 下一代CAN通信技术CAN XL简介

    众所周知 xff0c CAN网络具有易于实现 可扩展 并支持复杂拓扑结构等诸多优点 xff0c 所以目前在各个行业特别是汽车领域 xff0c 得到了非常广泛的应用 但是 xff0c 它也存在着诸多问题 xff0c 其中最大的一点就是总线带宽
  • CAN总线协议:标准CAN和扩展CAN

    CAN通讯协议是一个载波侦听 基于报文优先级碰撞检测和仲裁 xff08 CSMA CD 43 AMP xff09 的多路访问协议 CSMA的意思是总线上的每一个节点在企图发送报文前 xff0c 必须要监听总线 xff0c 当总线处于空闲时
  • 解决ERROR 2003 (HY000): Can’t connect to MySQL server on ‘localhost’ (10061)

    如何解决ERROR 2003 HY000 Can t connect to MySQL server on localhost 10061 1 登录到安装Mysql的主机 xff0c 打开cmd命令行工具 xff0c 执行命令mysql u
  • CAN报文格式简析

    Date xff1a 2022 5 11 Author xff1a MJQ Meta xff1a CAN CAN基础篇 CAN报文格式简析 1 Motornala和Intel格式 建议直接看图 xff0c 小白也能秒懂 xff01 注 xf
  • IMX6ULL与STM32F103的CAN通信实现

    IMX6ULL与STM32F103的CAN通信实现 硬件连接驱动层实现IMX6ULLSTM32F103ZET6 应用层实现IMX6ULLSTM32F103ZET6 结果 在上一篇博文中 xff0c 我们利用USBCAN设备及其上位机软件 x
  • linux-can编程(一)

    建立can的socket int can create socket char name int fd struct sockaddr can addr struct ifreq ifr socklen t len 61 sizeof ad
  • CAN为什么会发送失败

    CAN总线调试过程中出现报文发送失败 xff0c 很多工程师都对此只知其一不知其二 xff0c 这里就CAN报文发送失败的问题我们来做一次探讨 在了解CAN报文为什么会发送失败之前我们先看看一条正确的CAN报文到底应该是怎么样的 xff0c
  • Linux Socket CAN——驱动开发(转)

    Linux Socket CAN驱动开发 一 CAN总线协议 CAN是Controller Area Network 控制器局域网 的缩写 CAN通信协议在1986年由德国电气商博世公司所开发 xff0c 主要面向汽车的通信系统 现已是IS
  • linux的socket CAN驱动介绍

    https blog csdn net linyangspring article details 27186911 在linux中 xff0c CAN总线的驱动有两种实现方式 xff1a 字符设备以及socket can驱动 Socket
  • STM32F042 CAN使用例子

    代码如下 include mycan h CAN初始化 tsjw 重新同步跳跃时间单元 范围 1 3 CAN SJW 1tq CAN SJW 2tq CAN SJW 3tq CAN SJW 4tq tbs2 时间段2的时间单元 范围 1 8
  • CAN接口芯片MCP2515的波特率和滤波器设置问题

    配置波特率代码 MCP2515ByteWrite CNF1 3 MCP2515ByteWrite CNF2 0x80 PHSEG1 3TQ PRSEG 1TQ MCP2515ByteWrite CNF3 PHSEG2 3TQ 功能 波特率的
  • STM32的CAN总线的接收双FIFO使用方法

    通过下面的框图我们可以看到 STM32F013有两个接收FIFO 但是实际的使用中如何让着两个FIFO都被使用呢 解决办法就在这里 1 STM32F103有0 13共14个过滤器组 每个过滤器组都可以绑定指定的FIFO 2 特别需要注意的一
  • CAN 帧ID 与J1939 PGN 转换例子

    在saeJ1939中文版中找的三张图如下 例如 0x18 FE DF 00 110 0 0 11111110 11011111 00000000 P R DP PF PS SA 具体参数即为数据段 0 64 优先级为 P 110 2 或6
  • CAN与CANOpen(一)

    CAN与CANOpen 一 基本概念 CAN与CANOpen 二 报文格式 CAN与CANOpen 三 错误处理 CAN与CANOpen 四 CANOpen对象字典 CAN与CANOpen 五 PDO和SDO CAN与CANOpen 六 网
  • CAN/CANFD 总线负载率及计算(源码和工具)

    CAN BUS的总线负载率是CAN总线架构协议设计时的一个重要的指标 一般建议负载率峰值不要高于80 平均负载率不要超过50 当然这只是一般建议 具体根据使用场景和系统设计而定 负载率定义 关于CAN负载率的定义和计算 很多文章写得不求甚解
  • STM32的CAN标识符过滤器超简单理解

    1 STM32中CAN1与CAN2的过滤器组 103系列14个过滤器组 104 107系列28个过滤器组 CAN FilterInitStructure CAN FilterNumber 0 0 13 2 每组过滤器组有两种工作模式 标识符

随机推荐