TMS320F2812原理及其C语言程序开发.docx
- 文档编号:10110386
- 上传时间:2023-05-23
- 格式:DOCX
- 页数:25
- 大小:24.21KB
TMS320F2812原理及其C语言程序开发.docx
《TMS320F2812原理及其C语言程序开发.docx》由会员分享,可在线阅读,更多相关《TMS320F2812原理及其C语言程序开发.docx(25页珍藏版)》请在冰点文库上搜索。
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_ACK GPIODataRegs.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;
}
//------------------------------------------------------------------------------------------------------------------
//Uint16Parallel_GetWordData(Uint16DataSize)
//------------------------------------------------------------------------------------------------------------------
//这个函数主要是从GPIO口中读取一个16位字,函数中的参数为DataSize。
如果DataSize为16位,那么输入的数据流也应该为16位数据。
函数的功能为获取一个单一字节的数据,然后将数据返回给主机
//如果DataSize为8位,那么输入数据流也应该为8位格式,且GPIO的高8位将被忽略,在这种情况下,首先从GPIO口获取低有效位,获取的两个字节组成一个单一的16位数据,然后传输给主机。
注意,在这种情况下,主机的输出流的顺序为先低有效位然后再高有效位
//------------------------------------------------------------------------------------------------------------------
Uint16Parallel_GetWordData(Uint16DataSize)
{
Uint16wordData;
//获取一个字节数据,如果是在16位数据结构情况下,那么处理已完成
Parallel_WaitHostRdy();
wordData=DATA;
Parallel_HostHandshake();
//如果获取的是8位数据结构,那么首先获取的是低有效位,然后是高有效位
if(DataSize==EIGHT_BIT){
wordData=wordData&0x00FF;
Parallel_WaitHostRdy();
wordData|=(DATA<<8);
Parallel_HostHandshake();
}
returnwordData;
}
//------------------------------------------------------------------------------------------------------------------
Uint32Parallel_GetLongData(Uint16DataSize)
//------------------------------------------------------------------------------------------------------------------
//程序从GPIO引脚上获取两个字节数据,然后将它们组成一个单一的32位数据,前提是主机发送数据的格式为MSB:
LSB
//------------------------------------------------------------------------------------------------------------------
Uint32Parallel_GetLongData(Uint16DataSize)
{
Uint32LongData;
longData=((Uint32)Parallel_GetWordData(DataSize))<<16;
longData|=(Uint32)Parallel_GetWordData(DataSize);
returnlongData;
}
//------------------------------------------------------------------------------------------------------------------
//voidParallel_WaitHostRdy(void)
//------------------------------------------------------------------------------------------------------------------
程序主要是通知主机DSP已经准备接收数据了,然后DSP等待主机发送信号(数据已经发送到PGIO引脚上)
//------------------------------------------------------------------------------------------------------------------
voidParallel_WaitHostRdy()
{
DSP_RDY;
While(HOST_DATA_NOT_RDY){}
}
//------------------------------------------------------------------------------------------------------------------
//voidParallel_HostHandshake(void)
//------------------------------------------------------------------------------------------------------------------
//程序主要是通知主机DSP已经接收了数据,DSP等待主机的应答信号
//------------------------------------------------------------------------------------------------------------------
voidParallel_HostHandshake()
{
DSP_ACK;
while(WAIT_HOST_ACK){}
}
11.4.5SPI_Boot.c(SPI口下载模式)
//------------------------------------------------------------------------------------------------------------------
//文件:
SPI_Boot.c
//
//F2812SPI下载模式程序
//
//功能函数:
//Uint32SPI_Boot(void)
//inlinevoidSPIA_GPIOSelect(void)
//inlinevoidSPIA_SysClockEnable(void)
//inlinevoidSPIA_Init(void)
//inlinevoidSPIA_Transmit(u16cmdData)
//inlineUint16SPIA_CheckKeyVal(void)
//inlinevoidSPAI_ReservedFn(void);
//Uint32SPIA_GetLongData(void)
//Uint32SPIA_GetWordData(void)
//voidSPIA_CopyData(void)
//------------------------------------------------------------------------------------------------------------------
#include“F2812_Boot.h”
#pragmaDATA_SECTION(SPIARegs,”.SPIARegs”);
volatilestructSPI_REGSSPIARegs;
//私有功能函数
inlinevoidSPIA_GPIOSelect(void);
inlinevoidSPIA_Init(void);
inlineUint16SPIA_Transmit(Uint16cmdData);
inlineUint16SPIA_CheckKeyVal(void);
inlinevoidSPIA_ReservedFn(void);
inlinevoidSPIA_SysClockEnable(void);
Uint32SPIA_GetLongData(void);
Uint16SPIA_GetWordData(void);
voidSPIA_CopyData(void);
//------------------------------------------------------------------------------------------------------------------
Uint32SPI_Boot(void)
//------------------------------------------------------------------------------------------------------------------
//thismoduleisthemainSPIbootroutine.
//ItwillloadcodeviatheSPI-Aport.
//
//ItwillreturnaentrypointaddressbacktotheExitbootroutine.
//这个程序是SPI下载模式的主要程序,该程序将返回一个入口指针地址到ExitBoot程序处
//------------------------------------------------------------------------------------------------------------------
Uint32SPI_Boot()
{
Uint32EntryAddr;
Uint16ErrorFlag;
SPIA_SysClockEnable();
SPIA_GPIOSelect();
SPIA_Init();
//1.使能
PROM的片选信号
GPIODataRegs.GPFCLEAR.bit.GPIOF3=1;
//2.使能
PROM,并发送读取
PROM的命令
SPIA_Transmit(0x0300);
//3.设置
PROM的起始地址(16b)
SPIA_GetWordData();
//4.检查数据流格
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- TMS320F2812 原理 及其 语言 程序 开发