TMS320F2812原理及其C语言程序开发(共14页).doc

上传人:飞****2 文档编号:14486380 上传时间:2022-05-04 格式:DOC 页数:14 大小:86KB
返回 下载 相关 举报
TMS320F2812原理及其C语言程序开发(共14页).doc_第1页
第1页 / 共14页
TMS320F2812原理及其C语言程序开发(共14页).doc_第2页
第2页 / 共14页
点击查看更多>>
资源描述

《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

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁