📄 dtk_bpd_spi.c
字号:
/*SEED-DTK BPD */
/*SEED耿升辉*/
/*2004.12*/
#include "DSP28_Device.h"
#include "comm.h"
#include "ext_inf.h"
/*帧长度的设定*/
typedef struct _UartForDec5416{
unsigned int Length;
unsigned int Type;
unsigned int Mutul;
unsigned int Data[DataLongth];
unsigned int Check;
}UartForDec5416, *PuartForDec5416;
PuartForDec5416 precieve =0;
PuartForDec5416 psend=0;
unsigned int uart[0x104] ={0};
unsigned int uarts[0x104] = {0};
unsigned int uartsdata = 0;
unsigned int uarta_recbuff[1040];///*串口A接收缓冲区*/
unsigned int uartb_recbuff[1040];/*串口B接收缓冲区*/
int uart_s=0;
unsigned int sys_statbuff[32];
int uart_recive(void);
int uart_send(void);
unsigned int i,j;
void sys_reset(void);
unsigned int CommandSave=0;
void delay(int period);
unsigned int SpiTxReady(void);
unsigned int SpiRxReady(void);
unsigned int spidata;
void main(void)
{
/*初始化系统*/
InitSysCtrl();
/*关中断*/
DINT;
IER = 0x0000;
IFR = 0x0000;
/*初始化PIE中断*/
InitPieCtrl();
/*初始化PIE中断矢量表*/
InitPieVectTable();
/*初始化SCIA寄存器*/
InitSci();
/*初始化SPI寄存器*/
InitSpi();
spidata=0x5a;
for(i= 0; i<0x104;i++)
{
uart[i] = 0x5555;
uarts[i] = 0x5555;
}
for(i=0;i<32;i++)
{
sys_statbuff[i]=0;//系统标志buff清0
}
CommandSave=0;
#if SCIA_INT
/*设置中断服务程序入口地址*/
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.TXAINT = &SCITXINTA_ISR;
PieVectTable.RXAINT = &SCIRXINTA_ISR;
EDIS; // This is needed to disable write to EALLOW protected registers
/*开中断*/
IER |= M_INT9;
#endif
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
LED1_ON;
*LED3=0;
/*实验主控程序*/
psend = (PuartForDec5416)(&uarts[0]);
precieve = (PuartForDec5416)(&uart[0]);
/*通知主机,系统准备好*/
psend->Length = FRAMLONGTH;
psend->Type = UARTCOMMAND;
psend->Data[0] = INITOVER;
psend->Mutul = UARTCONT;
uart_send();
for(;;)
{
if(CommandSave==MCBSPOPEN)
{
for(;;)
{
if(Spi_TxReady() == 1)
{
SpiaRegs.SPITXBUF = spidata;
break;
}
}
if(Spi_RxReady() == 1)
{
spidata = SpiaRegs.SPIRXBUF;
if(spidata==0xffff)
spidata=0x5a;
if(spidata==0)
spidata=0x5a;
}
delay(100);
}
uart_s =uart_recive();
/* 返回值 0:接受完成 */
/* 1:数据未准备好 */
/* 3: 较验出错 */
if(uart_s==1)
{
continue;
}
/*数据较验出错*/
if(uart_s == 3)
{
for(i= 0; i<0x104;i++)
{
uart[i] = 0x5555;
}
/*通知主机程序通讯出错,准备重发*/
psend->Length = FRAMLONGTH;
psend->Type = UARTCOMMAND;
psend->Data[0] = RECIEVEERROR;
psend->Mutul = UARTCONT;
uart_send();
continue;
}
/*接收完成*/
if(uart_s ==0)
{
/*不是命令帧*/
if(precieve->Type != UARTCOMMAND)
{
/*无效命令*/
for(i= 0; i<0x104;i++)
{
uart[i] = 0x5555;
}
psend->Length = FRAMLONGTH;
psend->Type = UARTCOMMAND;
psend->Data[0] = COMMANDNODO;
psend->Mutul = UARTCONT;
uart_send();
precieve->Type = UARTCOMMAND;
continue;
}
}
/*接收从主机的数据*/
precieve = (PuartForDec5416)(&uart[0]);
switch(precieve->Data[0])
{
case MCBSPOPEN:
precieve->Data[0] = 0;
CommandSave=MCBSPOPEN;
break;
case MCBSPCLOSE:
precieve->Data[0] = 0;
CommandSave=0;
break;
/*系统复位*/
case SYSRESET://
precieve->Data[0] = 0;
CommandSave=0;
sys_reset();
break;
default:
break;
}
}
}
void delay(int period)
{
int i, j;
for(i=0; i<period; i++)
{
for(j=0; j<0x40; j++);
}
}
int uart_send(void)
{
unsigned int i;
unsigned int send_datah;
unsigned int timeout = 0x4000;
unsigned int check = 0;
for(i = 0; i<FRAMLONGTH-1; i++)
{
timeout = 0x4000;
for(;;)
{
timeout--;
/*上一次发送是否完成*/
if(SciaTx_Ready() == 1)
{
/*发送数据的高8位*/
send_datah = uarts[i];
check = check ^ (send_datah);
SciaRegs.SCITXBUF = send_datah>>8;
break;
}
/*检查是否超时*/
if(!(timeout))
{
return 0xFFFF;
}
}
timeout = 0x4000;
for(;;)
{
timeout--;
/*上一次发送是否完成*/
if(SciaTx_Ready() == 1)
{
/*发送数据的低8位*/
SciaRegs.SCITXBUF = uarts[i];
break;
}
/*检查是否超时*/
if(!(timeout))
{
return 0xFFFF;
}
}
}
/*发送校验结果*/
timeout = 0x4000;
for(;;)
{
timeout--;
/*上一次发送是否完成*/
if(SciaTx_Ready() == 1)
{
/*发送数据的高8位*/
send_datah = check;
SciaRegs.SCITXBUF = send_datah>>8;
break;
}
/*检查是否超时*/
if(!(timeout))
{
return 0xFFFF;
}
}
timeout = 0x4000;
for(;;)
{
timeout--;
/*上一次发送是否完成*/
if(SciaTx_Ready() == 1)
{
/*发送数据的低8位*/
SciaRegs.SCITXBUF = check;
break;
}
/*检查是否超时*/
if(!(timeout))
{
return 0xFFFF;
}
}
/*发送冗余*/
timeout = 0x4000;
for(;;)
{
timeout--;
/*上一次发送是否完成*/
if(SciaTx_Ready() == 1)
{
/*发送数据的高8位*/
send_datah = 0xabcd;
SciaRegs.SCITXBUF = send_datah>>8;
break;
}
/*检查是否超时*/
if(!(timeout))
{
return 0xFFFF;
}
}
timeout = 0x4000;
for(;;)
{
timeout--;
/*上一次发送是否完成*/
if(SciaTx_Ready() == 1)
{
/*发送数据的低8位*/
SciaRegs.SCITXBUF = 0xabcd;
break;
}
/*检查是否超时*/
if(!(timeout))
{
return 0xFFFF;
}
}
/*reset sci */
SciaRegs.SCICTL1.all = 0x03;
SciaRegs.SCICTL1.all = 0x23;
uarts[FRAMLONGTH-1]=check;
return 0;
}
/* 返回值 0:接受完成 */
/* 1:数据未准备好 */
/* 3: 较验出错 */
int uart_recive(void)
{
unsigned int check;
/*数据未准备好*/
if(sys_statbuff[RECANEW] != 1)
{
return 1;
}
sys_statbuff[RECANEW]=0;//新帧标志位清零
check=0;
for(i=0;i<FRAMLONGTH-1;i++)
{
check=check ^ uart[i];
}
if(check!=uart[FRAMLONGTH-1])//校验不正确
{
return 3;
}
return 0;
}
void sys_reset(void)
{
EALLOW;
SysCtrlRegs.WDCR= 0;
EDIS;
for(;;){};
}
//===========================================================================
// No more.
//===========================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -