您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 酒店餐饮 > TMS320F2812原理及其C语言程序开发
11.4.4Parallel_Boot.c(并行I/O口下载模式)//----------------------------------------------------------------------------------------------------------------////F2812并行GPIO下载模式的程序代码////功能函数//Uint32Parallel_Boot(void)//inlinevoidParallel_GPIOSelect(void)//inlineUint16Parallel_CheckKeyVal(void)//invlinevoidParallel_ReservedFn(void)//Uint32Parallel_GetLongData(Uint16DataSize)//Uint16Parallel_GetWordData(Uint16DataSize)//voidParallel_CopyData(Uint16DataSize)//voidParallel_WaitHostRdy(void)//voidParallel_HostHandshake(void)///----------------------------------------------------------------------------------------------------------------//#include“F2812_Boot.h”inlinevoidParallel_GPIOSelect(void);inlineUint16Parallel_CheckKeyVal(void);inlinevoidParallel_ReservedFn();Uint32Parallel_GetLongData(Uint16DataSize);Uint16Parallel_GetWordData(Uint16DataSize);voidParallel_CopyData(Uint16DataSize);voidParallel_WaitHostRdy(void);voidParallel_HostHandshake(void);#defineHOST_DATA_NOT_RDYGPIODataRegs.GPDDAT.bit.GPIOD5!=0#defineWAIT_HOST_ACKGPIODataRegs.GPDDAT.bit.GPIOD5!=1//通过改变GPIOD6的值来实现产生DSP应答信号和清楚DSP的准备好信号#defineDSP_ACKGPIODataRegs.GPDSET.all=0x0040#defineDSP_RDYGPIODataRegs.GPDCLEAR.all=0x0040#defineDATAGPIODataRegs.GPBDAT.all//GPIO的控制和数据寄存器对应的数据段#pragmaDATA_SECTION(GPIODataRegs,”.GPIODataRegs”);VolatilestructGPIO_DATA_REGSGPIODataRegs;#pragmaDATA_SECTION(GPIOMuxRegs,”.GPIOMuxRegs”);VolatilestructGPIO_MUX_REGSGPIOMuxRegs;#endif//-----------------------------------------------------------------------------------------------------------------//Uint32Parallel_Boot(void)//-----------------------------------------------------------------------------------------------------------------//这个程序模块时并行GPIO下载模式的主要程序,数据程序通过GPIOB口下载,其中这种//模式支持8位或16位数据流。当传输的数据流为8位时,定义先传输高位,然后再传输//低位,该程序将返回一个入口指针地址,指向InitBoot程序,当程序执行完毕后,将调用//ExitBoot程序。//-----------------------------------------------------------------------------------------------------------------Uint32Parallel_Boot(){Uint32EntryAddr;Uint16DataSize;Parallel_GPIOSelect();DataSize=Parallel_CheckKeyVal();If(DataSize==ERROR)returnFlash_ENTRY_POINT;Parallel_ReservedFn(DataSize);ReturnEntryAddr;}//-----------------------------------------------------------------------------------------------------------------//voidParallel_GPIOSelect(){EALLOW;//GPIOB口设置为普通I/O口,0代表普通I/O口,1代表特殊功能口GPIOMuxRegs.GPBMUX.all=0x0000;//设置GPIOD5和GPIOD6口为普通I/O口,在程序中作为DSP和主机之间的握手信号线GPIOMuxRegs.GPDMUX.all&=0xFF9F;//GPIOB口都设置为输入口,D5作为主机控制口,设置成输入口;D6作为DSP返回的应//答信号,设置成输出口。其中寄存器的值为0代表输入,1代表输出GPIOMuxRegs.GPDDIR.bit.GPIOD6=1;GPIOMuxRegs.GPDDIR.bit.GPIOD5=0;GPIOMuxRegs.GPBDIR.all=0x0000;EDIS;}//voidParallel_CheckKeyVal(void)//-------------------------------------------------------------------------------------------------------------------//判断接收到的数据为8位还是16位格式,如果都不是那么将返回错误。需要说明的是如果主机没有做出反应,那么程序将一直在此中断,这里没有超时机制//-------------------------------------------------------------------------------------------------------------------InlineUint16Parallel_CheckKeyVal(){Uint16wordData;//从平行GPIO口上获取一个字节数据,然后与16位数据关键值相比,如果不是16位数据,然后再与8位数据关键相比WordData=Parallel_GetWordData(SIXTEEN_BIT);If(wordData==SIXTEEN_BIT);//如果不是8位数据结构模式,那么检查16位数据结构模式//调用获取数据程序(16位数据结构),此时用户只需获取关键值的高有效位,可以忽略高8位,和前面字节组成关键值wordData=wordData&0x00FF;wordData|=Parallel_GetWordData(SIXTEEN_BIT)8;if(wordData==EIGHT_BIT_HEADER)returnEIGHT_BIT;//如果获取的关键值不是16位数据也不是8位数据的关键值,那么将返回错误elsereturnERROR;}//------------------------------------------------------------------------------------------------------------------//voidParallel_ReservedFn(void)//------------------------------------------------------------------------------------------------------------------//这个函数用于读取8个保留字节,读取这8个字节数据后,系统自动丢弃,这8个字节的空间主要用于未来的开发//------------------------------------------------------------------------------------------------------------------inlinevoidParallel_ReservedFn(Uint16DataSize);{Uint16i;//读取并丢弃8个字节for(i=1;i=8;i++){Parallel_GetWordData(DataSize);}Return;}//------------------------------------------------------------------------------------------------------------------//voidParallel_CopyData(void)//------------------------------------------------------------------------------------------------------------------//该函数是并行GPIO口程序复制函数,程序将数据块从主机复制到指定的RAM空间,且在复制过程中没有错误检测。当所有的数据都下载完毕后,主机将发送一个数据大小为0x0000的信号,指示数据发送完毕//------------------------------------------------------------------------------------------------------------------voidParallel_CopyData(Uint16DataSize){structHEADER{Uint16BlockSize;Uint32DestAddr;}BlockHeader;Uint16worData;Uint16I;//获取第一个数据块的大小BlockHeader.BlockSize=Parallel_GetWordData(DataSize);//当数据块的大小大于0就开始复制程序到首地址为DestAddr的空间中,其中DestAddr为用户设置的程序存放空间的首地址While(BlockHeader.BlockSize!=(Uint16)0x0000){BlockHeader.DestAddr=Parallel_GetLongData(DataSize);for(i=1;i=BlockHeader.BlockSize;i++){wordData=Parallel_GetWordData(DataSize);*(Uint16*)BlockHeader.DestAddr++=wordData;}//获取下一个数据块的大小BlockHeader.BlockSize=Parallel_GetWordData(DataSize);}return;}//---------------------------------------------------------
本文标题:TMS320F2812原理及其C语言程序开发
链接地址:https://www.777doc.com/doc-6731826 .html