打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
TMS320F2812串行口<--->PC机通信例程
userphoto

2015.04.03

关注

//----------------------------------------------------
//----------------------------------------------------
// 名称: 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灯状态位 |帧结束位
//
// 可用串口调式助手或自编的上位机程序调试
// 
// 作者:mrhfzing
// 日期:2008-10-04
// 修订:First Released
//-----------------------------------------------------
//-----------------------------------------------------

//头文件
#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; //提交串行口中断
}

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

//这次改用中文注释,免得以后连自己都看不明白。。。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
DSP2812 SCI FIFO模式调试心得
281x-SCI和PC间的通讯
SCI 的FIFO
UART串行通信详解
深入理解SerDes之一
带硬件地址识别的UART IP 的设计和实现
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服