1、 基于 DSP芯片 的 CAN总线通信设计 摘要 本文 介绍 了基于 DSP56F807 的 CAN 通信各模块的 初始化程序,并具体实现了以下功能:甲方通 过串口调试助手 向下位机发送数据 s,再 通过 CAN 总线将数据 传给乙方 增加 乙方 PWM 占空比 (发送 m减小乙方 PWM 占空比), 发送成功 LED1 闪烁两下,然后乙方通过 CAN 总线把当前 PWM 占空比的值返回给甲,然后 甲通过串口将数据传给上位机串口调试助手。 关键字: DSP56800; SCI; CAN 总线; GPIO;定时器 Abstract In this paper, we introduced the
2、 initialization of each module on The Design of CAN Bus Communication Based on DSP56800. The function is realized as follows: through a serial port debug assistant, JIA sends data s to terminal, through the CAN bus again, data sends to YI for increasing the PWM of the terminal(sends m to decrease th
3、e PWM of the terminal). When the data are sent successfully, the LED1 flashes twice, then through the CAN Bus ,YI return the PWM value to JIA, then JIA sends the data to a serial port debug assistant of PC. Key words: DSP56800;SCI; CAN bus;GPIO;the timer 1. CAN总线介绍 MSCAN 模块是一种 CAN 协议的通信控制器。 CAN 总线通信
4、是一种串行通信, 能够通过多种媒介进行最高可达 1Mb/s 的短距离通信,其最远的通信距离为 10km。 CAN 总线的节点数取决于总线驱动电路,目前可以支持 110 个节点 1。 2. 本文实现 效果 甲方通过串口调试助手向下位机发送数据 s,再通过 CAN 总线将数据传给乙方增加乙方 PWM 占空比(发送 m减小乙方 PWM 占空比),发送成功 LED1闪烁两下,然后乙方通过 CAN 总线把当前 PWM 占空比的值返回给甲,然后甲通过串口将数据传给上位机串口调试助手。 3.各功能模块的初始化设置 3.1 CAN 初始化配置编程步骤如下: ( 1) 设置软件复位模式, MSCAN 模式的改变
5、配置 /初始化必须通过复位来实现。CANCTL0=0x0001; ( 2) 设置位时间。位时间 =同步段 +传播时间段 +相位缓存段 1+相位缓存段 2。 同步段:用于各节点同步。 传播时间段:补偿网络物理延时。 相位缓存段 1:补偿沿相位误差。 CANBTR1=0x0023; ( 3) 通过设置同步时间和分频因子设置波特率。 CANBTR0=0x0053; ( 4) 通过接收符 ID 过滤控制寄存器 CANIDAC 设置识别码滤波模式。CANIDAC=0x0000; ( 5) 设置接收符 ID 过滤屏蔽码寄存器 CANIDAR07,在进行接收符 ID 的过滤比较时,接收符 ID 和比较码的那
6、些在屏蔽码寄存器中清零的对应位必须完全相同。因为是实验测试程序,所有的屏蔽码位都为 0,接收所有的数据帧。 . CANIDAR0=0x0020; CANIDAR1=0x0000; CANIDAR2=0x0000; CANIDAR3=0x0000; CANIDAR4=0x0000; CANIDAR5=0x0000; CANIDAR6=0x0000; CANIDAR7=0x0000; ( 6) 设置接收符 ID 过滤比较码寄存器。该寄存器共有 8 个寄存器,这些 16位的寄存器的高 8 位保留,低 8 位是屏蔽位。屏蔽位置 1 表示在进行接收符 ID 过滤比较时,对应的 ID位必须和接收符 ID过
7、滤寄存器的相应位一致。 CANIDMR0=0x0000; CANIDMR1=0x0000; CANIDMR2=0x0000; CANIDMR3=0x0000; CANIDMR4=0x0000; CANIDMR5=0x0000; CANIDMR6=0x0000; CANIDMR7=0x0000; ( 7) 设置发送模式,在调试时采用自发自收模式,最后 实现功能时修改对应寄存器采用互发互收模式。 CANCTL1=0x0080; ( 8) 初始化完成,退出软件复位模式。 CANCTL0=0x0000; ( 9)等待 MSCAN 模块完成和总线同步。 while(!CANCTL0 3.2 CAN 控制
8、器发送模块初始化编程 ( 1)通过 CAN_TBx_IDR0、 CAN_TBx_IDR1 设置发送缓冲接收符 ID 。 CAN_TB0_IDR0=0x0020; CAN_TB0_IDR1=0x0000; CAN_TB1_IDR0=0x0021; CAN_TB1_IDR1=0x0020; CAN_TB2_IDR0=0x0022; CAN_TB2_IDR1=0x0020; ( 2)通过 CAN_TB0_DLR 设置发送缓冲区的数据长度 CAN_TB0_DLR=0x0008; CAN_TB1_DLR=0x0008; CAN_TB2_DLR=0x0008; ( 3)通过 CAN_TBx_DLR , C
9、AN_TBx_TBPR 设置发送缓冲区的优先级。 CAN_TB0_TBPR=0x0020; CAN_TB1_TBPR=0x0010; CAN_TB2_TBPR=0x0030; ( 4)通过 GPR3 设置 MSCAN 接收发送中断级别。 GPR3=0x7500; 3.3 定时器初始化程序 void timerinit(void) GPR10=0x0100; /定时器 0 最低优先级 TMRA0_CTRL=0x0000; /定时器 0 停止计数 TMRA0_CMP1=62500; /为定时器比较寄存器 TMRA0_CMP1 和/TMRA0_CMP2 预置值,该值将与/TMRA0_CNTR 相比
10、较 TMRA0_CMP2=0x0000; TMRA0_LOAD=0xffff; / 初始化计数器的预置值 TMRA0_CNTR=0xffff; /存放定时器模块相应通道的计数值为 0xff TMRA0_SCR =0x0000; / 使能比较寄存器中断 TMRA0_CTRL=0x3e30; /对定时器控制寄存器进行相应设置 定时器的分频因子为 128 分频, 采用 减计数,定时器大约 0.2s 产生一次溢出中断。 3.4 SCI 串口初始化设置 void uartinit(void) SCI0_SCIBR=0x0104; / 设置波特率为 40M/(16*260)=9615.38约为 9600
11、SCI0_SCICR=0x002c; / RFIE=1,RE=1,TE=1,允许 SCI发送。 TEIE=0, /禁止 TDRE 时产生中断 GPR13=0x0030; / 设置中断优先级 3.5 中断及 IO口初始化 void init(void) asm (bfset #$0100,sr); /置 I0 位为 1,非屏蔽中断 asm (bfclr #$0200,sr); /置 I1 位为 0,开可屏蔽中断 IPR=0xfe12; /设置中断待决寄存器,决定哪个引脚产生中断 GPIO_B_PER=0xfff8; 设置外设使能寄存器 GPIO_B_DDR=0xffff; 设置数据方向寄存器 G
12、PIO_B_DR =0x0000; 设置数据寄存器,表明对应口的输入输出状态 4. 主程序及各模块的流程图 开 始各 模 块 初 始 化等 待 各 中 断 发 生图 2-1 主程序流程图 清 中 断 标 志 位将 接 收 缓 冲 区 值 给程 序 接 收 数 组接 收 数 组 装 满 否开 启 定 时 器 中 断使 能 C A N , 进 入 调 试模 式是串 口 中 断 子 程 序结 束 串 口 中 断 子 程 序否图 2-2 串口中断子函数 流程图 清 中 断 标 志 位将 程 序 接 收 数 组 值给 发 送 缓 冲 区将 程 序 接 收 数 组 值清 零允 许 C A N 接 收 中断
13、C A N 发 送 中 断结 束 C A N 发 送 中 断置 进 入 L E D 1 灯 亮 函 数标 志 位图 2-3 CAN 发送中断子函数 流程图 清 中 断 标 志 位开 启 定 时 器 中 断置 进 入 L E D 2 灯 亮函 数 标 志 位C A N 接 收 中 断结 束 C A N 接 收 中 断图 2-4 CAN 接收中断子函数 流程图 L E D 2 亮 置 位 ? L E D 1 亮 置 位判 断 进 入 中 断 次 数是否进 入 定 时 器 溢 出 中 断 翻 转 I O 口 电 平进 中 断 次 数 为 4计 数 清 零复 位 定 时 器 设 置值结 束 定 时 器
14、 溢 出 中 断 否是否否图 2-5 定时器溢出中断子函数 流程图 关于流程图的一些补充: 本流程图只针对甲方向乙方发数据,在调试中要用互发互收方式,相应的接收寄存器和接收缓冲区的赋值见附录中的程序。 对于流程图中指示灯闪烁两下的部分 程序如下: #pragma interrupt saveall void timerISR(void) if(flag=1) switch(time) case 1: GPIO_B_DR=0x0001;break; /让 LED1 亮 case 2: GPIO_B_DR=0x0000;break; /让 LED1 灭 case 3: GPIO_B_DR=0x00
15、01;break; case 4: GPIO_B_DR=0x0000;time=0;TMRA0_SCRflag=0;break; / LED1 闪烁两次,清标志位 if(flag1=1) switch(time) case 1: GPIO_B_DR=0x0002;break; /让 LED2 亮 case 2: GPIO_B_DR=0x0000;break; /让 LED2 灭 case 3: GPIO_B_DR=0x0002;break; case 4: GPIO_B_DR=0x0000;time=0;TMRA0_SCRflag1=0;break; /让 LED2 闪烁两次,清标志位 tim
16、e+; TMRA0_SCR 3.CAN 收发器通信的硬件原理 图 3-1 CAN 收发器通信的硬件原理图 如图所示,总线上的 CAN 信号通过 PCA82C250T的 CAN 收发器转换成 DSP能够识别的 TTL 信号,从 MSCAN_TX 和 MSCAN_RX 端输出 DSP 的 CAN 控制器部分信号线连接到 MSCAN_TX 和 MSCAN_RX 端。 PCA82C250T 的 TXD处是集电极开路的,所以 MSCAN_TX 端要加一个外部上拉电阻。按照该原理图将两个 DSP 板的 CANbus 处对应连接在一起就可以实现 CAN 的互发通信了。 4. 实验结果 在 CodeWarrior IDE 软件的开发集成环境下,完成了程序代码的编写、编译、执行、调试等功能,实现了以下功能:通过串行通信接收到上位机的“串口调试助手”发送一串数据,串口接收成功,定时器控制绿灯闪烁两下,接收到的数据通过 CAN 总线点对点发送到乙方, DSP 收到乙方返回信息红灯闪烁两下。 参考文献: 1 陈新,吴崇理 .DSP56800E 控制器原理及其应用 .电子工业出版社 ,2007. 2 王黎明,夏立等 .CAN现场总线系统的设计与应用。电子工业出版社, 2008.