芯教程丨平头哥助力昊芯HX2000系列芯片CAN网络通信

描述

随着能源日益短缺,科技的日趋智能化,复杂高效的多机控制,已日趋成为当今社会迅速发展的必然需求。昊芯顺应时代要求,推出适用于高精度工业自动化运动控制的新版HXS320F28034数字信号处理器DSP,其CAN模块以Mailbox信箱MBOXn控制与传输数据,实现DSP之间的控制指令高效收发,可更有效助力于工程师实现高效的多DSP控制指令收发,广泛应用于电动汽车、风力发电、轨道交通、机器人等高复杂度控制领域。

 

通信

 

自平头哥半导体有限公司的剑池集成开发环境(简称“CDK”)支持HX2000系列芯片调试以来,本期以USB_CAN通信收发实例讲解CAN网络通信功能。

 

HX2000系列CAN模块原理如下图,通过CANMC[CCR]使能进入初始化配置模式,等待CANMC[CCE]置高写入CANBTC位配置波特率;等待CANMC[CCE]拉低,完成初始化;

 

通过Mailbox邮箱MBOXn.MSGCTRL的RTR位配置远程传输请求,TPL位配置MBOXn传输优先级,DLC位配置传输0~8个字节,传输过程如下:

1.CAN总线通过CAN传输芯片向CAN发送数据,使能CANRIOC[RXFUNC]打开接收线,接收来自GPIOMUX所定义CANRX接收引脚上的数据,装载到缓冲区Receive Buffer;

 

2.通过CANMD[MDn]配置Mailbox邮箱MBOXn为接收,使能CANME[MEn]打开邮箱MBOXn,接收来自缓冲区中的数据;

 

3.全局中断标志的设置取决于CANGIM寄存器中GIL位的设置。如果设置了该位,则全局中断在CANGIF1寄存器中设置位;否则,在CANGIF0寄存器中设置。通过CANMIM[MIMn]配置接收掩码中断使能;通过CANMIL[MILn]配置,将MBOXn接收中断,映射到中断ECAN0INTA或ECAN1INTA;使能CANGIM[I0EN/I1EN]打开中断信号,MBOXn接收到数据时,将产生一个接收中断,使CANGIF0/1[MIV0/1]中相应接收邮箱MBOXn的邮箱号置位;通过PIE响应CPU执行接收中断程序:

(1)置位CANRMP[RMPn]挂起MBOXn邮箱,以防止瞬间接收到多组数据;

(2)通过CANGIF0/1[MIV0/1],确认接收到数据邮箱为MBOXn,并读取接收的数据;

(3)置位CANRMP[RMPn]清除邮箱MBOXn挂起状态,准备接收下一组数据。

 

通信

 

通信

 

4.通过CANMD[MDn]配置另一Mailbox邮箱MBOXn为发送,使能CANME[MEn]打开发送邮箱,使能CANTRS[TRSn]启动发送邮箱,发送数据到缓冲区 Transmit Buffer;

 

5.使能CANTIOC[TXFUNC]打开发送线,通过GPIOMUX所定义CANTX发送引脚将缓冲区Transmit Buffer数据发送到CAN总线。

 

 

 

由此设计通过USB_CAN分析仪将昊芯HXS320F28034芯片与上位机软件通讯实例:采用昊芯HXS320F28034芯片、CAN收发器与USB_CAN分析仪,通过USB_CAN网络调试上位机软件,向CPU发送任意一组数据,CPU接收所发送的数据,硬件连接如下图所示:

 

通信

 

基于以上分析,在CDK上开发CAN通信程序,代码包括:CAN的GPIO配置、初始化参数配置、CAN发送程序与接收中断服务程序,主程序调用执行。主要代码如下:

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
1.int main(void)
2.{
3.    InitSysCtrl();//系统时钟初始化
4.    CAN_Init();//CAN的初始化参数配置
5.    InitECanaGpio();//CAN的Gpio引脚配置
6.    EALLOW;
7.    ECanaRegs.CANMIM.bit.MIM0=1;//打开接收掩码,接收到数据触发中断
8.    ECanaRegs.CANMIL.bit.MIL0 = 0;   // 选择EcanA中断0
9.    ECanaRegs.CANGIM.bit.I0EN = 1;  // 使能中断0
10.    PieVectTable.ECAN0INTA = &eCanRxIsr;  // CANA 0接收中断入口
11.    EDIS;
12.    PieCtrlRegs.PIEIER9.bit.INTx5 = 1;  // 使能ECAN1中断
13.    IER |= M_INT9;  // Enable CPU INT9
14.    EINT;
15.    while(1){
16.     CAN_Tx();//发送数据
17.    }
18. return 0;
19.}

其中,CAN的初始化参数配置代码为:

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
1.void CAN_Init()
2.{
3.    volatile struct ECAN_REGS ECanaShadow;
4.    EALLOW;
5.    /* 配置RX与TX引脚*/
6.    ECanaShadow.CANTIOC.all = P_ECanaRegs->CANTIOC.all;
7.    ECanaShadow.CANTIOC.bit.TXFUNC = 1;
8.    P_ECanaRegs->CANTIOC.all = ECanaShadow.CANTIOC.all;
9.    ECanaShadow.CANRIOC.all = P_ECanaRegs->CANRIOC.all;
10.    ECanaShadow.CANRIOC.bit.RXFUNC = 1;
11.    P_ECanaRegs->CANRIOC.all = ECanaShadow.CANRIOC.all;
12.    /* 清RMPn, GIFn 位 */
13.   P_ECanaRegs->CANRMP.all = 0xFFFFFFFF;
14.    /* 清中断标志 */
15.   P_ECanaRegs->CANGIF0.all = 0xFFFFFFFF;
16.   P_ECanaRegs->CANGIF1.all = 0xFFFFFFFF;
17.
18.    /* 初始化配置,写入CAN波特率*/
19.    ECanaShadow.CANMC.all = P_ECanaRegs->CANMC.all;
20.    ECanaShadow.CANMC.bit.CCR = 1 ;            // Set CCR = 1
21.    P_ECanaRegs->CANMC.all = ECanaShadow.CANMC.all;
22.    ECanaShadow.CANES.all = P_ECanaRegs->CANES.all;
23.    do
24.    {
25.        ECanaShadow.CANES.all = P_ECanaRegs->CANES.all;
26.    } while(ECanaShadow.CANES.bit.CCE != 1 );    // Wait for CCE bit to be set..
27.    //Bit rate=SYSCLKOUT/2/{(BRP+1)*[(TSEG1+1)+(TSEG2+1)+1,
28.    //TSEG1≥3,TSEG2≥2
29.    ECanaShadow.CANBTC.bit.BRPREG = 2;
30.    ECanaShadow.CANBTC.bit.TSEG2REG = 4;
31.    ECanaShadow.CANBTC.bit.TSEG1REG = 13;
32.    P_ECanaRegs->CANBTC.all = ECanaShadow.CANBTC.all;
33.    ECanaShadow.CANMC.all = P_ECanaRegs->CANMC.all;
34.    ECanaShadow.CANMC.bit.CCR = 0 ;            // Set CCR = 0
35.    P_ECanaRegs->CANMC.all = ECanaShadow.CANMC.all;
36.    ECanaShadow.CANES.all = P_ECanaRegs->CANES.all;
37.    do
38.    {
39.        ECanaShadow.CANES.all = P_ECanaRegs->CANES.all;
40.    } while(ECanaShadow.CANES.bit.CCE != 0 );  // Wait for CCE bit to be  cleared..
41.
42.    /* 屏蔽所有信箱寄存器*/
43.    // Required before writing the MSGIDs
44.    P_ECanaRegs->CANME.all = 0;
45.    /* 配置MBOX1的MSGID*/
46.    P_ECanaMboxes->MBOX1.MSGID.all = 0x00040000;    
47.    P_ECanaMboxes->MBOX0.MSGID.all = 0x00040000;
48.    /* 配置 MBOX1/MBOX0的传输字节为2 */
49.    ECanaMboxes.MBOX1.MSGCTRL.bit.DLC = 0x2;
50.    ECanaMboxes.MBOX0.MSGCTRL.bit.DLC = 0x2;
51.    /* 配置 MBOX0 为接收,MBOX1为发送 */
52.    ECanaRegs.CANMD.bit.MD0=1;
53.    ECanaRegs.CANMD.bit.MD1=0;
54.    /*使能 MBOX0 and MBOX1 */
55.   ECanaRegs.CANME.bit.ME0=1;
56.   ECanaRegs.CANME.bit.ME1=1;
57.   //挂起接收邮箱,以触发接收中断
58.   if(ECanaRegs.CANRMP.bit.RMP0==0)
59.   {
60.        ECanaRegs.CANRMP.bit.RMP0=1;
61.   }
62.    EDIS;
63.    return;
64.}

CAN的发送程序代码为:

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
1.void CAN_Tx(void)
2.{
3.    //等待MBOX0接收成功,读取消息
4.    while(ECanaRegs.CANRMP.bit.RMP0!=1){}
5.    ECanaMboxes.MBOX1.MDL.byte.BYTE0 = (receive_data&0xff);
6.    ECanaMboxes.MBOX1.MDL.byte.BYTE1 = ((receive_data>>8)&0xff);
7.
8.    ECanaRegs.CANTRS.bit.TRS1 = 1;//发送MBOX1数据到MBOX0
9.}

 

CDK上开发CAN通信收发程序,其编译结果为:

 

通信

 

编译通过后,就可以开始调试了,调试后,可通过USB_CAN网络通信软件,查看发送与接收到的数据如下图:

 

通信

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 相关推荐
  • 热点推荐
  • 通信

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分