?? example_281xsci_demo.c
字號:
//----------------------------------------------------
//----------------------------------------------------
// 名稱: SCI串行口數據收發(fā),下位機測試程序
// 文件:Example_281xsci_demo.c
// 規(guī)約:此程序用于進行DSP串口數據收發(fā)的演示,需要事先
// 將DSP的SCI-A串行口與計算機的串行口相連;
// 程序在RAM中運行,并使用CPU定時器0與串行口中斷.
// 說明:
// 此程序向上位機定時發(fā)送數據,包括XF控制的閃燈狀
// 態(tài)與當前閃燈周期的大小;在運行時,程序另可接收
// 上位機發(fā)送的指令或數據,用以改變閃燈狀態(tài)或周期.
//
// 開關燈指令選擇:
// 內容 | FF | 00
// 功能 | 開燈 | 關燈
//
// 發(fā)送數據類型選擇:
// 內容 | FF | 00
// 功能 | 數據 | 指令
//
// 以下"發(fā)送"與"接收"均是上位機的操作
// 即"上位機發(fā)送"與"上位機接收"
// 數據發(fā)送格式:
// AA | 00/FF | (00/FF)/XX |
// 幀起始位 |指令/數據選擇位 |(開關燈指令)/定時周期低字節(jié)|
// XX | BB
// 定時周期高字節(jié) |幀結束位
//
// 數據接收格式:
// CC | XX |
// 幀起始位 |(開關燈指令)/定時周期低字節(jié)|
// XX | 00/01 | DD
// 定時周期高字節(jié) | LED燈狀態(tài)位 |幀結束位
//
// 可用串口調式助手或自編的上位機程序調試
//
// 作者:馬榮華
// 日期:2008-10-04
// 修訂:首次發(fā)布
//-----------------------------------------------------
//-----------------------------------------------------
//頭文件
#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]; //串行口發(fā)送數據存儲數組
Uint16 intLedStatus; //LED當前的亮滅狀態(tài)
Uint16 intCanRunSignal; //允許運行標志
Uint16 intLedEnable; //使能LED變量
void main(void)
{
//局部變量定義
Uint16 i;
//1.初始化系統(tǒng)控制寄存器/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.程序主循環(huán)
for(;;)
{
if(intCanRunSignal == 1) //檢查CPU定時中斷是否發(fā)生
{
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函數結束
//--------------------------------------------------
//其他功能函數
//串行數據發(fā)送函數
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;
}
//為發(fā)送單元組織數據
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停止位/無校驗/非自測/空閑線協(xié)議/8位字符長度
SciaRegs.SCICCR.all = 0x0007; //0000 0000 0000 0111
//復位串口/禁用喚醒與休眠/使能發(fā)送與接收
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)
{
//復位發(fā)送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
//重新使能發(fā)送與接收FIFO
SciaRegs.SCIFFTX.bit.TXFIFORESET = 1;
SciaRegs.SCIFFRX.bit.RXFIFORESET = 1;
}
//串行口接收中斷服務程序
interrupt void SciaRxIsr(void)
{
Uint16 i;
//中斷一次,讀5遍接收緩存,將RXFIFO中的5個數循環(huán)讀入
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 + -