一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

基于单片机实现1553B总线通信的方法及系统与流程

2021-11-03 20:47:00 来源:中国专利 TAG:

基于单片机实现1553b总线通信的方法及系统
技术领域
1.本发明涉及单片机与外围芯片的通信的技术领域,具体地,涉及基于单片机实现1553b总线通信的方法及系统,尤其涉及一种基于单片机实现1553b总线通信的方法。


背景技术:

2.1553b总线是美国空军电子子系统联网的标准总线,该总线具有极高的可靠性,在航空航天等军事领域具有广泛的应用。1553b总线的消息是由多个16位的字组成,速度快,效率高。但目前很多航天产品用单片机来作为总控cpu,只有8位数据总线,在单片机内部一般按字节处理,因为单片机对数据位的处理不灵活,这些接收的数据不会再转化成16位,这势必造成了数据处理上的局限。对于收到的指令,一般是利用终端结合last command寄存器,这样的处理方式,如果在有中断嵌套并且1553b接口芯片的优先级不高的时候,有可能会有丢失指令的风险。
3.在公告号为cn102447600b的专利文献中公开了一种本发明异步通信方式,具体地说,涉及一种无时钟同步信号单片机实现homebus总线通信的方法,提供了一种用不具有同步时钟输出异步通信的单片机,在异步通信时用单片机内部pwm信号模拟出同步时钟信号,实现homebus总线通信,从而可以随意的选择单片机实现homebus通信,而不必局限于h8系列和富士通系列单片机的无时钟同步信号单片机实现homebus总线通信的方法,单片机设置为具有pwm输出功能的单片机,单片机的rxd、txd、pwm端口分别和homebus的rxd、txd、sck端口连接。
4.针对上述中的相关技术,发明人认为存在数据处理效率低且灵活性低的问题,因此,需要提出一种技术方案以改善上述技术问题。


技术实现要素:

5.针对现有技术中的缺陷,本发明的目的是提供一种基于单片机实现1553b总线通信的方法及系统。
6.根据本发明提供的一种基于单片机实现1553b总线通信的方法,包括单片机对1553b芯片读操作方法,所述单片机对1553b芯片读操作方法包括如下步骤:
7.步骤s1:先读高8位,设置msb_lsbn=
‘1’
,进行“哑读”操作,数据丢弃;
8.步骤s2:等待一段时间;
9.步骤s3:设置msb_lsbn=
‘0’
,读低地址,存入共用体rtdata的高字节rtdata.bytedata[1];
[0010]
步骤s4:设置msb_lsbn=
‘1’
,读高地址,存入共用体的低字节rtdata.bytedata[0];
[0011]
步骤s5:函数返回值是共用体的字rtdata.worddata。
[0012]
优选地,所述步骤s5中的函数通过访问外部地址,完成哑读操作,等待一段时间后,分别读取高低字节,存放到共用体rtdata中;获取字节操作从低地址开始,将获取的字
节从高到低存放。
[0013]
优选地,所述单片机实现1553b总线通信的方法还包括获得指令堆栈的数据块指针方法,所述指令堆栈的数据块指针方法包括如下步骤:
[0014]
步骤1:读取指令堆栈的指针;
[0015]
步骤2:将指令堆栈的指针与定义的变量比较;
[0016]
步骤3:判断比较的内容是否一致;
[0017]
步骤4:若不一致,则读取该消息块中的接收指令字received command word,作为新的指令内容,存放到相应的union变量中;
[0018]
步骤5:对变量加4;
[0019]
步骤6:重复步骤1

步骤5,直到变量与指令堆栈的指针一致,所有新的指令都被读到并且保存下来,没有遗漏。
[0020]
优选地,所述步骤4包括如下步骤:
[0021]
步骤4.1:根据消息块的指令信息,识别出哪个数据块,是遥控还是遥测,调用不同的程序段;
[0022]
步骤4.2:根据该数据块占用的长度循环取数,取到的数存入某共用体;
[0023]
步骤4.3:对共用体中的数据进行包头判断,如果不正确即退出这个模块,执行步骤5;
[0024]
步骤4.4:如果包头判断正确,对各个数据进行模255的iso校验,直到所有的数据都校验完毕;校验正确后提取有效的阀门控制指令存入相应的寄存器后退出该模块,执行步骤5;如果发现iso校验错误,直接退出模块,执行的步骤5。
[0025]
优选地,所述步骤5中的每个消息块占4个字单元,在取完上一条指令后,要对变量加4。
[0026]
本发明还提供一种基于单片机实现1553b总线通信的系统,包括单片机对1553b芯片读操作系统,所述单片机对1553b芯片读操作系统包括如下模块:
[0027]
模块m1:先读高8位,设置msb_lsbn=
‘1’
,进行“哑读”操作,数据丢弃;
[0028]
模块m2:等待一段时间;
[0029]
模块m3:设置msb_lsbn=
‘0’
,读低地址,存入共用体rtdata的高字节rtdata.bytedata[1];
[0030]
模块m4:设置msb_lsbn=
‘1’
,读高地址,存入共用体的低字节rtdata.bytedata[0];
[0031]
模块m5:函数返回值是共用体的字rtdata.worddata。
[0032]
优选地,所述模块m5中的函数通过访问外部地址,完成哑读操作,等待一段时间后,分别读取高低字节,存放到共用体rtdata中;获取字节操作从低地址开始,将获取的字节从高到低存放。
[0033]
优选地,所述单片机实现1553b总线通信的系统还包括获得指令堆栈的数据块指针系统,所述指令堆栈的数据块指针系统包括如下模块:
[0034]
模块1:读取指令堆栈的指针;
[0035]
模块2:将指令堆栈的指针与定义的变量比较;
[0036]
模块3:判断比较的内容是否一致;
[0037]
模块4:若不一致,则读取该消息块中的接收指令字received command word,作为新的指令内容,存放到相应的union变量中;
[0038]
模块5:对变量加4;
[0039]
模块6:重复模块1

模块5,直到变量与指令堆栈的指针一致,所有新的指令都被读到并且保存下来,没有遗漏。
[0040]
优选地,所述模块4包括如下模块:
[0041]
模块4.1:根据消息块的指令信息,识别出哪个数据块,是遥控还是遥测,调用不同的程序段;
[0042]
模块4.2:根据该数据块占用的长度循环取数,取到的数存入某共用体;
[0043]
模块4.3:对共用体中的数据进行包头判断,如果不正确即退出这个模块,执行模块5;
[0044]
模块4.4:如果包头判断正确,对各个数据进行模255的iso校验,直到所有的数据都校验完毕;校验正确后提取有效的阀门控制指令存入相应的寄存器后退出该模块,执行模块5;如果发现iso校验错误,直接退出模块,执行的模块5。
[0045]
优选地,所述模块5中的每个消息块占4个字单元,在取完上一条指令后,要对变量加4。
[0046]
与现有技术相比,本发明具有如下的有益效果:
[0047]
1、本发明克服单片机8位数据接口,与1553b 16位数据总线接口的矛盾,提高数据处理效率,并具有一定的灵活性;
[0048]
2、本发明利用1553b芯片接收消息后存放在指令堆栈的特点,利用查询而非中断的方式响应1553b总线,rt每次访问数据块指针而不是访问上一条指令寄存器,保证指令不会丢失;
[0049]
3、本发明不占用1553b芯片中断的资源,对于遥测或者实时性要求不高的应用有很大的优势,能避免处理器内部中断冲突,合理利用资源。
附图说明
[0050]
通过阅读参照以下附图对非限制性实施例所作的详细描述,本发明的其它特征、目的和优点将会变得更明显:
[0051]
图1为本发明单片机对1553b芯片读操作流程图;
[0052]
图2为本发明查询并读取指令流程图。
具体实施方式
[0053]
下面结合具体实施例对本发明进行详细说明。以下实施例将有助于本领域的技术人员进一步理解本发明,但不以任何形式限制本发明。应当指出的是,对本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变化和改进。这些都属于本发明的保护范围。
[0054]
本发明提供一种基于单片机实现1553b总线通信的方法及系统,定义一个一维的两个元素的8位字符型数组,一个16位的整型变量,建立共用体,利用共用体中的变量共享存储空间,完成字节和字的转换,以及字节变量的高低位灵活读取。根据程序需要随时更新
共用体中的字节或字,按需存取。另一方面,在1553b总线上消息的读取时,直接访问rt指令堆栈中的数据块指针,若判断到该指针已经指向下一条消息,则读取该消息包中的接收指令字(received command word),该指令字就是新的指令内容,读取的数据存入共用体,通过控制共用体的指针,可以逐条访问消息地址,这样就能做到不漏一条消息。并且存入共用体的数据可以灵活的按字节运算或者按字运算。
[0055]
利用共用体克服单片机8位数据总线匹配1553b的16位数据总线的限制,提高数据处理效率;定义指针追赶指令堆栈中的数据块指针,读取指令字,不漏一条消息;开辟一个共用体union,定义一个一维的两个元素的字符型数组、一个整型变量和一个指针类型,利用指针,完成字节变量的高低位灵活读取,并且可以根据程序需要随时更新共用体中的字节或字,按需存取。
[0056]
利用共用体配合小尾端处理器体系结构,先读高8位,设置p0.0(msb_lsbn)=
‘1’
,进行“哑读”操作,数据丢弃;设置p0.0(msb_lsbn)=
‘0’
,读低地址,存入共用体的高字节;设置p0.0(msb_lsbn)=
‘1’
,读高地址,存入共用体的低字节。
[0057]
对1553b总线进行读操作,定义变量“追赶”指令堆栈中的数据块指针,若判断到数据块指针已经指向下一条消息,则读取该消息包中的接收指令字(received command word),该指令字就是新的指令内容,存入共用体。如果判断到数据块指针跟上一次一样,则表示没有新的消息。如此,根据堆栈空间的大小,可以缓存64条

512条消息不等,通过控制union的指针,可以逐条访问消息地址,这样就能做到不漏一条消息。
[0058]
取指操作对同一条数据既可以实现字操作,也可以实现字节算法,而不会多占用内存空间。
[0059]
在软件实现的时候,开辟一个共用体union,因为共用体中的变量共享存储空间,定义一个含两个元素的字符型数组、一个整型变量和一个指针变量来构建共用体,主要的作用是利用两者共享存储空间的特点,完美实现8位和16位的转化,同时利用指针,完成字节变量的高低位灵活读取。根据程序需要随时更新共用体中的字节或字,按需存取。
[0060]
对于1553b总线上消息的读取,一般来说,都是通过访问上一条指令(last command),但这样的做法容易丢指令。本发明结合开辟的union,直接访问rt指令堆栈中的数据块指针,若判断到该指针已经指向下一条消息,则读取该消息包中的接收指令字(received command word),该指令字就是新的指令内容。如果判断到数据块指针跟上一次一样,则表示没有新的消息。如此,根据堆栈空间的大小,可以缓存64条

512条消息不等,通过控制union中的指针,可以逐条访问消息地址,这样就能做到不漏一条消息。
[0061]
该发明目前已成功应用于某大型项目上,经过前期个阶段数次测试以及飞行试验验证,未发现丢指令现象。
[0062]
首先定义一个共用体,内部定义3个成员,一个是内含2个字符型元素的一维数组bytedata[2],一个是整型变量worddata,一个是指针pt。
[0063]
由于单片机的8位接口模式,8位数据总线同时连接到1553b芯片d15

d8以及d7

d0上,所以需要外部地址线以及选通信号来选择操作的是低字节还是高字节,对于读取的第一个字节要丢弃,称为“哑读”。本方法旨在把读取的字节写入共用体,这样就能把cpu总线的8位数据在内部自动转成16位的字。根据这个思路,设计读1553b总线的函数。
[0064]
参照图1,具体步骤如下:
[0065]
步骤s1:先读高8位,设置p0.0(msb_lsbn)=
‘1’
,进行“哑读”操作,数据丢弃;步骤s2:等待一段时间;步骤s3:设置p0.0(msb_lsbn)=
‘0’
,读低地址,存入共用体rtdata的高字节rtdata.bytedata[1];步骤s4:设置p0.0(msb_lsbn)=
‘1’
,读高地址,存入共用体的低字节rtdata.bytedata[0];步骤s5:函数返回值是共用体的字rtdata.worddata。
[0066]
该函数通过访问外部地址,完成了哑读操作,等待一段时间后,分别读取了高低字节,存放到共用体rtdata中,实现了1553b总线上16位数据的读取。此处需注意,获取字节操作从低地址开始,将获取的字节从高到低存放,这样得到的字才是正常变量的值。
[0067]
参照图2,通过以下流程获得指令堆栈的数据块指针,步骤如下:
[0068]
步骤1:读取指令堆栈的指针;步骤2:将指令堆栈的指针与自己定义的变量(假设变量名为ptstu_my)比较;步骤3:判断比较的内容是否一致;步骤4:若不一致,则读取该消息块中的接收指令字(received command word),作为新的指令内容,存放到相应的union变量(假设变量名为rtarray.worddata)中。
[0069]
一般新的指令需要验证指令内容是否合法,比如模255的iso校验,根据下述步骤验证:
[0070]
步骤4.1:根据消息块的指令信息,识别出哪个数据块,是遥控还是遥测,调用不同的程序段;步骤4.2:根据该数据块占用的长度循环取数,取到的数存入某共用体;步骤4.3:对共用体中的数据进行包头判断,此时用字操作方便,如果不正确的话退出这个模块,执行步骤5;步骤4.4:如果包头判断正确,对各个数据(按字节)进行模255的iso校验,直到所有的数据都校验完毕。校验正确的话提取有效的阀门控制指令存入相应的寄存器后退出该模块,执行步骤5。如果发现iso校验错误,直接退出模块,执行的步骤5。
[0071]
步骤5:对变量ptstu_my加4。因为每个消息块占4个字单元,所以在取完上一条指令后,为了能追上数据块指针的位置,要对变量ptstu_my加4;步骤6:重复步骤1

步骤5,直到ptstu_my与指令堆栈的指针一致。也就是所有新的指令都被读到并且保存了下来,没有遗漏。
[0072]
本发明还提供一种基于单片机实现1553b总线通信的系统,包括单片机对1553b芯片读操作系统,所述单片机对1553b芯片读操作系统包括如下模块:
[0073]
模块m1:先读高8位,设置p0.0(msb_lsbn)=
‘1’
,进行“哑读”操作,数据丢弃;模块m2:等待一段时间;模块m3:设置p0.0(msb_lsbn)=
‘0’
,读低地址,存入共用体rtdata的高字节rtdata.bytedata[1];模块m4:设置p0.0(msb_lsbn)=
‘1’
,读高地址,存入共用体的低字节rtdata.bytedata[0];模块m5:函数返回值是共用体的字rtdata.worddata。函数通过访问外部地址,完成哑读操作,等待一段时间后,分别读取高低字节,存放到共用体rtdata中;获取字节操作从低地址开始,将获取的字节从高到低存放。
[0074]
单片机实现1553b总线通信的系统还包括获得指令堆栈的数据块指针系统,指令堆栈的数据块指针系统包括如下模块:模块1:读取指令堆栈的指针;模块2:将指令堆栈的指针与定义的变量比较;模块3:判断比较的内容是否一致。
[0075]
模块4:若不一致,则读取该消息块中的接收指令字received command word,作为新的指令内容,存放到相应的union变量中;模块4.1:根据消息块的指令信息,识别出哪个数据块,是遥控还是遥测,调用不同的程序段;模块4.2:根据该数据块占用的长度循环取数,取到的数存入某共用体;模块4.3:对共用体中的数据进行包头判断,如果不正确即退出
这个模块,执行模块5;模块4.4:如果包头判断正确,对各个数据进行模255的iso校验,直到所有的数据都校验完毕;校验正确后提取有效的阀门控制指令存入相应的寄存器后退出该模块,执行模块5;如果发现iso校验错误,直接退出模块,执行的模块5。
[0076]
模块5:对变量加4;每个消息块占4个字单元,在取完上一条指令后,要对变量ptstu_my加4。
[0077]
模块6:重复模块1

模块5,直到变量与指令堆栈的指针一致,所有新的指令都被读到并且保存下来,没有遗漏。
[0078]
本发明建立共用体做8位、16位数据转换,也可以通过指针随意读取8位的高字节或低字节,轻松实现字节数据不同的拼凑需求,并节约内存空间,一定程度上解决了单片机8位总线匹配16位外部接口的局限。从应用案例来看,对于同一条指令,有些数据采用字处理比较方便,有些数据需要字节运算。比如数据包的包识别、包长度等,协议里明确定义数据内容的,可以采用读取共用体中的字来判断内容是否正确。但对于数据包的校验,例如用iso校验方法作为包差错控制,需要对数据进行字节的模255运算,这时就可以通过读取共用体的相应字节来参与运算。
[0079]
本发明采用追踪数据块指针的方法,可以根据需要开辟堆栈区大小,控制缓存的消息条目,可以缓存64条

512条消息不等,就算cpu由于其它中断打扰未能及时响应1553b总线指令,也能在响应完外部中断后,继续从堆栈读取指令,直到所有新指令都取完,做到无遗漏的接收到指令。
[0080]
本发明灵活、简单易行,适用于大部分单片机与1553b总线的通信。本方法在探月三期推进线路盒以及新飞船推进系统控制驱动器上都有成功的应用。
[0081]
本领域技术人员知道,除了以纯计算机可读程序代码方式实现本发明提供的系统及其各个装置、模块、单元以外,完全可以通过将方法步骤进行逻辑编程来使得本发明提供的系统及其各个装置、模块、单元以逻辑门、开关、专用集成电路、可编程逻辑控制器以及嵌入式微控制器等的形式来实现相同功能。所以,本发明提供的系统及其各项装置、模块、单元可以被认为是一种硬件部件,而对其内包括的用于实现各种功能的装置、模块、单元也可以视为硬件部件内的结构;也可以将用于实现各种功能的装置、模块、单元视为既可以是实现方法的软件模块又可以是硬件部件内的结构。
[0082]
以上对本发明的具体实施例进行了描述。需要理解的是,本发明并不局限于上述特定实施方式,本领域技术人员可以在权利要求的范围内做出各种变化或修改,这并不影响本发明的实质内容。在不冲突的情况下,本技术的实施例和实施例中的特征可以任意相互组合。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献