


版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
作者:PanHongliang仅供个人学习摘要随着计算机技术,微电子技术和网络技术的迅速发展,嵌入式系统技术是电子产品设计领域最为热门的技术之一。在消费电子、网络通信、工业控制等诸多领域得到了广泛的应用。ARM处理器是目前公认的领先的32位嵌入式RSIC微处理器,已成为许多行业嵌入式解决方案的 RISC标准。ARM肢术以低功耗,低成本、体积小等诸多优点在嵌入式领域获得更广泛的应用。GPS是以卫星为基础的无线导航定位系统。它具有全能性(陆地、海洋、航空和航天)、全球性、全天候、连续性和实时性的导航、定位和定时的功能,能为用户提供精密的三维坐标、速度和时间。本设计将阐述LPC2292的启动程序、串口UART通讯程序、I2C通讯程序和GPS数据解码程序,重点介绍LPC2292串口UART0I2C部件和NMEA-0813&议,在LCD显示方面介绍如何使用ZLG/GUI编写菜单界面,本软件能正确的对GPS信息进行解码,并在液晶上显示。关键词:LPC2292、GPS接收器、I2C、NMEA-0813协议AbstractWiththedevelopmentofthecomputertechnology,microelectronics andnetworktechnology,embeddedsystemisoneofthemostpopulartechnologyofthefieldofelectronicproductdesign.Embeddedsystemisadoptedinthefieldsofconsumerelectronics,networkcommunication,industrialcontrolandsoon.ARMprocessorisakindofadvanee32-bitmicroprocessorembeddedRISC,ithavebecomedembeddedRISCstardardofsolutionformanyindustries. ARMtechnologyhavelow-power,low-cost,smallsizeandmanyotheradvantages,soitappliedinthefieldofembeddedsystemwidely.GPSisaWirelessnavigation andpositioningsystembasedonSatellite.Ithasthefunction ofomnipotent(terrestrial,marine,aviationandaerospace),aglobal,all-weather, continuityandattachmentofnavigation,positioningandtiming,itcanprovideforthecustomerSophisticatedthree-dimensionalcoordinates,speedandtime.Thisarticleexpoundthathowtoprogramfor2292Bootloader、serialUART(communication、I2Ccommunication.AndGPSdatadecode,andintroduceLPC2292emphasisonserialUART0、I2CandNMEA-0813protocol,andintroducehowtouseZLG/GUIprogrammenuinterfaceinthepartoflcddisplay.ThissoftwarecandecodeGPSdataaccuracyanddisplayontheLCD.Keyword:LPC2292、GPSreceiver、I2C、NMEA-0813protocol目录TOC\o"1-5"\h\z\o"CurrentDocument"绪论 1\o"CurrentDocument"2总体方案设计 2\o"CurrentDocument"设计任务 2\o"CurrentDocument"硬件设计 2\o"CurrentDocument"软件设计 3\o"CurrentDocument"3各模块程序设计 4\o"CurrentDocument"Bootloader代码 4初始化中断向量 5初始化外部总线控制器 7堆栈初始化 8目标板初始化 9\o"CurrentDocument"移殖卩COS卫至ULPC2292 11编写OS_CUP.h 13OS_CPU_C.c文件 14OS_CPU_A.S文件 15中断及时钟节拍 17\o"CurrentDocument"信息解码程序设计 18NMEA-0183的协议标准 18GPS数据结构的定义 19\o"CurrentDocument"GPS信息解码程序设计 22\o"CurrentDocument"串口驱动程序 23串口结构图 23串口的初始化 23串口接收数据程序设计 24\o"CurrentDocument"键盘处理程序 26I2C总线 26I2C总线速度的配置 31ZLG7290 31液晶显示程序的设计 32\o"CurrentDocument"4软件的调试 34\o"CurrentDocument"软件调试流程 34\o"CurrentDocument"调试结果 35结束语 36\o"CurrentDocument"致谢 36\o"CurrentDocument"参考文献 36附录 错误!未定义书签。绪论GPS卫星导航定位技术是现代信息通信领域中一门新兴的技术。 GPS系统的空间部分由24颗卫星组成,均匀分布在6个轨道面上,地面高度为20200公里,轨道倾角为55度,扁心率约为0,周期约为12小时,卫星向地面发射两个波段的载波信号,载波信号频率分别为1575.442兆赫兹(L1波段)和1227.6兆赫兹(L2波段),卫星上安装了精度很高的原子钟,以确保频率的稳定性,在载波上调制有表示卫星位置的广播星历,用于测距的C/A码和P码,以及其它系统信息,能在全球范围内向任意多用户提供高精度的、全天候的、连续的、实时的三维测速、三维定位和授时。GPS系统的控制部分由设在美国本土的5个监控站组成,这些监控站不间断地对GPS卫星进行观测,并将计算和预报的信息由注入站对卫星信息更新。GPS系统的用户是非常隐蔽的,它是一种单程系统,用户只接收而不必发射信号,因此用户的数量也是不受限制的。目前,中国卫星导航技术应用领域十分广阔,传统测量应用及军工相关应用的比例在逐年下降,应用已渗透到许多崭新的行业。通信行业用GPS做时间同步测控;电力、有线电视、城市地下管道采用 GPS布设线路;交通、运输部门用GPS等相关集成技术营建ITS系统和监控系统;公安、银行、医疗、消防等用GPS营建紧急救援或报警系统;汽车、船舶用GPS导航;GIS数据提供商用GPS采集地理信息相关数据,并提供位置信息相关服务(LBS;广播电视行业用GPS与罗盘制造卫星电视定向接收天线;电子商务领域, GPS甚至应用于CRM客户管理和物流配送体系中;而电脑制造商、通讯设备商正在推动通讯、电脑、 GPS—体化的各类移动信息终端应用。现实的应用已经使卫星导航技术从专业化领域走向了大众化应用的广阔前景,这也使得卫星导航技术逐渐成为通信、互联网之后的第三个IT新增长点。中国卫星导航产品与服务一直呈现强劲增长的势头。据有关部门统计,GPS接收机相关产品的拥有量8万台左右,航海型约有5万台左右,应用数量最多;车载型以每年200%勺速度递增,发展最快;手持型各类个人消费终端产品形态极为丰富,最具诱惑力。本设计主要研究对基于NMEA-0813协议的GPS信息解码程序的设计,程序可以对RMC推荐定位信息)、GGA固定数据输出信息)、GSA当前卫星信息)进行精确的解码,并能在液晶显示器显示经度、纬度、日期、时间等信息。2总体方案设计设计任务本软件设计的所需完成的任务是:通过编写GPS言息解码程序,能对GPS言息进行正确的解码;通过移值ZLG/GU,设计菜单操作界面,方便用户操作,并显示详细的GPS言息。硬件设计本设计要求微处理器能提供串口接收GPS莫块输出的信息,并有较强的运算能力及高的处理速度使得菜单界面显示效果好。目前 ,ARM所提供的16/32位嵌入式RISC内核主要有以下几个系列产品:ARM7ARM9ARM10EARM1和SecurCore、StrongARM和Xscale等。ARM7TMD属于低端的ARM处理器,其最高主频可达130MIPS(MillionInstructions PerSecond),高速的运算能力能胜任绝大多数复杂的应用。本次设计采用LPC2292作为微处理器,其最高主频为60MH乙足以胜任本次设计任务丄PC2292有256kB片内Flash,为本次设计提供了足够的程序存储空间,可以不用扩展外部Flash。虽然LPC2292有16kB的片内RAM但是仍然不够用,因为本设计所移植的uCOS_II操作系统和ZLG/GUI共生成了7kB多的Data,必须为每一个任务分配足够的堆栈空间和声明存放 GPS信息的数组,加上定义必要的变量将增加大约6kB的Data,使16kB的RAM剩余不多。考虑到以后能容易的添加新的功能,本设计采用外部RAMW存程序变量,具体芯片选用高速访问时间达10ns、高性能和低功耗的IS61LV25616AL,该芯片是美国ISSI公司生产的SRAM静态RAM)存储容量是512kB,这为以后扩展功能提供极大的发挥余地。本设计采用ZLG7290作为键盘接口,ZLG7290是标准的I2C接口器件,只使用三个LPC2292的I/O口,其中有两个是I2C引脚SDASCL,另外一个引脚是外部中断EINT3,这样就可以节省I/O口又可以扩展多达64个引脚ZLG7290可以自动消除抖动,其中有8只可以作为功能键使用。另外ZLG7290内部还设置有连击计数器,能够使某键按下后不松手而连续有效。 在液晶方面可以选用点阵图形的单色液晶,也可以选用STN或者更高级别的液晶,但价格昂贵。本设计采用SMG240128作为显示器,就可以满足设计要求。本设计的总体硬件框图如图 2.1所示。图2.1总体硬件框图软件设计本设计采用卩COS召实时操作系统实现,该操作系统的优点是提高处理事件的实时性。本设计共建立3个任务,分别为TaskA、TaskBTaskG其中TaskA为起始任务,其优先级最高,在TaskA中建立TaskBTaskGTaskB是显示GPS信息任务,TaskC是键盘检测任务。 TaskB获取键盘的方法是,先建立邮箱havenewkey,并等待邮箱havenewkey,TaskC检测到按键按下时发出邮箱havenewkey,之后当执行任务TaskB时通过邮箱havenewkey获取按键值。主程序执行过程如图2.2所示。程序由7部分组成:Bootloader、GPS信息解码程序、串口中断服务程序、读按键值程序、ZLG/GU、卩COS召和主程序,下面将阐述其中几部分程序的设计方法。显示GPS简介无限期等待邮箱Havenewkey显示GPS简介无限期等待邮箱Havenewkey图2.2 主程序流程图各模块程序设计Bootloader代码Bootloader代码(启动代码)是嵌入式系统中应用程序的开头部分,它与应
用程序一起固化在ROM中,并首先在系统上运行。Bootloader代码是嵌入式程序的重要组成部分,好的Bootloader代码是系统能够正常工作的前提。本设计的启动代码的整个流程图如图3.1所示。图3.1启动代码流程图3.1.1 初始化中断向量ARM体系中共包含7个异常中断,异常的类型及向量地址见表 3.1表3.1异常的类型及向量地址异常中断类型异常中断模式向量地址复位管理模式0x00000000未定义指令未疋义模式0x00000004软件中断(SWI)管理模式0x00000008指令预取中止中止模式0x0000000C数据访问中止中止模式0x00000010
保留0x00000014外部中断请求IRQIRQ模式0x00000018快速中断请求FIQFIQ模式0X0000001C初始化中断向量是设置中断向量表,该中断向量表给出了ARM芯片出现异常时转去执行的程序地址,如当ARM芯片复位时,产生复位中断,进入管理模式,执行地址为0x00000000处的代码。初始化中断向量程序代码如下:CODE32AREAvectors,CODE,READONLYENTRY;中断向量表ResetLDRPC,ResetAddrLDRPC,UndefinedAddrLDRPC,SWI_AddrLDRPC,PrefetchAddrLDRPC,DataAbortAddrDCD0xb9205f80LDRPC,[PC,#-0xff0]LDRPC,FIQ_AddrResetAddrDCD ResetInitUndefinedAddr DCDUndefinedSWI_AddrDCDSoftwareInterruptPrefetchAddr DCDPrefetchAbortDataAbortAddr DCDDataAbortNouseDCD0IRQ_AddrDCD0FIQ_AddrDCDFIQ_Handler;未定义指令UndefinedBUndefined;取指令中止PrefetchAbortBPrefetchAbort;取数据中止DataAbortBDataAbort;快速中断FIQ_HandlerSTMFDSP!,{R0-R3,LR}BL FIQ_ExceptionLDMFDSP!,{R0-R3,LR}SUBSPC,LR,#4AREA是伪操作,定义了名为vectors的代码段,ENTR是至关重要的伪操作,作用是指定程序的入口点,即是ARM执行程序的起始点。从上面的代码可以看出若发生取数据中止、指令预取中止、未定义指令异常时 ,程序将进入死循环,这有助于用户调试程序,如执行用户代码:K+=Tab[temp],若在执行该行程序之前,未对Tab[temp]赋值,则程序将进入取数据中止死循环,这使得用户发现程序错误从而矫正错误。当发生IRQ异常,CPU跳转至异常向量地址为0x00000018处执行指令LDRPC,[PC,#-0x0FF0],此时程序计数器PC中内容为0x00000020,0x00000020减去0x00000FF0为0xFFFFF030这是向量中断控制器(VIC)的向量地址寄存器VICVectAddr的地址,这个寄存器保存当前将要服务的IRQ中断服务程序的入口,用这一条指令就可以直接跳转到需要的中断服务程序中。 保留的异常向量“DCD0xb9205f80”位置填充数据0xb9205f8是为了使向量表中所有的数据32位累加和为0。初始化外部总线控制器正确的配置外部存储器控制器是保证ARM运行良好的前提,LPC2292含有外部总线控制器,支持静态存储器映射器件,包括RAMROMFlash、BurstROM和一些外部I/O器件。该模块可同时支持多达4个单独配置的存储器组。初始化外部存储器控制器BCFG寸,主要设置该寄存器的几个域:BM(27),若使用的是BurstROM突发数据传输仅读记忆体),则设置BM为1,否则设置为0;对不同宽度的存储器,设置MW(29~28)设为00表示使用8位的存储器,设为01表示使用16位的存储器,设为10表示使用32位的存储器;若是带字节选择输入的16/32位宽度的器件,需要设置RBLE(10)为1,然后设置总线切换的空闲周期IDCY(3~0),读访问长度WST1(9~5),写访问长度WST2以下为配置外部存储器控制器的代码。LDRR0,=BCFG0LDRR1,=((1<<28)+(0x02<<11)+(1<<10)+(0x02<<5)+(1));STRR1,[R0] ;LDRR0,=BCFG1LDRR1,=((1vv28)+(0x4vv11)+(1vv10)+(0x4v<5)+(0x01));STRR1,[R0] ;LDRR0,=BCFG2;LDRR1,=((0vv28)+(0x6vv11)+(1vv10)+(0x6v<5)+(0x01)) ;STRR1,[R0]LDRR0,=BCFG3 ;设置BCFG寄存器LDR R1,= ((1<<28)+(0x5<<11)+(1<<10)+(0x5<<5)+(0x01));STRR1,[R0]本设计分别把IS61LV25616AL、SST39VF1601分配至UBANK0BANK)IS61LV25616ALSST39VF1601都是16位的外部存储器,因此MW(29~28设为1,IS61LV25616AL高速访问时间分别为10ns、90ns,以上的程序把对这两个外部存储器的读写配置成最快速度。堆栈初始化每个异常模式都有自身堆栈空间,异常处理程序通常将其它要使用的寄存器保存到这个堆栈。以下为初始化堆栈的代码。InitStackMOVR0,LR;设置中断模式堆栈MSRCPSR_c,#0xd2LDRSP,StackIrq;设置快速中断模式堆栈MSRCPSR_c,#0xd1LDRSP,StackFiq;设置中止模式堆栈MSRLDRCPSR_c,#0xd7SP,StackAbt;设置未定义模式堆栈MSRLDRCPSR_c,#0xdbSP,StackUnd;设置系统模式堆栈MSRLDRCPSR_c,#0xdfSP,=StackUsrMOVStackIrqStackFiqStackAbtStackUndPC,R0DCDIrqStackSpace+(IRQ_STACK_LEGTH-1)*4DCDFiqStackSpace+(FIQ_STACK_LEGTH-1)*4DCDAbtStackSpace+(ABT_STACK_LEGTH-1)*4DCDUndtStackSpace+(UND_STACK_LEGTH-1)*4
AREAMyStacks,DATA,NOINIT,ALIGN=2IrqStackSpaceFiqStackSpace空间IrqStackSpaceFiqStackSpace空间AbtStackSpace间4;中断模式堆栈空间4;快速中断模式堆栈4;中止义模式堆栈空SPACEFIQ_STACK_LEGTHSPACEABT_STACK_LEGTHUndtStackSpace SPACEUND_STACK_LEGTH*4; 未定义模式堆栈MSF为写状态寄存器指令,该指令可以直接设置状态寄存器CPSR或SPSR上述代码的MSF指令都是设置CPSF的控制域psr[7:0],接着指令LDR是设置各个模式的专用的堆栈指针SP的地址。用伪操作AREA声明名为MyStatus的数据段,数据伪操作SPACED各个堆栈分配内存单元,并用0初始化内存单元,从程序中可以看出中止模式、未定义模式堆栈空间都被初始化为 0,是因为在这些异常模式下都是执行一个死循环不需要保存数据。由于CPU要进行模式切换即由管理模式切换到系统模式,不能由系统模式的LR正确返回子程序,所以在初始化堆栈程序的入口处保存链接寄存器LR(模式自身的LR(R14)用于保存子程序返回地址)到R0,同时用R0返回子程序。目标板初始化根据目标板的外围电路设置存储器映射控制寄存器 MEMMAP分频器寄存器VPBPLL倍频值寄存器PLLCFG[4:0]、MAMt时寄存器。以下为初始化目标板代码。#ifdef__DEBUGMEMMAP=0x3; //remap#endif#ifdef__OUT_CHIPMEMMAP=0x3; //remap#endif#ifdef__IN_CHIPMEMMAP=0x1; //remap#endif/*设置系统各部分时钟*/倍的Fpclk倍的倍的Fpclk倍的Fpclk#if(Fpclk/(Fcclk/4))==1〃fcclk==4VPBDIV=0;#endif#if(Fpclk/(Fcclk/4))==2//fcclk==2VPBDIV=2;#endif#if(Fpclk/(Fcclk/4))==4//fcclk==1 倍的FpclkVPBDIV=1;#endif#if(Fcco/Fcclk)==2PLLCFG=((Fcclk/Fosc)-1)|(0<<5);#endif#if(Fcco/Fcclk)==4PLLCFG=((Fcclk/Fosc)-1)|(1<<5);#endif#if(Fcco/Fcclk)==8PLLCFG=((Fcclk/Fosc)-1)|(2<<5);#endif#if(Fcco/Fcclk)==16PLLCFG=((Fcclk/Fosc)-1)|(3<<5);#endifPLLFEED=0xaa;PLLFEED=0x55;while((PLLSTAT&(1<<10))==0);PLLCON=3;PLLFEED=0xaa;PLLFEED=0x55;MAMCR=0;#ifFcclk<20000000MAMTIM=1;#else#ifFcclk<40000000MAMTIM=2;#elseMAMTIM=3;#endif#endifMAMCR=2;ARM在调试前ARM在调试前若选择RelOutChip则编译器会执行#ifdef_OUT_CHIPMEMMAP=0x3; //remap#endif把MEMA设置为0x3,即选择用户外部存储器模式,从0x80000000处开始执行程序,这样0x80000000-0x8000003C异常向量表便映射0x00000000-0x0000003C同样的,若选择RelInChip则编译器会执行#ifdef_IN_CHIPMEMMAP=0x1; //remap#endif选择用户Flash模式,ARM直接从0x00000000执行程序。在本设计中使用11.0592MHz晶振,倍增器值M=4所以处理器时钟(Fcclk)为44.2368MHz为了使电流控制振荡器频率(Fcco)满足156-320MHz选择分频器的值P=2,使得Fcco=FcclkX2XP=176.9472MHz取VP盼频器的分频值为1/4,所以外设时钟(Fpclk)=Fcclk/4=11.0592MHz,为了使PLLCO和PLLCF寄存器的更改生效,必须将正确的馈送序列写入PLLFEE寄存器。馈送序列是将值0xAA写入PLLFEED接着将值0x55写入PLLFEEDwhile((PLLSTAT&(1<<10))==0);是等待PLL处于锁定状态,MA定时寄存器决定使用多少个cclk周期访问Flash存储器。这样可调整MA时序使其匹配处理器操作频率,在本设置所使用的处理器时钟较快,把MAMTI配置为3,即使用3个处理器时钟访问外部FLASH经过了初始化中断向量表、配置外部总线、初始化各模式堆栈、设置系统各部分时钟、设置存储加速模块ARMf,ARM将进入用户主程序,执行用户代码。移殖uCOS-n至ULPC2292嵌入实时操作系统卩COSn是一种占先式多任务操作系统。可固化、可裁减、移植性好,具有良好的可靠性和稳定性。它支持64个任务,具有信号量、消息邮箱、消息队列等多种任务间通信机制,图3.2说明了卩C/OSn的结构以及它与硬件的关系。
ApplitionSoftwareaCOSHConfiguration(AppticationSepcific)OS_CPU.HINCLUDES.Hi aCOSHaCOSHConfiguration(AppticationSepcific)OS_CPU.HINCLUDES.Hi(ProcesserIndententCode)IOS_CORE.C OS_TIME.CI — —'OS_FLAG.C uCOS_II.H!OSMBOX.CI_IOSMEM.CI _IOS_MUTEX.CiOSQ.CI —IOSSEM.CI_!OS_TASK.C卩COSHPort(ProcesserSpecificCode)OS_CPU.H、OS_CPU_A.ASM、OS_CPU_C.CSoftWareHardWareCPU Timer图3.2C/OS-H的结构以及它与硬件的关系aCOS-II中要移植的部分见表3.2所示。移植aCOS-II到一个新的体系机构上一般需要3个文件:OS_CPU.HC语言头文件)、OS_CPU_C.C(程序源文件)及OS_CPU_A.AS汇编程序源文件)。由表3.2可以看出,移植aCOS-II需要在OS_CPU.H包含几个类型的定义和几个常数的定义;在OS_CPU_C.C和OS_CPU_A.AS中包含几个函数的定义和时钟节拍中断服务程序的代码。 实际上,还有一个includes.h文件需要关注,因为每一个应用都包含独特的includes.h文件。表3.2aCOS-II中要移植的部分移殖内容类型所属文件描述BOOLEANINT8UINT8S、INT16UINT16S、INT32U数据类型OS_CPU.h与编译器无关的数据类型
INT32S、FP32、FP64OS_STK数据类型OS_CPU.h堆栈数据类型OS_ENTER_CRITICAL()OS_EXIT_CRITICAL()宏OS_CPU.h开关中断的代码OS_STK_GROWTH常量OS_CPU.h定义堆栈增长方向OS_TASK_SW函数OS_CPU.h任务切换时执行的代码OSTaskStkInit函数OSCPUC.c任务堆栈初始化函数OSTaskStkInit()OSTaskCreateHook()OSTaskDelHook()OSTaskSwHook()OSTaskStatHook()OSTimeTickHook()OSTimeIdleHook()函数OS_CPU_C.c卩COS-II在执行某些操作调用的用户函数,一般为空OSStartHighRdy()函数OS_CPU_A.asmn进入多任务环境时运行优先级最高的任务OSIntCtxSw()函数OSCPUA.asmn中断级的任务切换函数OSTickISR()中断服务函数OS_CPU_A.asmn时钟节拍中断服务程序根据J.Labrosse对卩COS-II移植的要求,本移植也包括 OS_CUP.hOS_CPU_C.和OS_CPU_A.三个文件。将OS_CUP_A.as更名为OS_CPU_A.是遵照ADS编译器的惯例。实际上,还有一个文件很重要,就是 IRQ.inc,它定义了一个汇编宏,是卩COS-II为ARM71用的中断服务程序的汇编与函数接口代码。时钟节拍中断服务程序也没有移植,因为其与芯片和应用都强烈相关,需要用户自己编写,不过可以通过IRQ.S简化用户代码的编写。编写OS_CUP.h数据类型定义数据类型的修改与所使用的编译器相关,不同的编译器使用不同的字节长度表示同一数据类型。根据ADS编译器的要求,这些代码定义如下:布尔变量 */无符号8位整型变量*/有符号8位整型变量*/无符号16位整型变量*/有符号16位整型变量*/无符号32位整型变量*/有符号32位整型变量*/单精度浮点数(32位长度)*/typedefunsignedcharBOOLEAN;/*typedefunsignedcharINT8U;/*typedefsignedcharINT8S;/*typedefunsignedshortINT16U;/*typedefsignedshortINT16S;/*typedefunsignedintINT32U;/*typedefsignedintINT32S;/*typedeffloatFP32; /*
号区分不同的函数。软件中断功能号如表 3.3所示表3.3 软中断功能号功能号接口函数简介0x00voidOS_TASK_SW(void);任务级任务切换函数0x01void_OSStartHighRdy(void);运行优先级最高的任务0x02voidOS_ENTER_CRITICAL(void)关中断0x03voidOS_EXIT_CRITICAL(void);开中断0x80voidChangeToSYSMode(void);任务切换到系统模式0x81voidChangeToUSRMode(void);任务切换到用户模式0x82voidTaskIsARM(INT8Uprio);任务代码是ARM弋码0x83voidTaskIsTHUMB(INT8lprio);任务代码是THUM代码typedefdoubleFP64; /*双精度浮点数(64位长度)*/typedefINT32UOS_STK;/*堆栈是32typedefdoubleFP64; /*双精度浮点数(64位长度)*/typedefINT32UOS_STK;/*堆栈是32位宽度*/⑵使用软件中断SWI作底层接口为了使底层接口函数与处理器状态无关,同时在任务调用相应的函数不需要知道函数的位置,本移植使用软件中断指令SWI作为底层接口,使用不同的功能底层接口函数声明如下:__swi(0x00)voidOS_TASK_SW(void);__swi(0x01)void_OSStartHighRdy(void);__swi(0x02)voidOS_ENTER_CRITICAL(void);__swi(0x03)voidOS_EXIT_CRITICAL(void);__swi(0x80)voidChangeToSYSMode(void);__swi(0x81)voidChangeToUSRMode(void);_swi(0x82)voidTaskIsARM(INT8Uprio);_swi(0x83)voidTasklsTHUMB(INT8Uprio);用软件中断作为操作系统的底层接口就需要在 C语言中使用SWI指令。在ADS中,有一个关键字__swi,用它声明一个不存在的函数,调用这个函数就在调用这个函数的地方插入一条SWI指令,并且可以指定功能号。(3)定义堆栈增长方向虽然ARM处理器可以支持堆栈向上增长,也可以支持堆栈向下增长,但是ADS的C语言编译器仅支持一种方式,即从上往下增长。所以定义如下:#defineOS_STK_GROWTH1OS_CPU_C.c文件OSTaskStkInit()OSTaskCreate()和OSTaskCreateExt()通过调用OSTaskStklnt()来初始
化任务的堆栈结构。软件中断异常SWI服务程序C语言部分函数原型为voidSWI_Exception(intSWI_Num,int*regs); 参数SWI_Num为功能号,而Regs为指向堆栈中保存寄存器的值的位置。程序通过一个 switch语句把各个功能分割开,各个功能相对独立。OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()卩COS-II使用宏OS_ENTER_CRITICAL和OS_EXIT_CRITICAL(分别关中断和开中断。在ARMi理器核中关中断和开中断时,通过改变程序状态寄存器CPSR中的相应位来实现。由于使用了软件中断,程序状态寄存器 CPSRS存到程序状态保存寄存器SPSF中,软件中断退出时会将SPSR恢复到CPSF中,所以程序只要改变程序状态保存寄存器SPSR中的相应的控制位就可以了。OS_CPU_A.S文件(1)SoftwareInterrupt()这是软件中断的汇编接口,当发生软件中断时,程序通过异常向量表跳转到C接口程序SoftwareInterrupt软中断的汇编与C接口程序SoftwareInterrupt软中断的汇编与LDRSP,StackSvc;STMFDSP!,{R0-R3,R12,LR}MOVR1,SP ;R1MRSR3,SPSRTSTR3,#T_bit ;LDRNEHR0,[LR,#-2] ;BICNER0,R0,#0xff00LDREQR0,[LR,#-4] ;BICEQR0,R0,#0xFF000000;r0=SWI处。软件中断代码如下:重新设置堆栈指针指向参数存储位置中断前是否是Thumb犬态是:取得Thumb犬态SWI号否:取得arm状态SWI号号,R1指向参数存储位置CMPR0,#1LDRLOPC,=OSIntCtxSwLDREQPC,=__OSStartHighRdy;SWI0x01 为第一次任务切换BLSWI_ExceptionLDMFDSP!,{R0-R3,R12,PC}AStackSvcDCD(SvcStackSpace+SVC_STACK_LEGTH*4-4)因为执行任务切换时堆栈指针会指向用户的堆栈, 这样下一次进入管理模式就会破坏用户堆栈,从而导致程序执行不正确。所以程序在一开始设置堆栈指针。软中断指令使处理器进入管理模式,而用户程序处于系统/用户模式,其它异常也有自己的处理器模式,都有各自的堆栈指针,不会因为给堆栈指针赋值而破坏其它处理器模式的堆栈而影响其它程序的执行。 返回的地址已经存储在连接寄存器LR中而不是存储在堆栈中。由于进入管理模式自动关中断,所以这段程序不会被其它程序同时调用,设置的堆栈指针指向的位置肯定是空闲位置,后一次调用不会影响前一次调用。这样就可以保证“LDRSP,StackSvc”进行正确的堆栈指针设置。OSCtxSw()任务级的任务切换函数,当任务被阻塞而主动请求CPU调度时被执行,由于此时的任务切换在非异常模式下进行,因此有别于中断级别的任务切换。它的工作是先将当前的任务的CPU现场保存到该任务堆栈中。然后获得最高优先级任务的堆栈指针,从该堆栈中恢复此任务的CPU现场,使之继续执行。这样就完成一次任务的切换。OSIntCtxSw()中断级的任务切换,在时钟中断ISR中发现有高优先级任务等待时钟信号的到来,贝恠中断退出后并不是返回被中断的任务, 而是直接调度就绪的高优先级任务执行(函数OSIntExitO被用来在ISR使得更高优先级的任务处于就绪态)。从而能够尽快让高优先级的任务得到响应, 保证系统的实时性能。其基本原理与任务的切换相同。但是由于进入中断时已经保存了被中断的 CPU现场,因此不用做类似的操作,只需对堆栈指针做相应调整。OSStartHighRdy()卩C/OS-H启动多任务环境的函数叫做OSStart()。用户在调用OSStart()之前,必须已经建立了一个或更多任务。 OSStart()最终调用OSStartHighRdy()函数运行多任务启动前优先级最高的任务。由软中断的汇编接口SWI_Exception()与C接口程序Softwarelnterrupt()可知,这是调用软中断的1号功能。这是因为ARM处理器核具有两个指令集,在执行Thumb指令的状态时不是所有寄存器都可见,而且任务可能不在特权模式。为了兼容任意一种模式,本移植使用软中断指令SWI使处理器进入管理模式和ARMt令状态,并使用功能1实现OSStartHighRdy的功能。卩C/OS-H中调用函数OSStartHighRdy()之前,OSTCBHighRd指向的是优先级最高的任务的任务控制块。—OSStartHighRdy代码如下:MSRCPSR_c,#(Nolnt|SYS32Mode)LDRR4,=OSRunningMOVR5,#1STRBR5,[R4]BLOSTaskSwHookLDRR6,=OSTCBHighRdyLDRR6,[R6]B OSIntCtxSw_1在卩C/OS-H中,需要用户提供周期性信号源,用于实现时间延时和确认超时。必须在多任务系统启动以后再开启时钟节拍器,也就是在调用 OSStart()之后。换句话说,在调用OSStart()之后做的第一件事是初始化定时器中断。 通常,容易犯的错误是将允许时钟节拍器中断放在系统初始化函数 OSInit()之后,在调用启动多任务系统启动函数OSStart()之前允许时钟节拍中断。卩C/OS-H的启动多任务函数OSStart()会在最后调用OSStartHighRdy,而SStartHighRdy的第一条语句MSRCPSR_c,#(Nolnt|SYS32Mode),是将CPSF的第8位置1,允许IRQ中断。中断及时钟节拍(1) 中断句柄HANDLER中断句柄HANDLE可以容易的声明中断处理函数,如在IRQ.s文件中添加中断句柄Uart0_Handler HANDLERUART0_IR其中UART0_IRQ是中断处理函数名,可以用语句VICVectAddr1=(uint32)Uart0_Handler;告知微处理器发生UART(中断时中断处理程序的地址。中断句柄HANDLE是通过宏定义实现的。(2)中断程序框架{OS_ENTER_CRITICAL();①清除中断源;②通知中断控制器中断结束;③OS_EXIT_CRITICAL();④用户处理代码;}⑤程序中的①、④是必需的,因为在中断发生之前一定是允许中断的,如果用户在程序③之前调用卩C/OS-H的系统服务函数,就很可能打开中断,而在系统没有清中断和/或③没有执行的情况下就开中断就会造成芯片的中断系统工作异常而使程序工作异常。如果用户没有这种情况,则可以不要程序①,而把程序④用普通的方法打开中断。挂接SWI软件中断通过在Startup.s 中设置中断向量表的软件中断代码处添加程序 LDRPC,SWI_Addr并对SWI_Addr作如下定义:SWI_AddrDCDSoftwareInterrupt每当发生软件中断时,程序便跳转到软件中断的汇编接口程序,执行相应的程序。时钟节拍通过Timer。提供时钟节拍,Timer0中断处理程序如下:T0IR=0x01;VICVectAddr=0;// 通知中断控制器中断结束OSTimeTick();TimerO的匹配寄存器的设置是,T0MR0=(Fpclk/OS_TICKS_PER_SEC);即每1/OS_TICKS_PER_SE秒发生一次中断。信息解码程序设计3.3.1NMEA-0183的协议标准本设计使用SRIFStarIII模块接收GPS定位信息,该模块遵循NMEA-0183(NationalMarineElectronicsAssociation 即国际海洋电子协会)协议标准。以下分别列出NMEA-0183协议标准的输出数据格式中的RMCGGAGSARM—RecommendedMinimumSpecificGNSSDataExample:$GPRMC,161229.487,A,3723.2475,N,12158.3416,W,0.13,309.62,120598,,*10nameexampleuintsDescriptionMessageID$GPRMCRMCprotocolheaderUTCTime161229.487hhmmss.sssStatusAA=datavalidorV=datanotvalidLatitude3723.2475ddmm.mmmmN/SIndicatorNN=northorS=southLongitude12158.3416dddmm.mmmmE/WIndicatorWE=eastorW=westSpeedOverGround0.13knotsCourseOverGround309.62degreestrueDate120598ddmmyyMagneticVariation2.degreesE=eastorW=westModeAA=Autonomous,D=DGPS,E=DRChecksum*10<CR><LF>AEndofmessageterminationGGA—GlobalPositioningSystemFixedDataExample:$GPGGA,161229.487,3723.2475,N,12158.3416,W,1,07,1. 0,9.0,M,,,,0000*18NameExampleUnitsDescriptionMessageID$GPGGAGGAprotocolheader
UTCTime161229.487hhmmss.sssLatitude3723.2475ddmm.mmmmN/SIndicatorNN=northorS=southLongitude12158.3416dddmm.mmmmE/WIndicatorWE=eastorW=westPosition FixIndicator1SeeTable1-4SatellitesUsed07Range0to12HDOP1.0Horizontal Dilution ofPrecisionMSLAltitude9.0metersUnitsMmetersGeoidSeparationmetersUnitsMmetersAgeofDiff.Corr.secondNullfieldswhenDGPSisnotusedDiff.Ref.StationID0000Checksum*18<CR><LF>EndofmessageterminationGS—GNSSDOPandActiveSatellitesExample:$GPGSA,A,3,07,02,26,27,09,04,15,,,,,,1.8,1.0,1.5*33NameExampleUnitsDescriptionMessageID$GPGSAGSAprotocolheaderMode1ASeeTable1-7Mode23SeeTable1-8Satellite Used1.Satelliteusedinsolution.107SvonChannel1SatelliteUsed102SvonChannel2SatelliteUsed1SvonChannel12PDOP1.8Position Dilution ofPrecisionHDOP1.0Horizontal Dilution ofPrecisionVDOP1.5Vertical Dilution ofPrecisionChecksum*33<CR><LF>Endofmessagetermination332GPS数据结构的定义根据GPS接收器输出数据格式,定义保存GPS数据的结构体,这使得容易对GPS数据进行操作。由于各种GPS言息组成成分不一样,所以定义不同的结构体以下为在程序中所定义的结构体。对于RMC言息定义如下的结构体typedefstructGPRMC」nformation{UTCTime」nformationRMC_UTCTime;uint8FixStatus[1];Latitude」nformationRMC_Latitude;〃uint8NSInditor[1];〃Longitude」nformation RMC_Longitude;//uint8EWInditor[1];//uint8 SpeedOverGroud[10];〃uint8CourseOverGroud[10];////Date」nformationRMCDate;//uint8RMCDate[6];uint8MagneticVariation[10];//uint8Mode[1];//uint8CRC[2];uint8checkresult;}GPRMC_BUF,*P_GPRMC_BUF;该结构体中包含了三个共用体::UTCTime_InformationtypedefunionUTCTime_Struct{uint8UTCTimeBuf[12];struct{uint8Hour[2];uint8Minute[2];uint8Second[2];uint8MilliSecond[6];}UTCTimeUnits;}UTCTime_Information;:Latitude_InformationtypedefunionLatitude_Struct{uint8LatitudeBuf[9];struct
{uint8LatDegree[2];uint8 LatMinute[2];uint8 LatMilliMinute[5];}LatitudeUnits;}Latitude_lnformation,*P_Latitude_lnformation;iii:Longitude_InformationtypedefunionLongitude_Struct{ uint8LongitudeBuf[10];struct{uint8 LonDegree[3];uint8 LonMinute[2];uint8LonMilliMinute[5];}LongitudeUnits;}Longitude_Information,*P_Longitude_Information;对于GGA言息定义如下的结构体typedefstructGPGGA_Information{UTCTime」nformationGGA_UTCTime;〃Latitude_Information GGA_Latitude;〃uint8NSIndicator[1];〃uint8EWIndicator[1];//Longitude_InformationGGA_Longitude;//Longitude_InformationGGA_Longitude;//uint8PositionFixIndicator[1];//uint8SatellitesUse[2];〃uint8HDOP[4];〃uint8MSLAItitude[7];〃uint8uint1[1];//uint8GeoidSeparation[6];//uint8uint2[1];//uint8AgeOfDiffErr[4];//uint8DiffRefStionID[4];//uint8CRC[2];uint8checkresult;}GPGGA_BUF,*P_GPGGA_BUF;对于GSA言息定义如下的结构体:typedefstructGPGSA_Information{uint8Mode[1];〃uint8FixMode[1];〃uint8SatelliteUse1[2];〃uint8SatelliteUse2[2];〃uint8SatelliteUse3[2];〃uint8SatelliteUse4[2];〃uint8SatelliteUse5[2];〃uint8SatelliteUse6[2];〃uint8SatelliteUse7[2];〃uint8SatelliteUse8[2];〃uint8SatelliteUse9[2];〃uint8SatelliteUse10[2];〃uint8SatelliteUse11[2];〃uint8SatelliteUse12[2];〃uint8PDOP[4];〃uint8HDOP[4];〃uint8 VDOP[4];〃uint8CRC[2];uint8checkresult;}GPGSA_BUF,*P_GPGSA_BUF;GPS信息解码程序设计NMEA-0183协议的数据的特点是‘$'开头,‘$'后的5个字符表示信息的类型,校验和是在‘*'后的2个字符,并以‘\r'、‘\n'作为结束符,针对这样的数据结构特点,本设计的解码程序采用状态机的方法进行解码,定义一个枚举类型的解码状态变量status。enum{ begin_status=0,found_status,gpgga_status,gprmc_status,gpvtg_status,gpgsa_status,crc_status1,crc_status2};其中begin_status为开始状态,表示未对PGS言息解码,当搜索到‘$',status转到found_status,表示接收到GPS信息头,接着若搜索到GPGGA则status转到gpgga_status,表示程序处于对GGA言息解码状态;若搜索到GPRMC则status转到gprmc_status,表示程序处于对RMC信息解码状态;若搜索到GPGSAUstatus进入gpgsa_status表示程序处于对GSA言息解码状态。在以上的解码状态下,若程序搜索到‘*',status进入保存校验和crc_status1状态,在此状态下若搜索到‘\r',status 进入校验和计算状态crc_status2状态,最后status重新进入begin_status,继续对GPS信息解码。(注:status也会从found_status直至退回begin_status,如当status处于found_status时,若接着搜索到的5个字符不是GPGGAGPRMCGPGSAP的字符时,则status将返回begin_status。)在串口中断服务程序里,接收$GPRM后的250个字符,在这250个字符里包含RMCGGAGSA言息,按照上面的思想编写GPS信息解码程序。3.4 串口驱动程序本设计使用LPC2292UART接收GPS1出的定位信息,LPC2292的UART0勺特点是具有16字节接收FIFO16字节发送FIFO,接收器FIFO触发点可为1,4,8和14字节,内置波特率发生器。串口结构图图3.3为LPC2292UART0吉构方框图。图3.3UART0方框图UART(接收器模块U0RX监视串行输入线RxD0的有效输入。UART(Rx移位寄存器(U0RSR通过RxD0接收有效的字符。当U0RSR8收到一个有效的字符时,它将该字符传送到UARTCRX缓冲寄存器FIFO中,等待CPU通过VPB接口进行访问。UART发送器模块U0Tx接收CPU或主机写入的数据并将数据缓存到UARTCTx保持寄存器FIFO(U0THR中。UARTCTx移位寄存器U0TSF读取U0THF中的数据并将数据通过串行输出引脚TxD0发送。串口的初始化串口初始化涉及到的寄存器有除数锁存 U0DLLU0DLM引脚功能选择寄存器PINSEL0UART0FIFO空制寄存器U0FCRUART(线控制寄存器U0LCR,UART0中断使能寄存器U0IER其中除数锁存U0DLLU0DLM是用于设置串口通讯波特率,它保存了用于产生波特率时钟的VPB时钟(pclk)分频值。由于波特率时钟必须是波特率的16倍,因而所设的除数锁存U0DLLU0DLM分频值是(Fpclk/16)/bps,bps是用户要设置的波特率,常用波特率值是115200、57600、38400、19200……等,在本设计中使用9600的波特率与GPS模块通讯。设置引脚功能选择寄存器PINSEL0的1:0位与3:2位为01,使能P0.0、P0.1串口通信功能。UARTCFIFO控制寄存器U0FCR控制9UARTCRX和TXFIFO的操作,置位U0FCR的0位是使能对UART0Rx和TxFIFO以及U0FCR7:1的访问,置位U0FCF的1位会清零,UARTdRxFIFO中的所有字节并复位指针逻辑,置位U0FCF的2位清零UARTCTxFIFO中的所有字节并复位指针逻辑,设置U0FCR勺7:6位为10选择触发点2,默认8个字节触发。UART(线控制寄存器U0LCR决定发送与接收数据字符的格式,本设计中设置U0LCR的1:0位为11,即8位字符长度,1个停止位,无奇偶产生和校验置位。设置UART0中断使能寄存器U0IER的位0为1,使能RDA中断。串口初始化代码:PINSEL0'=(PINSEL0&0xfffffff0)|5;U0LCR=:0x80;//允许访问分频因子寄存器Fdiv=(Fpclk/16)/bps;//设置波特率U0DLM=:Fdiv/256;U0DLL=Fdiv%256;U0LCR=:0x03;//禁止访问分频因子寄存器//且设置为8,1,nU0FCR=:0x87;//初始化FIFOU0IER=0x01;//串口接收数据程序设计本设计采用中断方式接收GPS接收机输出到串口的数据,为了使用中断接收数据,除了对U0IER寄存器设置之外,还要对向量中断控制器(VIC)进行设置。向量中断控制器(VIC)向量中断控制器(VIC)的特点是:具有32个中断请求输入,可将其编程分为3类:FIQ、向量IRQ和非向量IRQ。可编程分配机制意味着不同外设的中断优先级可以动态分配并调整。快速中断请求(FIQ)要求具有最高优先级。如果分配给FIQ的请求多于1个,VIC将中断请求“相或”后向ARM处理器产生FIQ信号。当只有一个中断被分配为 FIQ时可实现最短的FIQ等待时间,因为FIQ服务程序只要简单地启动器件的处理就可以了。 但如果分配给FIQ级的中断多于1个,FIQ服务程序从VIC中读出一个字来识别产生中断请求的 FIQ中断源是哪一个。向量IRQ具有中等优先级。该级别可分配32个请求中的16个。32个请求中的任意一个都可分配到16个向量IRQslot中的任意一个,其中slotO具有最高优先级,而slot15贝U为最低优先级。非向量IRQ的优先级最低。VIC将所有向量和非向量IRQ“相或”向ARMi理器产生IRQ信号。IRQ服务程序可通过读取VIC的一个寄存器立即启动并跳转到相应地址。如果有任意一个向量 IRQ发出请求,VIC则提供最高优先级请求IRQ服务程序的地址,否则提供所默认程序的地址。该默认程序由所有非向量IRQ共用。默认程序可读取任何VIC寄存器以确定哪个IRQ被激活设置UART冲断把UART(设置为向量中断,代码如下:VICVectAddrl=(uint32)Uart0_Handler;VICVectCntl1=(0x20|0x06);VICIntEnable=1<<6;LPC2292执行UART冲断过程在UART0接收中断请求产生之后,微控制器切换到管理模式并跳转到地址0x00000018执行代码,在启动代码中,把0x00000018地址处设置的执行代码是LDRPC,[PC,#-0xff0] ,该指令将VICVectAddr寄存器中保存的地址装入PC,此时VICVectAddr的值和VICVectAddr1的值相同,由于VICVectAddr1存放了UART冲断处理程序的地址,因而LPC2292将执行UART(中断处理程序。UART0中断处理程序每当GPS接收器把数据输出到LPC2292时,UART0中断处理程序把接收到数据存放到Gps_Data中,Gps_Data为自定义结构体变量:typedefstructData_Buf{uint32 writepoint;uint32 readpoint;uint8RecGpsData[MaxRecDat];}RecData,*P_RecData;RecDataGps_Data;UART(中断处理程序示例代码:voidUART0_IRQ(void){uint8i,j,k;i=U0IIR;OS_ENTER_CRITICAL();while(((i=U0IIR)&0x01)==0){switch(i&0x0e){case0x02:break;case0x04:case0x0c:while((U0LSR&0x01)!=0){gps_Data.RecGpsData[Gps_Data.writepoint++]=U0RBR;if(Gps_Data.writepoint>=MaxRecDat)Gps_Data.writepoint=0;}break;case0x06:k=U0LSR;break;default:break;}}VICVectAddr=0;OS_EXIT_CRITICAL();}当发生UART(中断时,读取UART(中断标识寄存器U0IIR寄存器,若没有中断挂起时,处理器直接退出中断处理程序,若至少有一个中断挂起时,处理器继续判断,若中断标识为接收数据可用或字符超时指示时,从UART0接收器缓存寄存器U0RF读取数据存放到gps_Data中,直到UART(线状态寄存器U0LSR的0位为0即U0RBM空。3.5键盘处理程序在本设计中,采用ZLG7290检测键盘,ZLG7290是标准的IIC串行器件,ZLG7290的I2C接口传输速率可达32kbit/s,容易与处理器接口并提供键盘中断信号提高主处理器时间效率,ZLG7290的从地址slaveaddress为70H(01110000B)。3.5.1I2C总线LPC2292的I2C总线接口的特点:标准的I2C总线接口,可配置为主机、从机或主/从机,可编程时钟可实现通用速率控制,主机从机之间双向数据传输,多主机总线(无中央主机),同时发送的主机之间进行仲裁,避免了总线数据的冲突,串行时钟同步使器件在一条串行总线上实现不同位速率的通信,串行时钟同步可作为握手机制使串行传输挂起和恢复,I2C总线可用于测试和诊断。I2C总线上传输数据的类型:I2C总线上存在两种类型的数据传输i:主发送器向从接收器发送数据。主机发送的第一个字节是从机地址。接下来是数据字节流。从机每接收一个字节返回一个应答位。ii:从发送器向主接收器发送数据。第一个字节(从地址)由主机发送。从机返回一个应答位。接下来从机向主机发送数据字节。主机每接收一个字节返回一个应答位。接收完最后一个字节,主机返回一个“非应答位” 。主器件产生所有串行时钟脉冲和起始以及停止条件。出现停止条件或重复的起始条件时传输结束。由于重复的起始条件同时是下一个串行发送的开始,因此I2C总线不会被释放。I2C操作模式:有4种操作模式:主发送器模式、主接收器模式、从发送器模式和从接收器模式。主发送器模式:在该模式中,数据从主机发送到从机。在进入主发送器模式之前,I2CONSE■必须按照表3.4进行初始化。必须置位I2EN来使能I2C功能。如果AA位为0,而另一个器件成为总线的主控器时,I2C将不会对任何地址产生应答。也就是说它无法进入从模式。STASTO和SI必须设置为0。向I2CONCLR寄存器中的SIC位写入1可清零SI。表3.4主模式配置位76543210位名--I2ENSTASTOSIAA----值--01000----I2EN=1,使能I2C接口;AA=0,不产生应答信号,即不允许进入从机模式;SI=0,I2C中断标志为0;STO=0停止标志为0;STA=0起始标志为1。主模式I2C的数据格式见图3.4,起始和停止条件用于指示串行传输的起始和结束。第一个发送的数据包含接收器件的从地址(7位)和读写操作位。在此模式下,读写操作模式位(R/W)应该为0,表示执行写操作。数据的发送每次8位,即一字节,每发送完一字节,主机都收到一个应答位(从机回发的)。…A(图…A(图3.4该模式的数据发送操作步骤是:“1”写从地址据中的格式据应答「A/A27=/应答(SDA为低)/A=非应答(SDA为高)$=起始条件卩=停止条件A:通过软件置位STA进入I2C主发送器模式,I2C逻辑在总线空闲后立即发送一个起始条件。B:当发送完起始条件后,SI位置位。此时I2STAT(状态寄存器)中的状态代码为08H,该状态代码用于中断服务程序的处理。C:把从地址和写方向位装入 I2DAT(数据寄存器),然后清零SI位(向I2CONCL寄存器中得SIC位写入1可清零SI),开始发送从地址和写方向位。D:当从地址和写方向位已发送且接收到应答位后, SI位再次置位(可能的状态代码为18H,20H或38H)。E:当状态码为18H时,表明从机已应答,则可以将数据装入I2DAT,然后清零SI位,开始发送数据。F:当正确发送数据,SI位再次置位(可能的状态码为28H,30H)。此时可以再次发送数据或者置位STO结束总线。每个状态代码及其执行的相应动作如表3.5所示。主模式I2C的数据发送程序原理示意图如图3.5所示。表3.5 主发送器模式中的格式状I2C总线应用软件的响应I2C硬件执行的下一个动作态代码(I2STAT)硬件状态读/写I2DATSTA写12(STO;O卜SIJAA08H已发送起始条件装入SLA+Wx00x将发送SLA+W10H已发送重复装入SLA+Wx00x同上起始条件装入SLA+Rx00x将发送SLA+W,I2(切换到主机接收模式18H已发送装入的数据000x将发送数据字节,接收ACKS
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 黑土坡治理施工方案
- aq2006尾矿库安全技术规程
- 玻璃桥维护施工方案
- 2025年兰考三农职业学院单招职业倾向性测试题库审定版
- 2025年黄河交通学院单招职业适应性测试题库及参考答案
- 2025年重庆市乐山市单招职业适应性测试题库带答案
- 2025年大庆医学高等专科学校单招职业适应性测试题库参考答案
- 2025年哈尔滨传媒职业学院单招职业技能测试题库新版
- 5 g k h 教学设计-2024-2025学年语文一年级上册统编版
- 环境科学与工程环境保护法规及案例分析试卷解析
- 2023年北京语言大学新编长聘人员招聘笔试真题
- 15J403-1-楼梯栏杆栏板(一)
- 4.2 歌曲 《小小少年》课件(8张)
- 武汉版生命安全教育一年级-第19课《做好“四勤”防疾病》课件
- 小学教案、作业常规检查方案
- 2024教培合作简单协议书
- 公司集团保安服务 投标方案(技术方案)
- 2024年中级纤维检验员职业鉴定考试题库(含答案)
- 水利水电工程单元工程施工质量验收评定表及填表说明
- YYT 0661-2017 外科植入物 半结晶型聚丙交酯聚合物和共聚物树脂
- 人教版版五年级数学下册 第二单元综合测试卷
评论
0/150
提交评论