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

3 篇文章 0 订阅
2 篇文章 0 订阅

一,前言

补充上一篇文章“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你也还是要去下该芯片的技术文件。谢谢

  • 5
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TMS320F28377DPTP封装是德州仪器(TI)生产的一种数字信号处理器的封装形式。这种封装具有以下特点和用途。 首先,TMS320F28377DPTP采用的是LQFP封装。LQFP是一种表面安装技术,其特点是引脚封装在一个平面上,并且引脚呈四周边缘排列,方便焊接和安装。该封装形式可以帮助设备制造商实现更高的集成度和更小的尺寸。 其次,TMS320F28377DPTP是一款功能强大的数字信号处理器(DSP)。它内置了丰富的处理单元、高速ADC和DAC、丰富的接口、大容量存储器等功能,可以广泛应用于工业自动化、机器人控制、电力电子、通信等领域。封装下载是指将这款DSP芯片烧录程序或固件,使其能够正常工作。 在进行TMS320F28377DPTP封装下载时,首先需要准备一些必要的工具和软件。例如,需要一台支持JTAG或SPI等下载接口的编程器,以及配套的程序下载软件。此外,还需要准备一些连接线和适配器,以便将编程器与目标板连接起来。 然后,按照下载指南或制造商提供的技术手册,将编程器正确连接到TMS320F28377DPTP芯片的下载接口上。此后,通过下载软件,选择需要下载的程序文件,并进行烧录操作。在烧录过程中,需要注意设置好烧录参数,确保下载的程序能够正确适配芯片。 最后,等待烧录过程完成后,断开编程器与芯片的连接,检查下载是否成功。可以通过一些测试程序或者引脚状态来验证芯片功能是否正常。 总之,TMS320F28377DPTP封装下载是将该款数字信号处理器的程序烧录到芯片中的过程,需要合适的工具和软件,并按照制造商提供的指南进行正确操作。这样,TMS320F28377DPTP芯片就能正常工作,发挥其强大的处理能力和丰富的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值