通过CAN模块接口,ARM处理器可以直接访问CAN寄存器组,这些寄存器可以配置CAN核心模块、CAN信息处理模块以及访问信息RAM的方式。本系统采用飞利浦公司的TJA1050作为收发器,在CAN接口和CAN总线之间的收发器,作用是将3.3V的逻辑电平转换为CAN的逻辑电平,也就是将发送和接收到的信号转换成CAN总线和ARM可以识别的信号。
4 ARM中CAN模块的软件设计
在构造和特性上,7202的CAN控制器与标准的CAN模块基本没有区别,只是在寄存器的个数与基地址的偏移上有些不同。
如图4,在开始进行总线操作前需要做好4步工作。首先要使能CAN模块,向CAN Enable Register写入0X01,由于ARM的引脚是复用的,所以在使能CAN模块以前,先要将CAN模块占用的引脚切换到特殊模式。然后要初始化CAN模块,主要是正确的配置Command Mask Register,这个寄存器的作用是用来配置CAN模块收发的信息体。接着,配置波特率,通过所想达到的CAN总线波特率,计算出计算公式各个变量的值,而CAN的波特率计算公式如下:(Tseg2+Tseg1+SJW+3)* BRP = CAN_CLK/Fbps。左边的4个变量在BRP寄存器中,而等式右边的CAN_CLK是一个固定值,在这里是48MHz。最后,配置信息存储器,信息体的配置是与具体的应用信息相关的,具体到信息缓冲寄存器组中的每一个寄存器的设置。需要提出的是,前面三步都是在初始化模式下完成的,而最后一步则是在正常模式下进行。在进行完这四部以后,就可以对CAN模块进行操作了。
linux操作系统把对CAN的操作看成是对文件的操作,对于文件,最基本的操作是打开、关闭、读和写。对于CAN模块,读与写操作分别实现接收数据的读取和发送,打开和关闭文件则分别实现CAN模块的一些硬件资源的初始化和释放先前所占有的资源,配置波特率、配置信息模式等配置特性的操作,则由ioctl函数完成的。
static int _int can_init(void)
{
初始化默认波特率、注册驱动程序
}
int can_open(struct inode *inode, struct file *filp)
{
设置CAN工作寄存器、初始化读操作队列、注册CAN模块中断
}
static int can_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
{
根据cmd参数选择相应的操作
}
上面列举出了对CAN操作的初始化、打开、和配置函数,其他的还有读、写、关闭等函数,最后所要实现的功能就是CAN模块中断,在中断中主要完成对于读写位置标志的改变,以实现阻塞型I/O操作,这样,用户通过应用这些操作函数就完成了CAN总线的使用了。
5 本文作者创新点
本设计利用嵌入式系统和CAN总线,实现工程机械的车载监控的集成化、信息化和智能化,通过在嵌入式系统CAN总线的应用,可以方便的实现前端安全监控、电液比例等单元监控,并且可以进行人机交互和图像采集,有很好的应用前景。