![]() |
|
||||||||||||||
| . 网站首页 . 新闻 . 新品 . 方案 . 专访 . 活动 . DSP . EDA . 评测室 . 技术文库 . 会员区 . 商城 . 服务导航 . 邮购 . 资源 . | ||
|
||
|
|||||
| 基于DSP2407 CAN控制器的程序设计举例 | |||||
作者:61IC 文章来源:本站原创 点击数: 更新时间:2007-1-16 ![]() |
|||||
|
CAN控制器的程序设计举例 程序如下: 1.建立中断向量表(汇编) .ref _nothing,_c_int0,_GRIS5 ;声明在其他程序中定义 ;并在本程序中需要使用的变量或标号 .sect ".vectors" ;定义主向量段 RSVECT B _c_int0 ;复位向量 INT1 B _nothing ;中断向量1 INT2 B _nothing ;中断向量2 INT3 B _nothing ;中断向量3 INT4 B _nothing ;中断向量4 INT5 B _GRIS5 ;中断向量5 INT6 B _nothing ;中断向量6 RESERVED B _nothing SW_INT8 B _nothing …… SW_INT31 B _nothing 2.C语言程序 #include "f2407_c.h" // 引用头部文件 int CAN_FLAG; // 定义标志寄存器 void sytem_init(); // 声明在程序中需要用到的函数 void CANMBX_ISR(); void CAN_INIT(); void inline disable() // 中断屏蔽子程序 { asm(" setc INTM"); } void inline enable() // 中断使能子程序 { asm(" clrc INTM"); } (1) 主程序 main() { sytem_init(); // 系统初始化程序 CAN_FLAG=0X00; // 清CAN用户标志,CAN_FLAG=01表示接收到数据 CAN_INIT(); // CAN初始化程序 enable(); // 中断使能 for(;;) { *TCR=0X20; // MBX3请求发送 while(*TCR&0X2000==0) // 等待发送应答 continue; *TCR=0X2000; // 清 TA3 和MIF3标志位 while(CAN_FLAG==0) continue; // 等待接收数据 CAN_FLAG=0; // 清接收到标志 *MDER=0X0000; // 邮箱不使能 *MCR=0X0140; // CDR=1,数据改变请求 *MBX *MBX3B=*MBX2B+1; *MBX *MBX3D=*MBX2D+1; *MCR=0X *MDER=0X } } (2)系统初始化子程序 void sytem_init() { asm(" setc INTM"); asm(" setc SXM"); asm(" clrc OVM"); asm(" clrc CNF"); *IMR=0x0010; // 开中断优先级5 *IFR=0xFFFF; // 清中断标志位 *SCSR1=0x81FE; *WDCR=0xE8; } (3)CAN初始化子程序 void CAN_INIT() { *MCRB=*MCRB|0X *CAN_IFR=0XFFFF; // 清所有CAN中断标志 *LAM1_H=0X7FFF; // 设置邮箱2、3的屏蔽ID寄存器 *LAM1_L=0XFFFF; // 0则ID必须匹配 *MCR=0X1040; // CCR=1 改变配置请求 while(*GSR&0X0010==0)continue; // 当CCE=1 时即可配置 BCR2,BCR1 寄存器 *BCR2=0X01; // 波特率预分频寄存器 *BCR1=0X033; // 波特率设置为 *MCR=*MCR&0XEFFF; // CCR=0 改变配置结束请求 while(*GSR&0X0010!=0)continue; // 只有当CEE=0时,BCR2,BCR1 寄存器配置成功 *MDER=0X040; // 不使能邮箱,邮箱2设为接收方式 *MCR=0X0143; // CDR=1,数据区改变请求 *MSGID2H=0X2447; // 设置邮箱2的控制字及ID // IDE=0, AME=0, AAM=0 // 标准方式为MSGID2H[12-2] *MSGID *MSGCTRL2=0X08; // 设置控制域 // 数据长度DCL = 8,RTR=0 数据帧 *MBX *MBX2B=0X0000; *MBX *MBX2D=0X0000; *MSGID3H=0X2447; // 设置邮箱3的标识符 *MSGID *MSGCTRL3=0X08; // RTR=0,DCL=8 *MBX *MBX3B=0X4433; *MBX *MBX3D=0X8877; *MCR=0X *MDER=0X *CAN_IMR=0XF7FF; // 中断MBX3 不使能 ,MBX2使能,低中断优先级 *CAN_IFR=0XFFFF; // 清全部中断标志 } (4)中断程序 void interrupt GRIS5() // 中断入口程序 { switch(*PIVR) { case 64: CANMBX_ISR(); // 邮箱2接受到相应信息则进入中断服务子程序 break; } } void CANMBX_ISR() // 邮箱2接收中断服务子程序 { *RCR=0X040; // 复位 RMP2 和 MIF2 CAN_FLAG=1; // 置用户接收标志 } void interrupt nothing() // 假中断程序 { } |
|||||
| 欢迎点击进入:TI德州中文网 (国内唯一针对TI应用的中文技术网站) 文章录入:admin 责任编辑:admin | |||||
| 【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 | |||||
| 网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) |
| | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 网站公告 | 管理登录 | | |||
|
|