《基于CAN总线数据采集系统的设计与实现演示教学.doc》由会员分享,可在线阅读,更多相关《基于CAN总线数据采集系统的设计与实现演示教学.doc(42页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Good is good, but better carries it.精益求精,善益求善。基于CAN总线数据采集系统的设计与实现-基于CAN总线数据采集系统的设计与实现CAN总线通信实验内容提要:以CAN(ControllerAreaNetwork)总线控制器SJA1000为核心,设计了一种通用的基于CAN总线的数据采集系统,给出了数据采集系统的原理、单个节点的软硬件设计;重点阐述了CAN总线智能节点的设计、实现与注意事项。试验表明,CAN总线的多主结构使系统改型灵活,数据传输稳定,可靠性好,数据传输速率可达1Mbit/s,能满足现场的实时性要求。CAN总线的使用大大节约了连接导线、维护和安
2、装费用,提高了系统的性价比,具有广泛的应用前景。关键词:数据采集CAN总线现场总线芯片SJA1000目录一、引言1二、CAN总线1(一)CAN总线介绍1(二)CAN协议1三、结构设计4四、硬件设计5五、软件设计6(一)初始化子程序7(二)发送子程序8(三)查询方式接收子程序10六、测试报告12附录15参考文献36-一、引言信息技术的飞速发展,引起了自动化系统结构的变革,形成以网络集成自动化为基础的控制系统。现场总线顺应这一形式发展,已成为当前工业数据总线领域中一个新热点,被广泛应用于工业现场控制、智能家居、交通工具、环境监测等众多领域。用数据采集系统能实现数据采集与处理,加入高级算法即可实现智
3、能控制,因而减轻了上位机的负担。本设计设计了一个通用的基于CAN总线的数据采集卡,着重阐述了它的设计及其实现。二、CAN总线(一)CAN总线介绍CAN总线(ControllerAreaNetwork控制器局域网)是现场总线的一种。它是德国Bosch公司在1986年为解决现代汽车中众多的控制与测试仪器之间的数据交换而开发的一种串行数据通讯总线。CAN总线与其它通信网的不同之处有二:一是报文传送中不包含目标地址,它是以全网广播为基础,各接收站根据报文中反映数据性质的标识符过滤报文,该收的收下,不该收的弃而不用。其好处是可在线上网下网、即插即用和多站接收;二是特别强化了对数据安全性的关注,满足控制系
4、统及其它较高数据要求的系统需求。CAN总线具有下列主要特性:l 多主站依据优先权进行总线访问;l 非破坏性的基于优先权的总线仲裁;l 借助接收滤波的多地址帧传送;l 远程数据请求;l 配置灵活;l 全系统的数据相容性;l 错误检测和出错信令;l 发送期间若丢失仲裁或由于出错而遭破坏的帧可自动重发送;l 暂时错误和永久性故障节点的判别以及故障节点的自动脱离CAN总线。(二)CAN协议数据传输的通信协议是指对数据传输的约定,包括定时、控制、格式化和数据表示方法等等。1.CAN分层结构的协议CAN是一串行通讯协议CAN总线规范规定了任意两个节点之间的兼容性,包括电气特性及数据解释协议,为保证设计使用
5、的透明性及使用的灵活性,CAN协议分为如下几层:目标层、传送层、物理层。目标层的功能范围包括:信息识别、信息状态及处理。传送层的功能范围包括:帧组织、总线仲裁、检错、错误报告、错误处理。物理层的功能范围包括:实际位传送过程上的电气特性。2.CAN网络通讯协议总线控制器支持4种不同结构的CAN协议帧类型:数据帧用于节点之间的数据传输远程帧:用于请求发送具有相同标识符的数据帧出错帧:用于指示检测到的错误状态过载帧:用于提供先前和后续数据帧或远程帧之间的附加延时数据帧、远程帧、出错帧、过载帧都按一定的格式进行编码数据帧:由7个不同的位场构成,如图1所示。它们是:帧起始、仲裁场、控制场、CRC场、AC
6、K场和帧结束;远程帧:由6个不同的位场构成:帧起始、仲裁场、控制场、CRC场、ACK场、帧结束出错帧:由两个不同的场构成。第一个场由来自不同节点的错误标志叠加给出,后随的第二个场为错误定界符超载帧:包括两个位场、超载标志和超载界定符。数据帧和远程帧以帧间空间同先前帧隔开,帧编码和发送/接收。图1数据帧的构成帧起始、仲裁场、控制场、数据场、序列帧段均以位填充方法进行编码,即在以送位流中检测到5个数值相同的时候,自动插人一个补码位。数据帧或远程帧的其余位场、错误帧、超载帧为固定格式,不使用位填充方法编码,帧中的位流按照非归零方法编码。发送时从其SOF场开始逐个位场发送。对于发送器和接收器,一帧的有
7、效点是不同的。对于发送器,若在帧结束完成前不存在错误,则该帧有效。对于接收器,若在帧结束最后一位前不存在错误,则该帧有效。总线访问和仲裁:当检测到间歇场未被“显性”位中断后,认为总线被所有节点释放。总线被释放后,“错误一激活”节点可以访问总线。当许多节点一起开始发送时,只有发送具有最高优先权的帧节点变为总线主机,享有对总线的控制权。这种解决总线访问冲突的机理是基于竞争的促裁,依据标识符和紧随其后的RTR位来完成。错误检测:在CAN中存在5类不同的错误位错误、填充错误、CRC错误、形式错误、应答错误、在网络中的任何一个节点,根据其错误计数器的数值,可能处于下列3种状态之一:“错误一激活”节点:一
8、个“错误一激活”节点可以正常参与总线通信,并在检测到错误时,发出一个激活错误标志。“错误一认可”节点:一个“错误一认可”节点不应发送激活错误标志,它参与总线通信,但在检测到错误时,发出一个认可错误标志。“总线脱离”节点:当一个节点由于请求故障界定实体而对总线处于关闭状态时,其处于“总线脱离”状态,在“总线脱离”状态。为了进行错误界定,在总线上的每一个单元中都设有两种计数器:发送出错计数器和接收出错计数器,错误计数器的值按照一定的规则进行修正。当节点的发送计数器或接收计数器的值超过127时,则监控器要求置相应节点为“错误一认可”状态,送出一个激活标志。当发送计数器或接收计数器的值均小于或等于12
9、7时,“错误一认可”节点再次变为“错误一激活”。当节点的发送计数器的值超过255时,则监控器要求置相应节点为“脱离总线”状态。处于“脱离总线”状态的节点,在监测到总线上出现128次11个连续的“隐性”位,变为两个错误计数器均为0的“错误一激活”节点。三、结构设计数据采集系统由数据采集模块和数据传输模块组成,其中数据传输通过CAN(ControllerAreaNetwork)总线来实现。控制器局域网CAN属于现场总线范畴,它是一种有效支持分布式控制或实时控制的串行通信网络。系统采用总线式网络拓扑结构,其系统总体结构如图2所示。图2系统总体结构选用CAN总线连接各节点,形成多主控制器的局域网。CA
10、N总线符合ISO11898标准,最多可挂接110个节点,采用CAN总线特有的多主传送方式,各采集控制器根据现场需要,当有数据时可自主发送,无需主机不停地轮巡,节省了网络上的数据流量,提高了传输效率。CAN总线传输介质为双绞线或同轴电缆,走线少、系统易扩展、改型灵活,正是由于这些其他通信方式无法比拟的优点,才使之成为系统分布比较分散的数据采集系统的理想总线。数据采集系统将由现场传感器送来的数据发送到空闲的CAN总线上,而总线上各节点通过预先设置好的验收码和验收屏蔽码,来决定是否使用这个消息。如果采集的数据需要进一步进行处理,则上位机可从总线上接收数据并对其处理。处理后的数据再送回CAN总线,经数
11、模转换模块或其他节点进行控制操作。当上位机需对某个节点施以控制时,可采用点对点的方式与该节点进行通讯;而当它需要对所有节点加以控制时,则采用广播方式将命令发送到总线。这样大大减少了数据的传输量,从而提高了系统的传输速率,同时又保证了系统的实时性和可靠性。下面以数据采集系统中的数据采集节点为例来说明单个节点的设计思想。四、硬件设计数据采集系统单个节点硬件框图如图3所示,由传感器检测的信息经多路开关送到可编程放大器PGA204,根据信号大小调节放大倍数(1,10,100,1000倍),放大后,经AD574转换为数字信号,送入微处理器中存储,然后根据现场情况的需要,将信号发送到CAN总线上,被其他节
12、点或上位机接收。图3节点硬件框图由于以AD574为A/D转换器的数据采集卡比较普及,故下面重点阐述数据传输部分,即CAN总线智能节点的设计与实现。CAN总线上的节点是网络上的信息接收和发送站,由于节点主要由单片机和可编程的CAN通信控制器组成,能通过编程设置工作方式、ID地址、波特率等参数,故称其为智能节点。CAN节点原理图如图4所示。89C51是节点的微处理器,作为一个存储器I/O映象设备,负责对控制器SJA1000初始化,并控制其实现数据的收发等通信任务。在CAN总线通信接口中,使用PHILIPS公司的SJA1000和TJA1040芯片。SJA1000是独立的CAN通信控制器,用于完成CA
13、N总线通信协议的物理层和数据链路层的功能。TJA1040为高性能、高速CAN收发器,使用它可增大通信距离,提高系统瞬间抗干扰能力,改良系统的抗电磁干扰及电磁辐射性能,保护总线,降低射频干扰,实现热防护等。图4CAN节点原理图为进一步提高抗干扰能力,在CAN控制器SJA1000和驱动器TJA1040之间使用了高速光耦器件6N137构成隔离电路,传输介质采用双绞线(或同轴电缆)分别接至CAN收发器TJA1040的CANH和CANL引脚。同时在总线两端CANH和CANL之间加上分离中断的1208终端电阻,对总线阻抗匹配起着相当重要的作用4。此外,为使CAN控制器和微处理器能同时可靠复位,外加了手动复
14、位电路。SJA1000的中断输出信号(/NT)接至单片机的中断引脚INT0,通过中断方式实现单片机与CAN控制器的通信。在电路实际调试过程中须注意以下几点。1.总线的两个1208终端电阻不可忽略。否则会使数据通信的抗干扰性和可靠性降低,严重时可导致无法通信。2.TJA1040(与PCA82C250兼容)的“SPLIT”引脚(代替82C250“Vref”引脚),对总线DC稳压很有效4。如果“SPLIT”用于共模电压的DC稳压,这个“SPLIT”引脚要连接到分离中断的中间分接头。若“SPLIT”不使用,只需保持开路即可。3.TJA1040引脚“STB”一般被直接连接到微处理器输出口,以便于控制收发
15、器的工作模式。五、软件设计CAN总线节点的软件设计主要包括三大部分:CAN节点初始化、报文发送和报文接收。熟悉这三部分程序的设计,就能编写出利用CAN总线进行通信的一般应用程序。当然要将CAN总线应用于通信任务比较复杂的系统中还需详细了解有关CAN总线错误处理、总线脱离处理、接收滤波处理、波特率参数设置和自动检测以及CAN总线通信距离和节点数的计算等方面的内容。下面仅就前面提到的三部分程序的设计作一个描述,以供大家在实际应用中参考。(一)初始化子程序SJA1000的初始化只有在复位模式下才可以进行。初始化主要包括工作方式的设置接收滤波方式的设置,接收屏蔽寄存器AMR和接收代码寄存器ACR的设置
16、,波特率参数设置和中断允许寄存器IER的设置等。在完成SJA1000的初始化设置以后SJA1000就可以回到工作状态进行正常的通信任务。下面提供了SJA1000初始化的51汇编源程序。程序中寄存器符号表示的是SJA1000相应寄存器占用的片外存贮器地址这些符号可在程序的头部用伪指令EQU进行定义。后文对这一点不再作特别说明。CANINI:MOVDPTR,#MOD;方式寄存器MOVA,#09H;进入复位模式对SJA1000进行初始化.MOVXDPTR,AMOVDPTR,#CDR;时钟分频寄存器MOVA,#88H;选择PeliCAN模式关闭时钟输出CLKOUTMOVXDPTR,AMOVDPTR,#
17、IER;中断允许寄存器MOVA,#0DH;开放发送中断超载中断和错误警告中断MOVXDPTR,AMOVDPTR,#AMR;接收屏蔽寄存器MOVR6,#4MOVR0,#DAMR;接收屏蔽寄存器内容在片内RAM中的首址AMR:MOVAR0MOVXDPTR,A;接收屏蔽寄存器赋初值INCDPTRDJNZR6,AMRMOVDPTR,#ACR;接收代码寄存器MOVR6,#4MOVR0,#DACR;接收代码寄存器内容在片内RAM中的首址ACR:MOVA,R0MOVXDPTR,A;接收代码寄存器赋初值INCDPTRDJNZR6,ACRMOVDPTR,#BTR0;总线定时寄存器0MOVA,#03HMOVXDP
18、TR,AMOVDPTR,#BTR1;总线定时寄存器1MOVA,#0FFH;16MHz晶振情况下设置波特率为80kbps.MOVXDPTR,AMOVDPTR,#OCR;输出控制寄存器MOVA,#0AAHMOVXDPTR,AMOVDPTR,#RBSA;接收缓存器起始地址寄存器MOVA,#0;设置接收缓存器FIFO起始地址为0MOVXDPTR,AMOVDPTR,#TXERR;发送错误计数寄存器.MOVA,#0;清除发送错误计数寄存器MOVXDPTR,AMOVDPTR,#ECC;错误代码捕捉寄存器MOVXA,DPTR;清除错误代码捕捉寄存器MOVDPTR,#MODE;方式寄存器MOVA,#08H;设置
19、单滤波接收方式并返回工作状态MOVXDPTR,ARET(二)发送子程序发送子程序负责节点报文的发送,发送时用户只需将待发送的数据按特定格式组合成一帧报文送入SJA1000发送缓存区中,然后启动SJA1000发送即可。当然在往SJA1000发送缓存区送报文之前必须先作一些判断。如下文程序所示,发送程序分发送远程帧和数据帧两种:远程帧无数据场。下面以发送数据帧为例对发送子程序作一个说明。TDATA:MOVDPTR,#SR;状态寄存器MOVXA,DPTR;从SJA1000读入状态寄存器值JBACC.4,TDATA;判断是否正在接收正在接收则等待TS0:MOVXA,DPTRJNBACC.3,TS0;判
20、断上次发送是否完成未完成则等待发送完成TS1:MOVXA,DPTRJNBACC.2,TS1;判断发送缓冲区是否锁定锁定则等待TS2:MOVDPTR,#CANTXB;SJA1000发送缓存区首址MOVA,#88H;发送数据长度为8个字节的扩展帧格式报文MOVXDPTR,AINCDPTRMOVA,#ID0;4个字节的标识符ID0-ID3MOVXDPTR,AINCDPTRMOVA,#ID1MOVXDPTR,AINCDPTRMOVA,#ID2MOVXDPTR,AINCDPTRMOVA,#ID3MOVXDPTR,AMOVR0,#TRDATA;CPU发送数据区首址MTBF:MOVA,R0INCDPTRMO
21、VXDPTR,AINCR0CJNER0,#TRDATA+8MTBF;向发送缓冲区写8个字节MOVDPTR,#CMR;命令寄存器地址MOVA,#01HMOVXDPTR,A;启动SJA1000发送RET(三)查询方式接收子程序接收子程序负责节点报文的接收以及其它情况处理,接收子程序比发送子程序要复杂一些。因为在处理接收报文的过程中,同时要对诸如总线脱离、错误报警、接收溢出等情况进行处理SJA1000报文的接收主要有两种方式:中断接收方式和查询接收方式。如果对通信的实时性要求不是很强,建议采用查询接收方式。两种接收方式编程的思路基本相同,下面仅以查询方式接收报文为例对接收子程序作一个说明。SEARC
22、H:MOVDPTR,#SR;状态寄存器地址MOVXA,DPTRANLA,#0C3H;读取总线脱离错误状态接收溢出JNZPROCRET;无上述状态结束PROC:JNBACC.7,PROCIBUSERR:MOVDPTR,#IR;IR中断寄存器出现总线脱离MOVXA,DPTR;读中断寄存器清除中断位.MOVDPTR,#MODE;方式寄存器地址MOVA,#08HMOVXDPTR,A;将方式寄存器复位请求位清0LCALLALARM.;调用报警子程序RETNOPPROCI:MOVDPTR,#IR;总线正常MOVXA,DPTR;读取中断位NBACC.3,OTHEROVER:MOVDPTR,#CMR;数据溢出
23、中断置位.MOVA,#0CHMOVXDPTR,A;在命令寄存器中清除数据溢出RETNOPOTHER:JBACC.0,RECE;IR.0=1接收FIFO未满或接收LJMPRECOUT;IR.0=0接收缓冲区无数据退出接收NOPRECE:MOVDPTR,#CANRXB;接收缓冲区首地址16准备读取数MOVXA,DPTR;首字节是接收帧格式字JNBACC.6,RDATA;RTR=1是远程请求帧无数据MOVDPTR,#CMRMOVA,#04H;CMR.2=1释放接收缓冲区MOVXDPTR,A;只有接收了数据才能释放接收缓冲区LCALLTDATA;发送对方请求的数据LJMPRECOUT;退出接收NOPR
24、DATA:MOVDPTR,#CANRXB;读取并保存接收缓冲区的数据MOVR1,#CPURBF;CPU片内接收缓冲区首址MOVXA,DPTR;读取读取CAN缓冲区的2号字节MOVR1,A;保存ANLA,#0FH;截取低4位是数据长度08ADDA,#4;加4个字节的标识符IDMOVR6,ARDATA:INCDPTRINCR1MOVXA,DPTRMOVR1,ADJNZR6,RDATA0;循环读取与保存MOVDPTR,#CMRMOVA,#04H;释放CAN接收缓冲区MOVXDPTR,ARECOUT:MOVDPTR,#ALCMOVXA,DPTRMOVDPTR,#ECCMOVXA,DPTRNOPRET需
25、要注意的是:SJA1000的初始化只有在复位模式下才可以进行。在对SJA1000寄存器设定前,主控制器通过读复位模式请求标志来检查SJA1000是否已达到复位模式。在复位模式下,主控制器必须配置SJA1000控制段的寄存器。时钟输出控制寄存器(OCR)的内容决定CAN控制器的输出方式。验收代码(ACR)和验收屏蔽(AMR)寄存器根据实际网络系统和报文标志符来确定,须引起注意的是:ACR位(AC172AC10)和信息识别码的高8位(ID1102ID13)相等,且与AMR位(AM172AM10)的相应位相或为1,即:(ID1102ID13)(AC172AC10)(AM172AM10)1111111
26、1满足上述条件的报文才予以接收3。BTR0、BTR1寄存器的内容可唯一地确定系统的通信波特率和同步跳转宽度,所以整个系统中的所有节点,这两个寄存器的内容必须相同(包括上位机),否则将无法进行通信。六、测试报告实验达到了预定结果,可以将各个分布点的测量数据准确发送到指定CAN节点。CAN总线最高速度达到1M。实验用电路板如图4所示。图5实验用电路板七、总结由基于CAN总线的智能节点在数据采集卡中的实际运用表明,在实验室条件下数据传输速率最高可达1M/s,误码率低,当节点出现严重错误时,可自动脱离总线而整个系统不受影响。由此,该节点的设计方案是可行的,既可提高系统的可靠性、数据传输速度,又具有操作
27、简便、实时性强、扩展灵活、纠检错能力强等特点,另外,它可大大节约连接导线、维护和安装费用,提高了系统的性价比。因此可广泛应用于各种测控系统中。八、致谢本设计是在导师汪老师的精心指导和鼓励下完成的。汪老师开阔的视野,严谨的学风和真诚谦逊的为人,使我在这次设计过程中受益匪浅。汪老师在生活等各方面给我的关怀和帮助也将令我终生难忘。在此,谨向汪老师表示衷心的感谢。感谢我的父母,是他们无私的爱的支持和鼓励使我顺利完成学业!感谢同组的同学对我的帮助和支持!此外,我还要感谢在我的论文中所有被援引过的文献的作者,他们是我的知识之源!最后,再次向所有曾经给予我帮助和鼓励的老师和同学致以最诚挚的谢意!附录(一)源
28、程序:#includereg51.h#defineucharunsignedchar#defineuintunsignedintsbitPB=P27;sbitLAMP=P26;ucharRTR_BIT=0;ucharINT_FLAG=0;ucharstat;/*/CAN总线寄存器映射表/高4地址:0000#defineRXF0SIDH0x0#defineRXF0SIDL0x01#defineRXF0EID80x02#defineRXF0EID00x03#defineRXF1SIDH0x04#defineRXF1SIDL0x05#defineRXF1EID80x06#defineRXF1EID0
29、0x07#defineRXF2SIDH0x08#defineRXF2SIDL0x09#defineRXF2EID80x0a#defineRXF2EID00x0b#defineBFPCTRL0x0c#defineTXRTSCTRL0x0d#defineCANSTAT0x0e#defineCANCTRL0x0f/高4地址:0001#defineRXF3SIDH0x10#defineRXF3SIDL0x11#defineRXF3EID80x12#defineRXF3EID00x13#defineRXF4SIDH0x14#defineRXF4SIDL0x15#defineRXF4EID80x16#de
30、fineRXF4EID00x17#defineRXF5SIDH0x18#defineRXF5SIDL0x19#defineRXF5EID80x1a#defineRXF5EID00x1b#defineTEC0x1c#defineREC0x1d/高4地址:0010#defineRXM0SIDH0x20#defineRXM0SIDL0x21#defineRXM0EID80x22#defineRXM0EID00x23#defineRXM1SIDH0x24#defineRXM1SIDL0x25#defineRXM1EID80x26#defineRXM1EID00x27#defineCNF30x28#de
31、fineCNF20x29#defineCNF10x2a#defineCANINTE0x2b#defineCANINTF0x2c#defineEFLG0x2d/高4地址:0011#defineTXB0CTRL0x30#defineTXB0SIDH0x31#defineTXB0SIDL0x32#defineTXB0EID80x33#defineTXB0EID00x34#defineTXB0DLC0x35#defineTXB0D00x36#defineTXB0D10x37#defineTXB0D20x38#defineTXB0D30x39#defineTXB0D40x3a#defineTXB0D50
32、x3b#defineTXB0D60x3c#defineTXB0D70x3d/高4地址:0100#defineTXB1CTRL0x40#defineTXB1SIDH0x41#defineTXB1SIDL0x42#defineTXB1EID80x43#defineTXB1EID00x44#defineTXB1DLC0x45#defineTXB1D00x46#defineTXB1D10x47#defineTXB1D20x48#defineTXB1D30x49#defineTXB1D40x4a#defineTXB1D50x4b#defineTXB1D60x4c#defineTXB1D70x4d/高4地
33、址:0101#defineTXB2CTRL0x50#defineTXB2SIDH0x51#defineTXB2SIDL0x52#defineTXB2EID80x53#defineTXB2EID00x54#defineTXB2DLC0x55#defineTXB2D00x56#defineTXB2D10x57#defineTXB2D20x58#defineTXB2D30x59#defineTXB2D40x5a#defineTXB2D50x5b#defineTXB2D60x5c#defineTXB2D70x5d/高4地址:0110#defineRXB0CTRL0x60#defineRXB0SIDH0
34、x61#defineRXB0SIDL0x62#defineRXB0EID80x63#defineRXB0EID00x64#defineRXB0DLC0x65#defineRXB0D00x66#defineRXB0D10x67#defineRXB0D20x68#defineRXB0D30x69#defineRXB0D40x6a#defineRXB0D50x6b#defineRXB0D60x6c#defineRXB0D70x6d/高4地址:0111#defineRXB1CTRL0x70#defineRXB1SIDH0x71#defineRXB1SIDL0x72#defineRXB1EID80x73
35、#defineRXB1EID00x74#defineRXB1DLC0x75#defineRXB1D00x76#defineRXB1D10x77#defineRXB1D20x78#defineRXB1D30x79#defineRXB1D40x7a#defineRXB1D50x7b#defineRXB1D60x7c#defineRXB1D70x7d/*/SPI指令集#defineCMD_RESET0xC0#defineCMD_READ0x03#defineCMD_RD_RXBUF0x90#defineCMD_WRITE0x02#defineCMD_WR_TXBUF0x40#defineCMD_RT
36、S0x80#defineCMD_RD_STATUS0xa0#defineCMD_RX_STATUS0xb0#defineCMD_BIT_M0x05/SPI控制寄存器SPCTL#defineSPI_CLK_40x0#defineSPI_CLK_160x01#defineSPI_CLK_640x02#defineSPI_CLK_1280x03#defineSPI_CPHA0x04#defineSPI_CPOL0x08#defineSPI_MSTR0x10#defineSPI_DORD0x20#defineSPI_SPEN0x40#defineSPI_SSIG0x80/SPI状态寄存器SPSTAT#
37、defineSPI_SPIF0x80#defineSPI_WCOL0x40/sbitSS=P14;ucharSPIdata16;ucharuart_data;ucharStatus;voidSendByte(uchartemp)ES=0;TI=0;SBUF=temp;while(!TI);TI=0;ES=1;Uart_int()interrupt4if(RI=1)RI=0;uart_data=SBUF;SendByte(uart_data);elseTI=0;voidUart_Init()TMOD=0x20;TL1=0xfd;TH1=0xfd;SCON=0x50;AUXR&=0xbf;ET1=
38、0;TR1=1;EA=1;voiddelay(ucharn)uchari;for(i=0;in;i+);voidSPI_Initial()/CPU时钟64分频,SPI1,1模式,SPI主机模式,MSB传输,SPI使能,SS引脚忽略,用于I/O输出SPCTL=SPI_CLK_64|SPI_CPHA|SPI_CPOL|SPI_MSTR|SPI_SPEN|SPI_SSIG;/配置SS引脚,推挽输出,初始化高电平P1M0|=04;P1M1|=14;SS=1;/SPI中断禁止,使用软件查询方式EADC_SPI=0;AUXR&=!(13);/参数1:数组指针,指向待传输的数组首/参数2:传送字节数/功能完
39、成SPI连续写操作voidSPI_Write(uchara,ucharn)uchari=0;SS=0;SPSTAT|=SPI_SPIF;while(in)SPDAT=ai;/发送1字节数据while(!(SPSTAT&SPI_SPIF);/等待传送完毕ai=SPDAT;/接收1字节数据SPSTAT|=SPI_SPIF;i+;SS=1;/SJ1000复位voidSJ1000_Reset()SPIdata0=CMD_RESET;SPI_Write(SPIdata,1);/参数1:被访问寄存器的地址/参数2:连续读写寄存器的个数/SJ1000读操作/读取的内容存储在SPIdata2SPIdata16中,存储字节由n决定voidSJ1000_Read(ucharaddr,ucharn)SPIdata0=CMD_READ;SPIdata1=addr;SPI_Write(SPIdata,n+2);#defineAddrFunc_RXB0SIDH0x0#defineAddrFunc_RXB0D00x1#defineAddrFunc_RXB1SIDH0x2#defineAddrFunc_RXB1D00x3/参数1:读RX缓冲器4功能地址之一/参数2:连续读写寄存器的个数/S