基于MCUIO和SJA1000的CAN数据收发方法与流程

文档序号:24120391发布日期:2021-03-02 11:00阅读:80来源:国知局
基于MCUIO和SJA1000的CAN数据收发方法与流程
基于mcu io和sja1000的can数据收发方法
技术领域
[0001]
本发明属于can总线收发技术领域,具体涉及一种基于mcu io和sja1000的can数据收发方法,应用于光电产品的对外通信。


背景技术:

[0002]
can总线作为一种可靠、灵活的总线技术,在工业控制中得到了广泛的应用,但是目前一些低端的mcu芯片并没内置的can收发控制器,还有一些mcu虽有内置的can控制器并不是很稳定,而且低端mcu没有并行数据接口或者被占用,而io是所有mcu必备的接口,因此为提高can总线的应用范围,采用io和独立的can控制器进行can数据的传输。sja1000是一款成熟可靠的独立can控制器,io是mcu芯片的基础管脚,其电平可置为高或者低,采用io电平的高低可以用来控制sja1000的控制管脚,另外采用8个io模拟并行数据/地址接口,用于sja1000和mcu的数据和地址的传输,因此采用mcu的io与sja1000的组合,即可完成can总线数据的收发控制。使用io和sja1000进行can总线数据的收发,利用对io口电平控制模拟地址、数据、控制信号,并且要合理地安排不同信号之间的时序、方向、电平等。


技术实现要素:

[0003]
要解决的技术问题
[0004]
为了解决现有的光电产品对外的can总线信息传输慢、不稳定的问题,本发明提出一种基于mcu io和sja1000的can数据收发方法。
[0005]
技术方案
[0006]
一种基于mcu io和sja1000的can总线数据收发方法,其特征在于所采用的电路包括mcu、sn74lvc4245a、sja1000、ctm8251芯片,其中mcu的pb0~pb5连接sja1000的控制管脚cs、ale、rd、wr、rst、int,mcu的pa8、pa9连接sn74lvc4245a的使能管脚oe和方向控制管脚dir,mcu的pa0~pa7连接sn74lvc4245a的数据管脚1ad0~1ad7;sn74lvc4245a的数据管脚2ad0~2ad7与sja1000的地址/数据管脚ad0~ad7连接,sja1000的接收管脚rx和发送管脚tx分别与ctm8251的发送管脚和接收管脚相连,而ctm8251连接外部can总线设备的canh、canl、cang,用以完成光电产品和外部设备的通信交换;步骤如下:
[0007]
步骤1:进行mcu的上电复位,等待包括sja1000在内的其它电路上电,配置与sja1000控制管脚和sn74lvc4245a输入控制管脚相连的io管脚,配置其输入输出方向以及默认电平大小;
[0008]
步骤2:初始化sja1000,sja1000的初始化只能在复位模式的情况下初始化,需要将rst管脚电平拉低;
[0009]
步骤3:配置输入输出缓冲器以及相关的状态寄存器和命令寄存器即可完成can总线数据的收发。
[0010]
本发明技术方案更进一步的说:步骤2中sja1000的初始化如下:
[0011]
1)sja1000进入复位模式,即rst置为低电平,复位有效,读取状态寄存器数据,确
定已进入复位模式;
[0012]
2)设置时钟频率,向时钟分频寄存器写入分频数值,然后读取此寄存器数值,以保证写入正确;
[0013]
3)设置波特率,向波特率寄存器写入波特率数值,然后读取波特率寄存器数值,以保证写入正确;
[0014]
4)设置验收代码和屏蔽,分别向验收代码寄存器和验收屏蔽寄存器写入配置数据,然后读取此寄存器数值,以保证写入正确;
[0015]
5)设置输出控制,向输出控制寄存器写入配置数据,然后读取此寄存器数值,以保证写入正确;
[0016]
6)sja1000退出复位模式,即rst置为高电平,复位无效并进入工作模式,读取状态寄存器确保已经退出复位模式。
[0017]
本发明技术方案更进一步的说:步骤3中can总线数据发送如下:
[0018]
1)读取sja1000的状态寄存器,如果状态寄存器的接收状态为1即为正在接收,发送缓冲器状态为0即为锁定,则需要等待直到接收状态为0,发送缓冲器状态为1;
[0019]
2)向发送缓冲器的描述符区的第一个地址区0x10写入帧信息字节,依次向发送缓冲器的描述符区第二到第五字节区0x11-0x14写入识别码;
[0020]
3)向发送缓冲区数据区写入数据;
[0021]
4)向命令寄存器,写入0x01命令。
[0022]
本发明技术方案更进一步的说:步骤3中can总线数据接收如下:
[0023]
1)读取sja1000的状态寄存器,如果状态寄存器的接收状态为1即为正在接收,接收缓冲器状态为0即为无可用数据,则需要等待直到接收状态为0,接收缓冲器状态为1;
[0024]
2)读取0x10到0x22依次读取数据;
[0025]
3)向sja1000命令寄存器写入0x04的命令,释放接收缓冲器;
[0026]
4)延迟10个计数周期;
[0027]
5)向sja1000命令寄存器写入0x00的命令,初始化命令寄存器。
[0028]
本发明技术方案更进一步的说:对sja1000的任何操作均需要通过对寄存器的读写完成。
[0029]
本发明技术方案更进一步的说:向寄存器写数据具体如下:
[0030]
1)使能sn74lvc4245芯片,数据方向设置为mcu数据到sja1000;
[0031]
2)置sja1000输入锁存信号ale为高,使锁存有效;
[0032]
3)将需要写入的寄存器8位地址按位赋给io管脚pa0~pa7,并将pa0~pa7设置为输出;
[0033]
4)延迟10个时钟周期;
[0034]
5)置sja1000输入锁存信号ale为低,使锁存无效;
[0035]
6)置sja1000片选信号cs为低,使片选有效;
[0036]
7)置sja1000写信号wr为低,写有效;
[0037]
8)将需要写的8位数据按位赋给io管脚pa0~pa7;
[0038]
9)延迟10个时钟周期;
[0039]
10)置sja1000写信号wr为高,写无效;
[0040]
11)延迟10个时钟周期;
[0041]
12)置sja1000片选信号cs为高,使片选无效;
[0042]
13)关闭sn74lvc4245芯片使能。
[0043]
本发明技术方案更进一步的说:向寄存器读数据具体如下:
[0044]
1)使能sn74lvc4245芯片,数据方向设置为mcu数据到sja1000;
[0045]
2)置sja1000输入锁存信号ale为高,使锁存有效;
[0046]
3)将需要读入的寄存器8位地址按位赋给io管脚pa0~pa7;
[0047]
4)延迟10个时钟周期;
[0048]
5)置sja1000输入锁存信号ale为低,使锁存无效;
[0049]
6)置sja1000片选信号cs为低,使片选有效;
[0050]
7)sn74lvc4245芯片数据方向设置为sja1000数据到mcu;
[0051]
8)置sja1000读信号rd为低,读有效;
[0052]
9)延迟10个时钟周期;
[0053]
10)stm32 io管脚pa0~pa7设置为输入,读取pa0~pa7的值,组合即为需要读取的数据;
[0054]
11)置sja1000写信号rd为高,读无效;
[0055]
12)置sja1000片选信号cs为高,使片选无效;
[0056]
13)关闭sn74lvc4245芯片使能
[0057]
有益效果
[0058]
本发明提出的一种基于mcu io和sja1000的can数据收发方法,利用了mcu的io和sja1000以及相关芯片完成了can总线数据收发的硬件电路,借助了io的高低电平完成对sja1000的控制,利用8个io口模拟地址、数据,完成对sja1000寄存器的读写,在此基础上合理优化控制顺序、安排数据方向完成sja1000的初始化设置以及can数据的发送和接收,实现了光电产品对外的can总线信息的稳定传输。
[0059]
采用本发明的硬件连接方法简单明了,应用广阔,只要mcu的io管脚足够,不要内置can模块也不需要并行接口,均可以采用此种硬件连接方法,可广泛应用于光电产品的对外信息传输。此种硬件连接方法简单可靠,综合成本低。数据收发算法清晰,易于移植且鲁棒性高。
附图说明
[0060]
图1为本发明的硬件连接示意图;
[0061]
图2为本发明的sja1000芯片内部组成框图;
[0062]
图3为本发明的算法总体流程图;
[0063]
图4为本发明的sja1000初始化流程图;
[0064]
图5为本发明的数据发送流程图;
[0065]
图6为本发明的数据接收流程图。
具体实施方式
[0066]
现结合实施例、附图对本发明作进一步描述:
[0067]
本发明利用mcu的io和sja1000等芯片搭建基于can总线收发电路,设计算法实现光电产品can总线数据的收发。最终实现低成本的can总线数据的收发,以及降低can总线应用的硬件限制,使得不具备内嵌can模块的mcu,以及不具备并行数据接口的mcu芯片也可以完成can总线数据的收发,扩大can总线的应用范围。
[0068]
采用了can独立控制器sja1000作为can总线数据收发的核心器件。ctm8251将can总线的数据转为sja1000可接收的数据形式。mcu部分io管脚连接sja1000的控制管脚,控制sja1000的片选、读、写、锁存等操作,另一部分io管脚通过sn74lvc4245a连接sja1000的数据/地址管脚,用于can总线数据的收发。sn74lvc4245a用于控制mcu和sja1000的数据传输方向,从而完成地址数据复用总线的数据传输。
[0069]
如图1所示,利用mcu、sn74lvc4245a、sja1000、ctm8251芯片搭建硬件电路,此电路内嵌于光电设备内部的对外通信电路板中。其中mcu的pb0~pb5连接sja1000的控制管脚cs、ale、rd、wr、rst、int,mcu的pa8、pa9连接sn74lvc4245a的使能管脚oe和方向控制管脚dir,mcu的pa0~pa7连接sn74lvc4245a的数据管脚1ad0~1ad7。sn74lvc4245a的数据管脚2ad0~2ad7与sja1000的地址/数据管脚ad0~ad7连接,sja1000的接收管脚rx和发送管脚tx分别与ctm8251的发送管脚和接收管脚相连,而ctm8251连接外部can总线设备的canh、canl、cang,用以完成光电产品和外部设备的通信交换。
[0070]
sja1000是一个独立的can控制器,它在汽车和普通的工业应用上有先进的特征,sja1000有一系列先进的功能适合于多种应用,特别在系统优化诊断和维护方面非常重要。
[0071]
sja1000具有两种工作模式,一种是basiccan,一种是pelican(支持can 2.0b协议),本发明使用业界使用最为广泛的pelican模式,basiccan模式相对pelican较为简单,可根据本发明进行移植修改。
[0072]
sja1000接收ctm8251收到的数据,并将数据转换8为并行口数据,另外可以将sja1000输入的8位并行口数据转化为串行的发送数据。
[0073]
sja1000主要由接口管理、收发模块、振荡器、复位模块组成,接口管理模块完成对外部主控制器的连接,其管脚分为控制管脚和地址/数据管脚,其中地址/数据管脚为复用管脚,控制管脚主要包括片选、锁存、度、写等,其主要管脚具体定义如下表:
[0074]
[0075]
sn74lvc4245a是一款具有三态输出的八路总线收发器和3.3v-5v的移位器,其具有双向导通功能,可用于收也可用于发,其通过方向管脚(dir)控制数据的方向,可将数据由5v电平转换到3.3v的电平。sn74lvc4245a的数据控制如下表所示。
[0076][0077]
ctm8251高速can隔离收发器,其将can总线上的差分数据转换为单独收和单独发的数据,并具有前后隔离作用。
[0078]
mcu芯片可为市面上常用的mcu芯片,采用不同的mcu芯片是需要考虑mcu io口的电平特性,如果电平与sja1000不匹配,应增加电平匹配芯片,例如74系列的电平匹配芯片。
[0079]
如图3所示,为本发明数据收发流程,首先进行mcu的上电复位,等待包括sja1000在内的其它电路上电,配置与sja1000控制管脚和sn74lvc4245a输入控制管脚相连的io管脚,配置其输入输出方向以及默认电平大小。下一步初始化sja1000,sja1000的初始化只能在复位模式的情况下初始化,需要将rst管脚电平拉低。初始化之后,再配置输入输出缓冲器以及相关的状态寄存器和命令寄存器即可完成can总线数据的收发。
[0080]
首先应对sja1000进行初始化,设置时钟频率、波特率、验收代码和屏蔽、输出控制等。发送数据时首先读取状态寄存器状态,若允许发送,则设置帧信息字节和识别码,并将发送数据写入发送缓冲器,向命令寄存器写入发送命令,则sja1000自动将数据发送。读取can总线数据与发送类似,首先读取状态寄存器,若允许接收,则到接收缓冲寄存器依次读取数据,读取完成释放接收缓冲器即可。基于io和sja1000的can总线数据接收的核心在于使用io完成对sja1000寄存器的读写。
[0081]
sja1000是一种基于内存编址的i/o设备的微控制器,设备的独立操作是通过对片内ram寄存器的修正来实现的,因此对sja1000的任何操作均需要通过对寄存器的读写完成,首先介绍基于io口的寄存器的读写算法。由于数据和地址为复用总线,因此如果需要对某一个寄存器进行操作,首先应对这个寄存器写地址操作,将寄存器地址写入sja1000,然后控制sja1000的ale管脚锁存地址,最后根据需要对这个寄存器的数据进行写或者读操作。
[0082]
向寄存器写数据
[0083]
1)使能sn74lvc4245芯片,数据方向设置为mcu数据到sja1000;
[0084]
2)置sja1000输入锁存信号ale为高,使锁存有效;
[0085]
3)将需要写入的寄存器8位地址按位赋给io管脚pa0~pa7,并将pa0~pa7设置为输出;
[0086]
4)延迟10个时钟周期;
[0087]
5)置sja1000输入锁存信号ale为低,使锁存无效;
[0088]
6)置sja1000片选信号cs为低,使片选有效;
[0089]
7)置sja1000写信号wr为低,写有效;
[0090]
8)将需要写的8位数据按位赋给io管脚pa0~pa7;
[0091]
9)延迟10个时钟周期;
[0092]
10)置sja1000写信号wr为高,写无效;
[0093]
11)延迟10个时钟周期;
[0094]
12)置sja1000片选信号cs为高,使片选无效;
[0095]
13)关闭sn74lvc4245芯片使能。
[0096]
从寄存器读数据
[0097]
1)使能sn74lvc4245芯片,数据方向设置为mcu数据到sja1000;
[0098]
2)置sja1000输入锁存信号ale为高,使锁存有效;
[0099]
3)将需要读入的寄存器8位地址按位赋给io管脚pa0~pa7;
[0100]
4)延迟10个时钟周期;
[0101]
5)置sja1000输入锁存信号ale为低,使锁存无效;
[0102]
6)置sja1000片选信号cs为低,使片选有效;
[0103]
7)sn74lvc4245芯片数据方向设置为sja1000数据到mcu;
[0104]
8)置sja1000读信号rd为低,读有效;
[0105]
9)延迟10个时钟周期;
[0106]
10)stm32 io管脚pa0~pa7设置为输入,读取pa0~pa7的值,组合即为需要读取的数据;
[0107]
11)置sja1000写信号rd为高,读无效;
[0108]
12)置sja1000片选信号cs为高,使片选无效;
[0109]
13)关闭sn74lvc4245芯片使能。
[0110]
(1)sja1000的初始化
[0111]
sja1000的初始化流程如图4。
[0112]
1)sja1000进入复位模式,即rst置为低电平,复位有效,读取状态寄存器数据,确定已进入复位模式;
[0113]
2)设置时钟频率,向时钟分频寄存器写入分频数值,然后读取此寄存器数值,以保证写入正确;
[0114]
3)设置波特率,向波特率寄存器写入波特率数值,然后读取波特率寄存器数值,以保证写入正确;
[0115]
4)设置验收代码和屏蔽,分别向验收代码寄存器和验收屏蔽寄存器写入配置数据,然后读取此寄存器数值,以保证写入正确;
[0116]
5)设置输出控制,向输出控制寄存器写入配置数据,然后读取此寄存器数值,以保证写入正确;
[0117]
6)sja1000退出复位模式,即rst置为高电平,复位无效并进入工作模式,读取状态寄存器确保已经退出复位模式。
[0118]
(2)can总线数据发送算法
[0119]
数据发送流程图见图5。
[0120]
1)读取sja1000的状态寄存器,如果状态寄存器的接收状态为1(正在接收),发送缓冲器状态为0(锁定),则需要等待直到接收状态为0,发送缓冲器状态为1;
[0121]
2)向发送缓冲器的描述符区的第一个地址区(0x10)写入帧信息字节,依次向发送
缓冲器的描述符区第二到第五字节区(0x11-0x14)写入识别码;
[0122]
3)向发送缓冲区数据区写入数据;
[0123]
4)向命令寄存器,写入0x01命令。
[0124]
(3)can总线数据接收算法
[0125]
数据接收流程图见图6。
[0126]
1)读取sja1000的状态寄存器,如果状态寄存器的接收状态为1(正在接收),接收缓冲器状态为0(无可用数据),则需要等待直到接收状态为0,接收缓冲器状态为1;
[0127]
2)读取0x10到0x22依次读取数据;
[0128]
3)向sja1000命令寄存器写入0x04的命令,释放接收缓冲器;
[0129]
4)延迟10个计数周期;
[0130]
5)向sja1000命令寄存器写入0x00的命令,初始化命令寄存器。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1