⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 example_281xsci_demo.c

📁 使用TMS320F2812的SCI串行口与计算机进行通讯的程序。使用TI提供的C/C++头文件与公用文件
💻 C
字号:
//----------------------------------------------------
//----------------------------------------------------
// 名称: SCI串行口数据收发,下位机测试程序
// 文件:Example_281xsci_demo.c
// 规约:此程序用于进行DSP串口数据收发的演示,需要事先
//		 将DSP的SCI-A串行口与计算机的串行口相连;
//		 程序在RAM中运行,并使用CPU定时器0与串行口中断.
// 说明:
//		此程序向上位机定时发送数据,包括XF控制的闪灯状
//		态与当前闪灯周期的大小;在运行时,程序另可接收
//		上位机发送的指令或数据,用以改变闪灯状态或周期.
//
//		开关灯指令选择:
//		内容 |	FF	 |	00
//		功能 |	开灯 |	关灯
//
//		发送数据类型选择:
//		内容 |	FF	 |	00
//		功能 |	数据 |	指令
//
//		以下"发送"与"接收"均是上位机的操作
//		即"上位机发送"与"上位机接收"
//		数据发送格式:
//		 AA 	  |      00/FF 	|	      (00/FF)/XX 	     |
//		 帧起始位 |指令/数据选择位 |(开关灯指令)/定时周期低字节|
//		 XX	            |	  BB
//		定时周期高字节  |帧结束位
//
//		数据接收格式:
//		 CC 	  |	         XX            |
//		 帧起始位 |(开关灯指令)/定时周期低字节|
//		 XX	            |      00/01 	  |  DD
//		定时周期高字节  |   LED灯状态位  |帧结束位
//
//		可用串口调式助手或自编的上位机程序调试
//		
// 作者:马荣华
// 日期:2008-10-04
// 修订:首次发布
//-----------------------------------------------------
//-----------------------------------------------------

//头文件
#include "DSP281x_Device.h"
#include "DSP281x_Examples.h"

//函数原型声明
interrupt void CpuTimer0Isr(void);
interrupt void SciaRxIsr(void);
void SciaFifoInit(void);
void SciaInit(void);
void SciaXmit(int a);

//全局变量定义
unsigned long lngTimerPrd;		//CPU定时器定时周期
char chrDataReceived[5];//串行口接收数据存储数组
char chrDataSent[5];	//串行口发送数据存储数组
Uint16 intLedStatus;	//LED当前的亮灭状态
Uint16 intCanRunSignal;	//允许运行标志
Uint16 intLedEnable;	//使能LED变量

void main(void)
{
	//局部变量定义
	Uint16 i;

	//1.初始化系统控制寄存器/PLL/看门狗/时钟
	InitSysCtrl();

	//2.配置GPIO的功能
	EALLOW;
	//设置D3(LED)的控制I/O
	GpioMuxRegs.GPFMUX.bit.XF_GPIOF14 = 0; //将GPIOF14配置为I/O口
	GpioMuxRegs.GPFDIR.bit.GPIOF14 = 1;	   //将GPIOF14配置为输出端口
	//设置SCI串行通信用的GPIO管脚为外设功能
	GpioMuxRegs.GPFMUX.bit.SCITXDA_GPIOF4 = 1;
	GpioMuxRegs.GPFMUX.bit.SCIRXDA_GPIOF5 = 1;
	EDIS;

	//3.初始化PIE中断
	DINT;	//禁用中断
	IER = 0x0000;	//禁用CPU中断
	IFR = 0x0000;	//清CPU中断标志位
	//初始化PIE控制寄存器
	InitPieCtrl();
	//初化PIE向量表
	InitPieVectTable();

	//4.初始化中断服务程序
	EALLOW;
	PieVectTable.TINT0 = &CpuTimer0Isr;
	PieVectTable.RXAINT = &SciaRxIsr;
	EDIS;
	InitCpuTimers();
	ConfigCpuTimer(&CpuTimer0,150,1000000);
	StartCpuTimer0();
	//5.使能上述所有中断
	PieCtrlRegs.PIECTRL.bit.ENPIE = 1;	//使能PIE
	PieCtrlRegs.PIEIER1.bit.INTx7 = 1;	//使能CPU定时器中断
	PieCtrlRegs.PIEIER9.bit.INTx1 = 1;	//使能串行口接收中断
	IER = M_INT1 | M_INT9;		//使能CPU中断:组1与组9
	EINT;
	
	//6.初始化串行口设置
	SciaInit();
	SciaFifoInit();

	//7.程序主循环
	for(;;)
	{
		if(intCanRunSignal == 1)	//检查CPU定时中断是否发生
		{
			for(i = 0; i < 5; i++)
			{
				SciaXmit(chrDataSent[i]);
			}
			intCanRunSignal = 0;	//复位允许运行标志
		if(SciaRegs.SCIFFRX.bit.RXFIFST !=0 )
		{
			//以下代码用于复位FIFO指针,即"清空FIFO"
			SciaRegs.SCIFFRX.bit.RXFIFORESET = 0;	//复位FIFO指针
			NOP;
			SciaRegs.SCIFFRX.bit.RXFIFORESET = 1;	//重新使能接收FIFO
			NOP;
		}	
		}
	}
}
//--------------------------------------------------
//main函数结束
//--------------------------------------------------

//其他功能函数
//串行数据发送函数
void SciaXmit(int a)
{
	SciaRegs.SCITXBUF = a;
}

//CPU定时器中断程序
interrupt void CpuTimer0Isr(void)
{
	CpuTimer0.InterruptCount++;
	intCanRunSignal = 1;
	if(intLedEnable == 0x00FF)
	{
		if(CpuTimer0.InterruptCount % 2 ==1)
		{
			GpioDataRegs.GPFSET.bit.GPIOF14 = 1;
			intLedStatus = 1;
		}
		else
		{
			GpioDataRegs.GPFCLEAR.bit.GPIOF14 = 1;
			intLedStatus = 0;
		}
	}
	else
	{
		GpioDataRegs.GPFCLEAR.bit.GPIOF14 = 1;
		intLedStatus = 0;
	}
	//为发送单元组织数据
	chrDataSent[0] = 0xCC;
	chrDataSent[1] = lngTimerPrd & 0x00FF;
	chrDataSent[2] = lngTimerPrd >> 8;
	chrDataSent[3] = intLedStatus;
	chrDataSent[4] = 0xDD;
	//提交CPU定时器中断
	PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}

//串行口初始化程序
void SciaInit(void)
{
	//1停止位/无校验/非自测/空闲线协议/8位字符长度
	SciaRegs.SCICCR.all = 0x0007;	//0000 0000 0000 0111
	//复位串口/禁用唤醒与休眠/使能发送与接收	
	SciaRegs.SCICTL1.all = 0x0003;	//0000 0000 0000 0011
	//使能RXRDY中断
	SciaRegs.SCICTL2.bit.RXBKINTENA = 1;
	//设置波特率9600
	//2400   | 4800   | 9600   | 19200   | 38400 
	//0x07A0 | 0x03D0 | 0x01E7 | 0x00F3  | 0x0079
	SciaRegs.SCIHBAUD = 0x01;
	SciaRegs.SCILBAUD = 0xE7;
	//重新使能串行口
	SciaRegs.SCICTL1.bit.SWRESET = 1;
}

//串行口FIFO初始化程序
void SciaFifoInit(void)
{
	//复位发送FIFO
	SciaRegs.SCIFFTX.all = 0xC040;	//1100 0000 0100 0000
	//复位接收FIFO/启用基于RXFFIVL匹配的RXFIFO中断/中断级别为5
	SciaRegs.SCIFFRX.all = 0x0025;	//0000 0000 0010 0101
	//设置FIFO控制寄存器
	SciaRegs.SCIFFCT.all = 0x0000;	//0000 0000 0000 0000
	//重新使能发送与接收FIFO
	SciaRegs.SCIFFTX.bit.TXFIFORESET = 1;
	SciaRegs.SCIFFRX.bit.RXFIFORESET = 1;
}	

//串行口接收中断服务程序
interrupt void SciaRxIsr(void)
{
	Uint16 i;
	//中断一次,读5遍接收缓存,将RXFIFO中的5个数循环读入
	for(i = 0;i < 5; i++)
	{
	   chrDataReceived[i]=SciaRegs.SCIRXBUF.all;
	}
	//如果检测到数据帧,则进行数据提取
	if(chrDataReceived[0] == 0xAA && chrDataReceived[4] == 0xBB)
	{
		if(chrDataReceived[1] == 0x00)	//收到的为指令
			{
				intLedEnable = chrDataReceived[2];//接收上位机指令
			}
		if(chrDataReceived[1] == 0xFF)	//收到的为数据
			{	//拼装定时周期数据
				lngTimerPrd = 0;	//清零
				lngTimerPrd = chrDataReceived[2] + (chrDataReceived[3]<<8);
				//更新定时周期
				//InitCpuTimers();
				ConfigCpuTimer(&CpuTimer0,150,(lngTimerPrd*100));
				StartCpuTimer0();
			}
	}			
	SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1;   //清除溢出标志位
	SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;   //清除中断标志位
	PieCtrlRegs.PIEACK.all|=0x100;       //提交串行口中断
}

//-----------------------------------------------------------------------------
//文件结束
//-----------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -