《TMS320F2812原理及其C语言程序开发(共14页).doc》由会员分享,可在线阅读,更多相关《TMS320F2812原理及其C语言程序开发(共14页).doc(14页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上11.4.4 Parallel_Boot.c(并行I/O口下载模式) /-/F2812并行GPIO下载模式的程序代码/功能函数/Uint32 Parallel_Boot(void)/inline void Parallel_GPIOSelect(void)/inline Uint16 Parallel_CheckKeyVal(void)/invline void Parallel_ReservedFn(void)/Uint32 Parallel_GetLongData(Uint 16 DataSize)/Uint 16 Parallel_GetWordData(Uin
2、t 16 DataSize)/void Parallel_CopyData(Uint 16 DataSize)/void Parallel_WaitHostRdy(void)/void Parallel_HostHandshake(void)/-/#include “F2812_Boot.h”inline void Parallel_GPIOSelect(void);inline Uint16 Parallel_CheckKeyVal(void);inline void Parallel_ReservedFn();Uint32 Parallel_GetLongData(Uint 16 Data
3、Size);Uint16 Parallel_GetWordData(Uint16 DataSize);void Parallel_CopyData(Uint16 DataSize);void Parallel_WaitHostRdy(void);void Parallel_HostHandshake(void);#define HOST_DATA_NOT_RDY GPIODataRegs.GPDDAT.bit.GPIOD5!=0#define WAIT_HOST_ACK GPIODataRegs.GPDDAT.bit.GPIOD5!=1/通过改变GPIOD6的值来实现产生DSP应答信号和清楚D
4、SP的准备好信号#define DSP_ACKGPIODataRegs.GPDSET.all=0x0040#define DSP_RDY GPIODataRegs.GPDCLEAR.all=0x0040#define DATA GPIODataRegs.GPBDAT.all/GPIO的控制和数据寄存器对应的数据段#pragma DATA_SECTION(GPIODataRegs,”.GPIODataRegs”);Volatile struct GPIO_DATA_REGS GPIODataRegs;#pragma DATA_SECTION(GPIOMuxRegs,”. GPIOMuxRegs”
5、);Volatile struct GPIO_MUX_REGS GPIOMuxRegs;#endif/-/Uint32 Parallel_Boot(void)/-/这个程序模块时并行GPIO下载模式的主要程序,数据程序通过GPIOB口下载,其中这种/模式支持8位或16位数据流。当传输的数据流为8位时,定义先传输高位,然后再传输/低位,该程序将返回一个入口指针地址,指向InitBoot程序,当程序执行完毕后,将调用/ExitBoot程序。/-Uint 32 Parallel_Boot()Uint32 EntryAddr;Uint16 DataSize;Parallel_GPIOSelect();
6、DataSize = Parallel_CheckKeyVal();If (DataSize = ERROR) return Flash_ENTRY_POINT;Parallel_ReservedFn(DataSize);Return EntryAddr;/-/ void Parallel_GPIOSelect()EALLOW;/GPIOB口设置为普通I/O口,0代表普通I/O口,1代表特殊功能口GPIOMuxRegs.GPBMUX.all = 0x0000;/设置GPIOD5和GPIOD6口为普通I/O口,在程序中作为DSP和主机之间的握手信号线GPIOMuxRegs.GPDMUX.all
7、& = 0xFF9F;/GPIOB口都设置为输入口,D5作为主机控制口,设置成输入口;D6作为DSP返回的应/答信号,设置成输出口。其中寄存器的值为0代表输入,1代表输出GPIOMuxRegs.GPDDIR.bit.GPIOD6 = 1;GPIOMuxRegs.GPDDIR.bit.GPIOD5 = 0;GPIOMuxRegs.GPBDIR.all = 0x0000;EDIS;/void Parallel_CheckKeyVal(void)/-/判断接收到的数据为8位还是16位格式,如果都不是那么将返回错误。需要说明的是如果主机没有做出反应,那么程序将一直在此中断,这里没有超时机制/-Inli
8、ne Uint16 Parallel_CheckKeyVal()Uint16 wordData;/从平行GPIO口上获取一个字节数据,然后与16位数据关键值相比,如果不是16位数据,然后再与8位数据关键相比WordData = Parallel_GetWordData(SIXTEEN_BIT);If(wordData = SIXTEEN_BIT);/如果不是8位数据结构模式,那么检查16位数据结构模式/调用获取数据程序(16位数据结构),此时用户只需获取关键值的高有效位,可以忽略高8位,和前面字节组成关键值wordData = wordData & 0x00FF ;wordData | = P
9、arallel_GetWordData(SIXTEEN_BIT)8;if(wordData = EIGHT_BIT_HEADER) return EIGHT_BIT;/如果获取的关键值不是16位数据也不是8位数据的关键值,那么将返回错误else return ERROR;/-/void Parallel_ReservedFn(void)/-/这个函数用于读取8个保留字节,读取这8个字节数据后,系统自动丢弃,这8个字节的空间主要用于未来的开发/-inline void Parallel_ReservedFn(Uint16 DataSize);Uint16 i;/读取并丢弃8个字节for(i =1
10、;i=8;i+)Parallel_GetWordData(DataSize);Return;/-/void Parallel_CopyData(void)/-/该函数是并行GPIO口程序复制函数,程序将数据块从主机复制到指定的RAM空间,且在复制过程中没有错误检测。当所有的数据都下载完毕后,主机将发送一个数据大小为0x0000的信号,指示数据发送完毕/-void Parallel_CopyData(Uint16 DataSize)struct HEADERUint16 BlockSize;Uint32 DestAddr;BlockHeader;Uint16 worData;Uint16 I;/
11、获取第一个数据块的大小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(Da
12、taSize);*(Uint16 *)BlockHeader.DestAddr+= wordData;/获取下一个数据块的大小BlockHeader.BlockSize =Parallel_GetWordData(DataSize);return;/-/Uint16 Parallel_GetWordData(Uint16 DataSize)/-/这个函数主要是从GPIO口中读取一个16位字,函数中的参数为DataSize。如果DataSize为16位,那么输入的数据流也应该为16位数据。函数的功能为获取一个单一字节的数据,然后将数据返回给主机/如果DataSize为8位,那么输入数据流也应该为
13、8位格式,且GPIO的高8位将被忽略,在这种情况下,首先从GPIO口获取低有效位,获取的两个字节组成一个单一的16位数据,然后传输给主机。注意,在这种情况下,主机的输出流的顺序为先低有效位然后再高有效位/-Uint16 Parallel_GetWordData(Uint16 DataSize)Uint16 wordData;/获取一个字节数据,如果是在16位数据结构情况下,那么处理已完成Parallel_WaitHostRdy();wordData=DATA;Parallel_HostHandshake();/如果获取的是8位数据结构,那么首先获取的是低有效位,然后是高有效位if(DataSi
14、ze = EIGHT_BIT)wordData = wordData & 0x00FF;Parallel_WaitHostRdy();wordData |=(DATA8);Parallel_HostHandshake();return wordData;/-Uint32 Parallel_GetLongData(Uint16 DataSize)/-/程序从GPIO引脚上获取两个字节数据,然后将它们组成一个单一的32位数据,前提是主机发送数据的格式为MSB:LSB/-Uint32 Parallel_GetLongData(Uint16 DataSize)Uint32 LongData;longD
15、ata =(Uint32)Parallel_GetWordData(DataSize)16;longData | = (Uint32)Parallel_GetWordData(DataSize);return longData;/-/void Parallel_WaitHostRdy(void)/-程序主要是通知主机DSP已经准备接收数据了,然后DSP等待主机发送信号(数据已经发送到PGIO引脚上)/-void Parallel_WaitHostRdy()DSP_RDY;While(HOST_DATA_NOT_RDY)/-/void Parallel_HostHandshake(void)/-
16、/程序主要是通知主机DSP已经接收了数据,DSP等待主机的应答信号/-void Parallel_HostHandshake()DSP_ACK;while(WAIT_HOST_ACK)11.4.5 SPI_Boot.c(SPI口下载模式)/-/文件:SPI_Boot.c/F2812 SPI下载模式程序/功能函数:/Uint32 SPI_Boot(void)/inline void SPIA_GPIOSelect(void)/inline void SPIA_SysClockEnable(void)/inline void SPIA_Init(void)/inline void SPIA_Tra
17、nsmit(u16 cmdData)/inline Uint16 SPIA_CheckKeyVal(void)/inline void SPAI_ReservedFn(void);/Uint32 SPIA_GetLongData(void)/Uint32 SPIA_GetWordData(void)/void SPIA_CopyData(void)/-#include “F2812_Boot.h”#pragma DATA_SECTION(SPIARegs,”.SPIARegs”);volatile struct SPI_REGS SPIARegs;/私有功能函数inline void SPIA
18、_GPIOSelect(void);inline void SPIA_Init(void);inline Uint16 SPIA_Transmit(Uint16 cmdData);inline Uint16 SPIA_CheckKeyVal(void);inline void SPIA_ReservedFn(void);inline void SPIA_SysClockEnable(void);Uint32 SPIA_GetLongData(void);Uint16 SPIA_GetWordData(void);void SPIA_CopyData(void);/-Uint32 SPI_Boo
19、t(void)/-/this module is the main SPI boot routine./It will load code via the SPI-A port./It will return a entry point address back to the Exitboot routine./这个程序是SPI下载模式的主要程序,该程序将返回一个入口指针地址到ExitBoot程序处/-Uint32 SPI_Boot()Uint32 EntryAddr;Uint16 ErrorFlag;SPIA_SysClockEnable();SPIA_GPIOSelect();SPIA_I
20、nit();/1.使能PROM的片选信号GPIODataRegs.GPFCLEAR.bit.GPIOF3 = 1;/2.使能PROM,并发送读取PROM的命令SPIA_Transmit(0x0300);/3.设置PROM的起始地址(16b)SPIA_GetWordData();/4.检查数据流格式是否为8b,否则从Flash处启动ErrorFlag = SPIA_CheckKeyVal();if (ErrorFlag !=0)return Flash_ENTRY_POINT;/4a.检查改变的时钟速度和保留字SPIA_ReservedFn();/5.获取下载后的入口指针地址EntryAddr
21、= SPIA_GetLongData();/6.接收并将代码段复制到目的空间内SPIA_CopyData();/7.禁止使能PROMGPIODataRegs.GPFSET.bit.GPIOF3=1;Return EntryAddr;/-/void SPIA_GPIOSelect(void)/-/使能SPI引脚作为特殊功能口/-inline void SPIA_GPIOSelect()EALLOW/使能SPISIMO/SPISOMI/SPICLK口GPIOMuxRegs.GPFMUX.all = 0x0007;/SPISTE作为输出引脚GPIOMuxRegs.GPFDIR.all = 0x000
22、8;/设置PROM的片选使能为高GPIODataRegs.GPFDAT.all = 0x0008;EDIS/-/void SPIA_Init(void)/-/初始化SPI口,用于与主机通信inline void SPIA_Init()/使能FIFO复位SPIARegs.SPIFFTX.all = 0x8000;/8位数据结构SPIARegs.SPICCR.all = 0x0007;/采用内部时钟、主模式、会话模式SPIARegs.SPICTL.all = 0x000E;/采用较慢的波特率SPIARegs.SPIBRR.all = 0x007f;/释放SPIA口SPIARegs.SPICCR.a
23、ll = 0x0087;return;/-/void SPIA_Transmit(void)/-/通过SPI口发送一个字节/-inline Uint16 SPIA_Transmit(Uint16 cmdData)Uint16 recvData;/发送数据recvDataSPIARegs.SPITXBUF =cmdData;while (SPIARegs.SPISTS.bit.INT_FLAG)! =1);/清楚中断标志位,接收返回的数据recvData =SPIARegs.SPIRXBUF;return recvData;/-Uint16 SPIA_CheckKeyVal(void)/-/获取
24、关键值,如果下载正确将会获取到的关键值为0x08 0xAA。如果不是,那么说明下载不正常;如果这样,将返回一个错误到主程序/-inline Uint16 SPIA_CheckKeyVal()Uint16 wordData;wordData = SPIA_GetWordData();if(wordData != 0x08AA) return ERROR;/没有错误return NO_ERROR;/-/void SPIA_ReservedFn(void)/-/函数的功能为读取头文件中8个保留的字节,第一个字节是LOSPCP和SPIBBR寄存器的参数0xMSB:LSB。其中LSB是一个3位数据,对应
25、LOSPCP的值;MSB是一个6位数据,用于SPIBRR寄存器的升级。如果所有的位都为默认值,那么系统的速度将不会改变,默认值为LOSCPCP=0x02,SPIBRR=0x7F,读取默认值并丢弃,然后返回到主程序处/-inline void SPIA_ReservedFn()Uint16 speedData;Uint16 I;speedData = (Uint16)0x0000;/更新LOSPCP寄存器的值,如果字节中的数据不是保留数据0x02speedData =SPIA_Transmit(Uint16)0x0000;if (speedData!=(Uint16)0x0002)EALLOW;
26、SysCtrlRegs.LOSPCP.all =speedData;EDIS;/Dummy cyclesasm(“RPT#0x0F|NOP”);/更新SPIBRR寄存器的值,如果字节中的数据不是保留数据0x7FspeedData = SPIA_Transmit(Uint16)0x0000);if(speedData != (Uint16)0x007F)SPIARegs.SPIBRR =speedData;/Dummy cyclesasm(“RPT#0x0F|NOP”);/读取丢弃7B数据for(i=1;i=7;i+)SPIA_GetWordData();Return;/-/Uint32 SPI
27、A_GetLongData(void)/-/程序为从SPIA口获取2个字数据,并将它们组成一个单一的32位数据,前提为主机发送数据的格式为MSW:LSW/-Uint32 SPIA_GetLongData()Uint32 longData=(Uint32)0x;/获取高16位数据longData = (Uint32)SPIA_GetWordData()16;/获取低16位数据longData |=(Uint32)SPIA)GetWordData();return longData;/-Uint16 SPIA_GetWordData(void)/-/程序主要是从SPIA口获取2B的数据,并将数据组成一个16位数据,提前是主机发送的数据的格式为MSB:LSB/-Uint16 SPIA_GetWordData()Uint16 wordData;Uint16byteData;wordData = 0x0000;/获取低有效位,检测并返回给主机wordData = SPI