基于CAN总线数据采集系统的设计与实现.doc
【精品文档】如有侵权,请联系网站删除,仅供学习与交流基于CAN总线数据采集系统的设计与实现.精品文档.基于CAN总线数据采集系统的设计与实现CAN总线通信实验内容提要: 以CAN (Controller Area Network) 总线控制器SJA1000为核心, 设计了一种通用的基于CAN总线的数据采集系统, 给出了数据采集系统的原理、单个节点的软硬件设计; 重点阐述了CAN 总线智能节点的设计、实现与注意事项。 试验表明, CAN 总线的多主结构使系统改型灵活, 数据传输稳定, 可靠性好, 数据传输速率可达1Mbit/s, 能满足现场的实时性要求。CAN 总线的使用大大节约了连接导线、维护和安装费用, 提高了系统的性价比, 具有广泛的应用前景。关键词:数据采集 CAN 总线 现场总线 芯片SJA 1000 目 录一、引言1二、 CAN总线1(一)CAN总线介绍1(二)CAN协议1三、结构设计4四、硬件设计5五、软件设计6(一)初始化子程序7(二)发送子程序8(三)查询方式接收子程序10六、测试报告12附录15参考文献36一、引言 信息技术的飞速发展,引起了自动化系统结构的变革, 形成以网络集成自动化为基础的控制系统。现场总线顺应这一形式发展, 已成为当前工业数据总线领域中一个新热点, 被广泛应用于工业现场控制、智能家居、交通工具、环境监测等众多领域。 用数据采集系统能实现数据采集与处理, 加入高级算法即可实现智能控制, 因而减轻了上位机的负担。本设计设计了一个通用的基于CAN 总线的数据采集卡, 着重阐述了它的设计及其实现。二、 CAN总线(一)CAN总线介绍CAN 总线 (Cont roller Area Network 控制器局域网)是现场总线的一种。 它是德国Bosch 公司在1986 年为解决现代汽车中众多的控制与测试仪器之间的数据交换而开发的一种串行数据通讯总线。CAN 总线与其它通信网的不同之处有二:一是报文传送中不包含目标地址 ,它是以全网广播为基础 ,各接收站根据报文中反映数据性质的标识符过滤报文 ,该收的收下 ,不该收的弃而不用。其好处是可在线上网下网、 即插即用和多站接收;二是特别强化了对数据安全性的关注 , 满足控制系统及其它较高数据要求的系统需求。CAN 总线具有下列主要特性:l 多主站依据优先权进行总线访问;l 非破坏性的基于优先权的总线仲裁;l 借助接收滤波的多地址帧传送;l 远程数据请求;l 配置灵活;l 全系统的数据相容性;l 错误检测和出错信令;l 发送期间若丢失仲裁或由于出错而遭破坏的帧可自动重发送;l 暂时错误和永久性故障节点的判别以及故障节点的自动脱离 CAN 总线。(二)CAN协议数据传输的通信协议是指对数据传输的约定 ,包括定时 、控制 、格式化和数据表示方法等等 。1.CAN分层结构的协议CAN是一串行通讯协议 CAN总线规范规定了任意两个节点之间的兼容性 ,包括电气特性及数据解释协议 ,为保证设计使用的透明性及使用的灵活性 ,CAN协议分为如下几层:目标层 、传送层 、物理层 。目标层的功能范围包括:信息识别、信息状态及处理。传送层的功能范围包括: 帧组织、总线仲裁、检错、错误报告、错误处理。物理层的功能范围包括: 实际位传送过程上的电气特性。2.CAN网络通讯协议总线控制器支持4种不同结构的CAN协议帧类型:数据帧用于节点之间的数据传输远程帧:用于请求发送具有相同标识符的数据帧出错帧:用于指示检测到的错误状态过载帧:用于提供先前和后续数据帧或远程帧之间的附加延时数据帧、远程帧、出错帧、过载帧都按一定的格式进行编码数据帧:由7个不同的位场构成 ,如图 1所示。它们是:帧起始 、仲裁场、控制场、CRC场 、ACK场和帧结束;远程帧:由6个不同的位场构成:帧起始 、仲裁场、控制场、CRC场 、ACK场、帧结束出错帧:由两个不同的场构成。第一个场由来自不同节点的错误标志叠加给出,后随的第二个场为错误定界符超载帧:包括两个位场、超载标志和超载界定符。数据帧和远程帧以帧间空间同先前帧隔开,帧编码和发送/接收。图1 数据帧的构成帧起始、仲裁场、控制场、数据场、序列帧段均以位填充方法进行编码 ,即在以送位流中检测到5个数值相同的时候 ,自动插人一个补码位。数据帧或远程帧的其余位场、错误帧、超载帧为固定格式 ,不使用位填充方法编码,帧中的位流按照非归零方法编码。发送时从其SOF场开始逐个位场发送。对于发送器和接收器 ,一帧的有效点是不同的。对于发送器 ,若在帧结束完成前不存在错误 ,则该帧有效。对于接收器 ,若在帧结束最后一位前不存在错误 ,则该帧有效。总线访问和仲裁:当检测到间歇场未被 “显性”位中断后 ,认为总线被所有节点释放。总线被释放后 , “错误一激活”节点可以访问总线。当许多节点一起开始发送时 ,只有发送具有最高优先权的帧节点变为总线主机 ,享有对总线的控制权。这种解决总线访问冲突的机理是基于竞争的促裁 ,依据标识符和紧随其后的RTR位来完成。错误检测:在CAN中存在5类不同的错误位错误、填充错误、CRC错误、形式错误、应答错误、在网络中的任何一个节点 ,根据其错误计数器的数值,可能处于下列3种状态之一:“错误一激活”节点:一个“错误一激活”节点可以正常参与总线通信,并在检测到错误时 ,发出一个激活错误标志。“错误一认可”节点:一个“错误一认可”节点不应发送激活错误标志 ,它参与总线通信,但在检测到错误时,发出一个认可错误标志。“总线脱离”节点:当一个节点由于请求故障界定实体而对总线处于关闭状态时 ,其处于“总线脱离”状态,在“总线脱离”状态。为了进行错误界定 ,在总线上的每一个单元中都设有两种计数器:发送出错计数器和接收出错计数器 ,错误计数器的值按照一定的规则进行修正。当节点的发送计数器或接收计数器的值超过127时 ,则监控器要求置相应节点为“错误一认可”状态 ,送出一个激活标志。当发送计数器或接收计数器的值均小于或等于127时 , “错误一认可”节点再次变为 “错误一激活” 。当节点的发送计数器的值超过255时 ,则监控器要求置相应节点为“脱离总线”状态。处于“脱离总线”状态的节点 ,在监测到总线上出现128次11个连续的“隐性”位 ,变为两个错误计数器均为0的“错误一激活”节点。三、结构设计 数据采集系统由数据采集模块和数据传输模块组成, 其中数据传输通过CAN (Controller Area Network) 总线来实现。 控制器局域网CAN 属于现场总线范畴, 它是一种有效支持分布式控制或实时控制的串行通信网络。系统采用总线式网络拓扑结构, 其系统总体结构如图2所示。图2 系统总体结构选用CAN 总线连接各节点, 形成多主控制器的局域网。 CAN 总线符合 ISO11898标准, 最多可挂接110个节点, 采用CAN 总线特有的多主传送方式, 各采集控制器根据现场需要, 当有数据时可自主发送, 无需主机不停地轮巡, 节省了网络上的数据流量, 提高了传输效率。 CAN 总线传输介质为双绞线或同轴电缆, 走线少、系统易扩展、改型灵活, 正是由于这些其他通信方式无法比拟的优点, 才使之成为系统分布比较分散的数据采集系统的理想总线。数据采集系统将由现场传感器送来的数据发送到空闲的CAN 总线上, 而总线上各节点通过预先设置好的验收码和验收屏蔽码, 来决定是否使用这个消息。 如果采集的数据需要进一步进行处理, 则上位机可从总线上接收数据并对其处理。 处理后的数据再送回CAN 总线, 经数模转换模块或其他节点进行控制操作。 当上位机需对某个节点施以控制时, 可采用点对点的方式与该节点进行通讯; 而当它需要对所有节点加以控制时, 则采用广播方式将命令发送到总线。 这样大大减少了数据的传输量, 从而提高了系统的传输速率, 同时又保证了系统的实时性和可靠性。 下面以数据采集系统中的数据采集节点为例来说明单个节点的设计思想。四、硬件设计数据采集系统单个节点硬件框图如图3所示, 由传感器检测的信息经多路开关送到可编程放大器PGA 204, 根据信号大小调节放大倍数(1, 10, 100, 1 000倍) , 放大后, 经AD574转换为数字信号, 送入微处理器中存储, 然后根据现场情况的需要, 将信号发送到CAN 总线上, 被其他节点或上位机接收。图3 节点硬件框图由于以AD574为A/D 转换器的数据采集卡比较普及, 故下面重点阐述数据传输部分, 即CAN 总线智能节点的设计与实现。 CAN 总线上的节点是网络上的信息接收和发送站, 由于节点主要由单片机和可编程的CAN 通信控制器组成, 能通过编程设置工作方式、ID 地址、波特率等参数, 故称其为智能节点。CAN节点原理图如图4所示。89C51是节点的微处理器, 作为一个存储器 I/O 映象设备, 负责对控制器SJA 1000初始化, 并控制其实现数据的收发等通信任务。 在CAN 总线通信接口中, 使用PH IL IPS 公司的 SJA 1000和 TJA 1040芯片。 SJA 1000是独立的CAN 通信控制器, 用于完成CAN 总线通信协议的物理层和数据链路层的功能。TJA1040为高性能、高速CAN 收发器, 使用它可增大通信距离, 提高系统瞬间抗干扰能力, 改良系统的抗电磁干扰及电磁辐射性能, 保护总线, 降低射频干扰, 实现热防护等。图4 CAN节点原理图为进一步提高抗干扰能力, 在CAN 控制器SJA 1000和驱动器TJA 1040之间使用了高速光耦器件6N137构成隔离电路, 传输介质采用双绞线 (或同轴电缆) 分别接至CAN 收发器TJA 1040的CANH 和CANL 引脚。 同时在总线两端CANH 和CANL 之间加上分离中断的120 8 终端电阻, 对总线阻抗匹配起着相当重要的作用 4 。此外, 为使CAN 控制器和微处理器能同时可靠复位, 外加了手动复位电路。SJA 1000的中断输出信号 (/N T) 接至单片机的中断引脚 IN T0, 通过中断方式实现单片机与CAN 控制器的通信。 在电路实际调试过程中须注意以下几点。1.总线的两个1208 终端电阻不可忽略。 否则会使数据通信的抗干扰性和可靠性降低, 严重时可导致无法通信。2.TJA 1040 (与PCA 82C250兼容) 的“SPL IT”引脚 (代替82C250“ V ref”引脚) , 对总线DC 稳压很有效 4 。 如果“SPL IT”用于共模电压的DC 稳压, 这个“SPL IT”引脚要连接到分离中断的中间分接头。 若“SPL IT”不使用, 只需保持开路即可。3.TJA 1040引脚“STB”一般被直接连接到微处理器输出口, 以便于控制收发器的工作模式。五、软件设计CAN 总线节点的软件设计主要包括三大部分:CAN 节点初始化、报文发送和报文接收。熟悉这三部分程序的设计, 就能编写出利用 CAN 总线进行通信的一般应用程序。当然要将 CAN 总线应用于通信任务比较复杂的系统中还需详细了解有关CAN总线错误处理、总线脱离处理、接收滤波处理、波特率参数设置和自动检测以及CAN总线通信距离和节点数的计算等方面的内容。下面仅就前面提到的三部分程序的设计作一个描述,以供大家在实际应用中参考。 (一)初始化子程序 SJA1000 的初始化只有在复位模式下才可以进行。初始化主要包括工作方式的设置 接收滤波方式的设置,接收屏蔽寄存器AMR 和接收代码寄存器 ACR 的设置,波特率参数设置和中断允许寄存器 IER 的设置等。在完成 SJA1000 的初始化设置以后 SJA1000 就可以回到工作状态 进行正常的通信任务。下面提供了SJA1000 初始化的 51 汇编源程序。程序中寄存器符号表示的是 SJA1000 相应寄存器占用的片外存贮器地址 这些符号可在程序的头部用伪指令EQU进行定义。后文对这一点不再作特别说明。CANINI: MOV DPTR, #MOD ;方式寄存器 MOV A, #09H ;进入复位模式 对 SJA1000 进行初始化. MOVX DPTR, A MOV DPTR, #CDR ;时钟分频寄存器 MOV A , #88H ;选择 PeliCAN 模式 关闭时钟输出 CLKOUTMOVX DPTR, A MOV DPTR, #IER ;中断允许寄存器 MOV A ,#0DH ;开放发送中断 超载中断和错误警告中断 MOVX DPTR, A MOV DPTR ,#AMR ;接收屏蔽寄存器 MOV R6, #4 MOV R0 ,#DAMR ;接收屏蔽寄存器内容在片内 RAM 中的首址 AMR: MOV A R0 MOVX DPTR, A ;接收屏蔽寄存器赋初值 INC DPTR DJNZ R6 ,AMR MOV DPTR ,#ACR ;接收代码寄存器 MOV R6 ,#4 MOV R0, #DACR ;接收代码寄存器内容在片内 RAM 中的首址 ACR:MOV A, R0 MOVX DPTR, A ;接收代码寄存器赋初值 INC DPTR DJNZ R6 ,ACR MOV DPTR, #BTR0 ;总线定时寄存器 0 MOV A, #03H MOVX DPTR, A MOV DPTR, #BTR1 ;总线定时寄存器 1 MOV A ,#0FFH ;16MHz 晶振情况下 设置波特率为 80kbps. MOVX DPTR, A MOV DPTR, #OCR ;输出控制寄存器 MOV A ,#0AAH MOVX DPTR,A MOV DPTR, #RBSA ;接收缓存器起始地址寄存器 MOV A, #0 ;设置接收缓存器 FIFO 起始地址为 0 MOVX DPTR, A MOV DPTR, #TXERR ;发送错误计数寄存器. MOV A ,#0 ;清除发送错误计数寄存器 MOVX DPTR, A MOV DPTR ,#ECC ;错误代码捕捉寄存器 MOVX A ,DPTR ;清除错误代码捕捉寄存器 MOV DPTR, #MODE ;方式寄存器 MOV A ,#08H ;设置单滤波接收方式 并返回工作状态 MOVX DPTR ,A RET (二)发送子程序 发送子程序负责节点报文的发送,发送时用户只需将待发送的数据按特定格式组合成一帧报文送入SJA1000 发送缓存区中,然后启动SJA1000发送即可。当然在往 SJA1000 发送缓存区送报文之前必须先作一些判断。如下文程序所示,发送程序分发送远程帧和数据帧两种:远程帧无数据场。下面以发送数据帧为例对发送子程序作一个说明 。TDATA: MOV DPTR, #SR ;状态寄存器 MOVX A,DPTR ;从 SJA1000 读入状态寄存器值 JB ACC.4,TDATA ;判断是否正在接收 正在接收则等待 TS0: MOVX A, DPTR JNB ACC.3 ,TS0 ;判断上次发送是否完成 未完成则等待发送完成 TS1: MOVX A,DPTR JNB ACC.2 ,TS1 ;判断发送缓冲区是否锁定 锁定则等待 TS2: MOV DPTR, #CANTXB ;SJA1000 发送缓存区首址 MOV A , #88H ;发送数据长度为 8 个字节的扩展帧格式报文 MOVX DPTR, A INC DPTR MOV A , #ID0 ;4 个字节的标识符 ID0-ID3 MOVX DPTR, A INC DPTR MOV A, #ID1 MOVX DPTR, A INC DPTR MOV A , #ID2 MOVX DPTR, A INC DPTR MOV A, #ID3 MOVX DPTR,A MOV R0 ,#TRDATA ;CPU 发送数据区首址 MTBF:MOV A, R0 INC DPTR MOVX DPTR, A INC R0 CJNE R0, #TRDATA+8 MTBF ;向发送缓冲区写 8 个字节 MOV DPTR, #CMR ;命令寄存器地址 MOV A , #01H MOVX DPTR ,A ;启动 SJA1000 发送 RET(三)查询方式接收子程序 接收子程序负责节点报文的接收以及其它情况处理,接收子程序比发送子程序要复杂一些。因为在处理接收报文的过程中,同时要对诸如总线脱离、错误报警、接收溢出等情况进行处理SJA1000报文的接收主要有两种方式:中断接收方式和查询接收方式。如果对通信的实时性要求不是很强,建议采用查询接收方式。两种接收方式编程的思路基本相同,下面仅以查询方式接收报文为例对接收子程序作一个说明。SEARCH: MOV DPTR, #SR ;状态寄存器地址 MOVX A ,DPTR ANL A ,#0C3H ;读取总线脱离 错误状态 接收溢出 JNZ PROC RET ;无上述状态 结束 PROC: JNB ACC.7 ,PROCI BUSERR: MOV DPTR, #IR ;IR 中断寄存器 出现总线脱离 MOVX A , DPTR ;读中断寄存器 清除中断位. MOV DPTR, #MODE ;方式寄存器地址 MOV A, #08H MOVX DPTR, A ;将方式寄存器复位请求位清 0 LCALL ALARM. ;调用报警子程序 RET NOP PROCI: MOV DPTR, #IR ;总线正常 MOVX A, DPTR ;读取中断位 NB ACC.3, OTHER OVER: MOV DPTR, #CMR ;数据溢出中断置位. MOV A, #0CH MOVX DPTR, A ;在命令寄存器中清除数据溢出 RET NOP OTHER:JB ACC.0 ,RECE ;IR.0=1 接收 FIFO 未满或接收 LJMP RECOUT ;IR.0=0接收缓冲区无数据退出接收 NOP RECE: MOV DPTR, #CANRXB ;接收缓冲区首地址 16 准备读取数 MOVX A, DPTR ;首字节是接收帧格式字 JNB ACC.6 ,RDATA ;RTR=1 是远程请求帧 无数据 MOV DPTR, #CMR MOV A , #04H ;CMR.2=1 释放接收缓冲区 MOVX DPTR ,A ;只有接收了数据才能释放接收缓冲区 LCALL TDATA ;发送对方请求的数据 LJMP RECOUT ;退出接收 NOP RDATA: MOV DPTR, #CANRXB ;读取并保存接收缓冲区的数据 MOV R1, #CPURBF ;CPU 片内接收缓冲区首址 MOVX A, DPTR ;读取读取 CAN 缓冲区的 2 号字节 MOV R1, A ;保存 ANL A, #0FH ;截取低 4 位是数据长度 08 ADD A, #4 ;加 4 个字节的标识符 ID MOV R6, A RDATA: INC DPTR INC R1 MOVX A, DPTR MOV R1 ,A DJNZ R6,RDATA0 ;循环读取与保存 MOV DPTR, #CMR MOV A, #04H ;释放 CAN 接收缓冲区 MOVX DPTR ,A RECOUT: MOV DPTR, #ALC MOVX A, DPTR MOV DPTR, #ECC MOVX A, DPTR NOP RET需要注意的是: SJA 1000的初始化只有在复位模式下才可以进行。 在对SJA 1000寄存器设定前, 主控制器通过读复位模式ö 请求标志来检查SJA 1000是否已达到复位模式。 在复位模式下, 主控制器必须配置SJA 1000控制段的寄存器。 时钟输出控制寄存器 (OCR) 的内容决定CAN 控制器的输出方式。 验收代码(ACR) 和验收屏蔽(AMR) 寄存器根据实际网络系统和报文标志符来确定, 须引起注意的是: ACR位 (AC172 AC10) 和信息识别码的高8位 ( ID1102ID13) 相等, 且与AMR 位 (AM 172 AM 10) 的相应位相或为1, 即: ( ID1102ID13) (AC172 AC10) (AM 172 AM 10) 1111 1111满足上述条件的报文才予以接收 3 。 BTR0、 BTR1寄存器的内容可唯一地确定系统的通信波特率和同步跳转宽度, 所以整个系统中的所有节点, 这两个寄存器的内容必须相同 (包括上位机) , 否则将无法进行通信。六、测试报告实验达到了预定结果,可以将各个分布点的测量数据准确发送到指定CAN节点。CAN总线最高速度达到1M。实验用电路板如图4所示。图5 实验用电路板七、总结由基于CAN 总线的智能节点在数据采集卡中的实际运用表明, 在实验室条件下数据传输速率最高可达1M / s, 误码率低, 当节点出现严重错误时, 可自动脱离总线而整个系统不受影响。 由此, 该节点的设计方案是可行的, 既可提高系统的可靠性、数据传输速度, 又具有操作简便、实时性强、扩展灵活、纠检错能力强等特点, 另外, 它可大大节约连接导线、维护和安装费用, 提高了系统的性价比。 因此可广泛应用于各种测控系统中。八、致 谢本设计是在导师汪老师的精心指导和鼓励下完成的。汪老师开阔的视野,严谨的学风和真诚谦逊的为人,使我在这次设计过程中受益匪浅。汪老师在生活等各方面给我的关怀和帮助也将令我终生难忘。在此,谨向汪老师表示衷心的感谢。感谢我的父母,是他们无私的爱的支持和鼓励使我顺利完成学业!感谢同组的同学对我的帮助和支持!此外,我还要感谢在我的论文中所有被援引过的文献的作者,他们是我的知识之源!最后,再次向所有曾经给予我帮助和鼓励的老师和同学致以最诚挚的谢意!附录(一)源程序:#include "reg51.h"#define uchar unsigned char#define uint unsigned intsbit PB=P27;sbit LAMP=P26;uchar RTR_BIT=0;uchar INT_FLAG=0;uchar stat;/CAN总线寄存器映射表/高4地址:0000#define RXF0SIDH 0x0#define RXF0SIDL 0x01#define RXF0EID8 0x02#define RXF0EID0 0x03#define RXF1SIDH 0x04#define RXF1SIDL 0x05#define RXF1EID8 0x06#define RXF1EID0 0x07#define RXF2SIDH 0x08#define RXF2SIDL 0x09#define RXF2EID8 0x0a#define RXF2EID0 0x0b #define BFPCTRL 0x0c#define TXRTSCTRL 0x0d#define CANSTAT 0x0e#define CANCTRL 0x0f/高4地址:0001#define RXF3SIDH 0x10#define RXF3SIDL 0x11#define RXF3EID8 0x12#define RXF3EID0 0x13#define RXF4SIDH 0x14#define RXF4SIDL 0x15#define RXF4EID8 0x16#define RXF4EID0 0x17#define RXF5SIDH 0x18#define RXF5SIDL 0x19#define RXF5EID8 0x1a#define RXF5EID0 0x1b#define TEC 0x1c#define REC 0x1d/高4地址:0010#define RXM0SIDH 0x20#define RXM0SIDL 0x21#define RXM0EID8 0x22#define RXM0EID0 0x23#define RXM1SIDH 0x24#define RXM1SIDL 0x25#define RXM1EID8 0x26#define RXM1EID0 0x27#define CNF3 0x28#define CNF2 0x29#define CNF1 0x2a#define CANINTE 0x2b#define CANINTF 0x2c#define EFLG 0x2d/高4地址:0011#define TXB0CTRL 0x30 #define TXB0SIDH 0x31#define TXB0SIDL 0x32#define TXB0EID8 0x33#define TXB0EID0 0x34#define TXB0DLC 0x35 #define TXB0D0 0x36#define TXB0D1 0x37#define TXB0D2 0x38#define TXB0D3 0x39#define TXB0D4 0x3a #define TXB0D5 0x3b#define TXB0D6 0x3c#define TXB0D7 0x3d/高4地址:0100#define TXB1CTRL 0x40 #define TXB1SIDH 0x41#define TXB1SIDL 0x42#define TXB1EID8 0x43#define TXB1EID0 0x44#define TXB1DLC 0x45 #define TXB1D0 0x46#define TXB1D1 0x47#define TXB1D2 0x48#define TXB1D3 0x49#define TXB1D4 0x4a #define TXB1D5 0x4b#define TXB1D6 0x4c#define TXB1D7 0x4d/高4地址:0101#define TXB2CTRL 0x50 #define TXB2SIDH 0x51#define TXB2SIDL 0x52#define TXB2EID8 0x53#define TXB2EID0 0x54#define TXB2DLC 0x55 #define TXB2D0 0x56#define TXB2D1 0x57#define TXB2D2 0x58#define TXB2D3 0x59#define TXB2D4 0x5a #define TXB2D5 0x5b#define TXB2D6 0x5c#define TXB2D7 0x5d/高4地址:0110#define RXB0CTRL 0x60 #define RXB0SIDH 0x61#define RXB0SIDL 0x62#define RXB0EID8 0x63#define RXB0EID0 0x64#define RXB0DLC 0x65 #define RXB0D0 0x66#define RXB0D1 0x67#define RXB0D2 0x68#define RXB0D3 0x69#define RXB0D4 0x6a #define RXB0D5 0x6b#define RXB0D6 0x6c#define RXB0D7 0x6d/高4地址:0111#define RXB1CTRL 0x70 #define RXB1SIDH 0x71#define RXB1SIDL 0x72#define RXB1EID8 0x73#define RXB1EID0 0x74#define RXB1DLC 0x75 #define RXB1D0 0x76#define RXB1D1 0x77#define RXB1D2 0x78#define RXB1D3 0x79#define RXB1D4 0x7a #define RXB1D5 0x7b#define RXB1D6 0x7c#define RXB1D7 0x7d/SPI指令集#define CMD_RESET 0xC0 #define CMD_READ 0x03#define CMD_RD_RXBUF 0x90#define CMD_WRITE 0x02#define CMD_WR_TXBUF 0x40#define CMD_RTS 0x80#define CMD_RD_STATUS 0xa0#define CMD_RX_STATUS 0xb0#define CMD_BIT_M 0x05/SPI控制寄存器SPCTL#define SPI_CLK_4 0x0#define SPI_CLK_16 0x01#define SPI_CLK_64 0x02#define SPI_CLK_128 0x03#define SPI_CPHA 0x04#define SPI_CPOL 0x08#define SPI_MSTR 0x10#define SPI_DORD 0x20#define SPI_SPEN 0x40#define SPI_SSIG 0x80/SPI状态寄存器SPSTAT#define SPI_SPIF 0x80#define SPI_W