imx6芯片通过EIM总线外扩多路sja1000 CAN控制器

有时会需要扩展多个CAN接口,在CAN设备比较多的时候作分组控制。这里使用imx6q芯片,它本身已经自带了两个CAN接口,如果需再扩展4个接口,就要想想办法了。sja1000是一个经典的CAN控制器,稳定可靠,由于它在业界使用方案比较成熟,用它来扩展再好不过。imx6q作为一款性能强大的处理器,扩展sja1000这种相对慢速的芯片,着实有点屈才。可是没办法,项目需要,就像PCIE转ISA,或者USB转PCIE一样,效率并不是最重要的,硬件的兼容性和软件的易维护性同样重要。
这篇文档分硬件部分和软件部分来介绍下imx6q如何来与sja1000芯片组合应用起来,主要实现了通过imx6芯片的eim总线外扩4个sja1000 can控制器的功能。
一、硬件部分
首先来一张sja1000芯片的经典电路,是与8051单片机配合使用的。
这里写图片描述
看到这张图,是不是首先就想到了8051单片机的P0脚,还记得当时刚刚接触51单片机时,还会对P0与P1/P2/P3引脚的特性不同有些困惑。P0脚是3态的,可以应用在地址/数据总线。51单片机就是通过P0接口来扩展些SRAM、ROM啥的。这个电路图中,就是一个典型的外扩SRAM的接法:P0做地址/数据总线,P2.7独立GPIO控制CS脚(CS脚为低SJA1000芯片才工作),ALE/RO/WE是读写控制信号,INT中断脚接到P3.2接口上。从而可以看出,sja1000芯片留给外部的接口就是一个SRAM接口(CPU通过总线读写sja1000芯片的寄存器来控制),只要CPU有能够扩展SRAM的总线接口,那么就能外扩sja1000芯片。那么imx6芯片有没有类似的总线呢?
答案是肯定的,imx6系列芯片功能丰富,性能爆表,区区一个SRAM总线接口,怎会没有。imx6芯片带有WEIM接口,支持16/32bit的地址/数据总线混合模式,不过地址线最高为27bit,这个接口可灵活配置地址/数据端口,支持外接SRAM、NorFalsh和OneNAND等设备,先来看一张典型的imx6芯片的EIM接口图。
这里写图片描述
EIM总线地址总线引脚范围为EIM_DA0_15、EIM_A16_26,数据总线引脚范围为EIM_DA0_15、EIM_D16_31(图中有些引脚没有引出)。sja1000与之相连,可以是地址/数据总线复用的方式,也可以是地址总线与数据总线分离的方式(通过配置地址和数据引脚端口)。从电路简洁性上讲,当然采用复用的方式,就像51单片机的P0接口一样。有些芯片的SRAM接口并不支持地址/数据总线复用,与sja1000芯片相接时需要在电路上加逻辑器件,这个在另一篇文档中再写吧。
imx6芯片手册中指出,EIM总线只支持16/32bit的复用方式,通过EIM_CSnGCR1寄存器来配置,如下图。
这里写图片描述
EIM总线与sja1000这种8位的SRAM接口类型芯片相连,用16bit的multiplexing模式搓搓有余。可以16位的总线来访问8位总线存储器时,会有地址无法对齐的尴尬情况。举个例子说,16位总线读地址0x0000时(忽略基地址),read_byte()读的是D0_7这一组的电平值,读地址0x0001时,read_byte(),读的是D8_15这一组的电平值,反之写操作也是一样。那么16位总线与sja1000相连时,如果只用DA0_7脚,必然导致虽偶地址访问正常,奇地址访问不到的情况。这个也好解决,我们用DA1_8引脚就可以了。整个连接起来如下图的样子。
这里写图片描述
其中EIM_nOE、EIM_nWE和EIM_LBA与51单片机的WR、RD和ALE类似,DA1_8为地址/数据复用总线的0_7位,DA9_12则用来当4个CS信号线用(接了4片SJA1000芯片),EIM总线有CS0_3,不过被其它功能引脚复用占了,这里就只能这么干了。至于RST和INT线,随便找几个GPIO就行。
接下来简单分析下硬件时序,先看sja1000芯片的读时序。
这里写图片描述
从图中可以看出,读操作周期中,主机端先给出要读的地址(AD0_7上产生),然后拉低ALE信号,提示sja1000设备进行地址锁存,拉低CS信号,使能sja1000设备,最后拉低RD信号,释放地址/数据总线。sja1000设备在t_RLQV时间内准备好数据,然后写在数据总线上。主机在t_W/R时间后,拉高RD信号,读取地址/总线上的数据,拉高CS线,完成一个读操作周期。整个读操作周期中WR信号为高。写操作周期与之类似,如下图所示。
这里写图片描述
同样,主机端准备好地址信号,拉低ALE信号、CS信号,然后拉低WR信号,提示sja1000设备将进行写操作。之后主机端在地址/总线上写数据信号,等待t_DVWH后,拉高WR信号线,在t_WHDX时间后释放总线。sja100设备在拉高WR信号的时候进行接收数据。
二、软件部分
这里使用的是3.14.28版本linux内核,由于支持设备树,为驱动程序的编写带来了很多便利。首先修改dts文件,使能WEIM总线,并配置需要用到的功能引脚、GPIO、中断引脚。

&weim {
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_weim>;
    status = "okay";
};
&iomuxc {
        pinctrl_weim: weim1grp {
            fsl,pins = <
                MX6QDL_PAD_EIM_OE__EIM_OE_B         0x9091
                MX6QDL_PAD_EIM_RW__EIM_RW           0x9091
                MX6QDL_PAD_EIM_CS0__EIM_CS0_B       0x9091
                MX6QDL_PAD_EIM_LBA__EIM_LBA_B       0x9091
                /* SJA1000_RST */
                MX6QDL_PAD_EIM_EB0__GPIO2_IO28   
  • 8
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
imx6是NXP公司推出的一款嵌入式处理器,EIM(External Interface Module)总线是它的一种部接口模块。EIM总线驱动是指在使用imx6处理器时,为了能够对EIM总线进行读写操作,需要通过驱动程序来控制该总线EIM总线驱动的开发主要包括以下几个方面: 1. 硬件初始化:首先需要对imx6处理器的EIM总线进行初始化设置,包括时钟控制、引脚映射、中断配置等。 2. 寄存器操作:EIM总线的读写操作都需要通过对相应的寄存器进行读写来实现。驱动程序需要对这些寄存器进行正确的配置和操作,以实现对EIM总线的控制。 3. 数据传输:驱动程序需要实现数据在EIM总线上的传输。这包括数据的读取和写入,以及相应的时序控制和中断处理等操作。 4. 中断处理:当EIM总线发生中断时,驱动程序需要及时处理。这包括中断触发的条件判断、中断控制的设置和中断服务程序的编写等。 5. 错误处理:在使用EIM总线时可能会遇到一些错误情况,如数据传输错误、中断处理错误等。驱动程序需要具备一定的错误处理能力,以保证系统的正常运行和稳定性。 总之,imx6的EIM总线驱动是为了对该处理器上的EIM总线进行控制而开发的一种软件程序。它通过对硬件的初始化、对寄存器的操作、数据传输和中断处理等,实现了对EIM总线的控制和数据传输功能。这样就能够让开发人员在使用imx6处理器时,方便地进行对部设备的读写操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值