?? dtk_bpd_ad.c
字號:
/*SEED-DTK BPD */
/*SEED耿升輝*/
/*2004.12*/
#include "DSP28_Device.h"
#include "ext_inf.h"
#include "comm.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 CommandSave=0;
int uart_s=0;
unsigned int sys_statbuff[32];
int uart_recive(void);
int uart_send(void);
unsigned int i,j;
unsigned int k= 0;
void sys_reset(void);
unsigned int Ad_data[1500]={0};
volatile unsigned int adset[4] ={128,0xd,0,0};
PAdConfig padset = 0;
volatile unsigned int datasendlong = 0;
volatile unsigned int sendcount = 0;
unsigned int convcount = 0;
unsigned int adconvstart = 0;
volatile unsigned int adconvover =0;
volatile unsigned int convtimes=60;
volatile unsigned int convtimesback=60;
volatile int convfirstN=1000;
// Prototype statements for functions found within this file.
interrupt void ISRTimer2(void);
interrupt void ad(void);
void main(void)
{
/*初始化系統*/
InitSysCtrl();
/*關中斷*/
DINT;
IER = 0x0000;
IFR = 0x0000;
/*初始化PIE中斷*/
InitPieCtrl();
/*初始化PIE中斷矢量表*/
InitPieVectTable();
/*初始化SCIA寄存器*/
InitSci();
//初始化cputimer
InitCpuTimers();
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;
/*設置中斷服務程序入口地址*/
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.TXAINT = &SCITXINTA_ISR;
PieVectTable.RXAINT = &SCIRXINTA_ISR;
PieVectTable.TINT2 = &ISRTimer2;
PieVectTable.ADCINT = &ad;
EDIS; // This is needed to disable write to EALLOW protected registers
//
/*開中斷*/
IER |= M_INT9;//SCI中斷
IER |= M_INT1;//ADC中斷
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
LED1_ON;
*LED3=0;
/*實驗主控程序*/
psend = (PuartForDec5416)(&uarts[0]);
precieve = (PuartForDec5416)(&uart[0]);
padset = (PAdConfig)(&adset[0]);
/*通知主機,系統準備好*/
psend->Length = FRAMLONGTH;
psend->Type = UARTCOMMAND;
psend->Data[0] = INITOVER;
psend->Mutul = UARTCONT;
uart_send();
for(;;)
{
if(CommandSave==ADDATASEND)
{
CommandSave=0;
/*不滿buffer的數據*/
if(datasendlong <= 256)
{
for(i = 0;i<datasendlong;i++)
{
psend->Data[i] = Ad_data[i+sendcount*256];
}
psend->Length = datasendlong;
psend->Type = UARTDATA;
psend->Mutul = UARTCONT;
uart_send();
}
else/*滿buffer數據*/
{
for(k = 0; k<256;k++)
{
psend->Data[k] = Ad_data[k+sendcount*256];
}
psend->Length = 256;
psend->Type = UARTDATA;
psend->Mutul = UARTMUTL;
uart_send();
datasendlong= datasendlong - 256;
sendcount++;
}
}
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)
{
/*無效命令*/
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])
{
/*AD設置*/
case ADSET:
for(i=0;i<3;i++)
{
adset[i] = precieve->Data[i+1];
}
/*設置數據發送長度*/
datasendlong = padset->SampleLong;
precieve->Data[0] = 0;
break;
/*啟動AD采樣*/
case ADSTART:
convcount=0;
adconvover=0;
sendcount=0;
convfirstN=1000; //前N個不用。
/*AD采樣率*/
switch( padset->SampleRate)
{
case ADSAMPL8K: //0xd //采樣率為8k
DINT;
/*設置CPU*/
ConfigCpuTimer(&CpuTimer2, 150, 125);
StartCpuTimer2();
/*開中斷*/
IER |= M_INT14;
EINT;
InitAdc();
break;
case ADSAMPL44K: // 0x23 //采樣率為44k
DINT;
/*設置CPU*/
ConfigCpuTimer(&CpuTimer2, 150, 22);
StartCpuTimer2();
/*開中斷*/
IER |= M_INT14;
EINT;
InitAdc();
break;
case ADSAMPL96K://0x1d //采樣率為96k
DINT;
/*設置CPU*/
ConfigCpuTimer(&CpuTimer2, 150, 10);
StartCpuTimer2();
/*開中斷*/
IER |= M_INT14;
EINT;
InitAdc96k();
break;
default:
break;
}
for(;;)
{
if (adconvover==1)
break;
}
/*AD采樣結束*/
for(i=0;i<datasendlong;i++)
{
Ad_data[i]=(Ad_data[i]>>4)-0x555;//偏移量1v。
}
psend->Length = 1;
psend->Type = UARTCOMMAND;
psend->Data[0] = ADOVER;
psend->Mutul = UARTCONT;
uart_send();
precieve->Data[0] = 0;
break;
/*AD數據傳送*/
case ADDATASEND:
CommandSave=ADDATASEND;
precieve->Data[0] = 0;
break;
case RECIEVEERROR:
datasendlong = datasendlong + 256;
sendcount--;
precieve->Data[0] = 0;
CommandSave=ADDATASEND;
break;
/*系統復位*/
case SYSRESET:
sys_reset();
default:
break;
}
}
}
interrupt void ad(void)
{
IFR=0x0000;
PieCtrl.PIEACK.all=0xffff;
if(convfirstN==0)
{
Ad_data[convcount] = AdcRegs.RESULT1;
if(Ad_data[convcount]==0)
{
convcount--;
}
convcount++;
if (convcount==(padset->SampleLong))
{
convcount=0;
adconvover=1;//接滿標志
DINT;
/*停止計數*/
StopCpuTimer2();
/*關中斷*/
IER &= 0xdfff;
EINT;
}
}
else
convfirstN--;
}
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;
}
interrupt void ISRTimer2(void)
{
// AdcRegs.ADCTRL2.bit.RST_SEQ1=1;
AdcRegs.ADC_ST_FLAG.bit.INT_SEQ1_CLR=1;
AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;
}
void sys_reset(void)
{
EALLOW;
SysCtrlRegs.WDCR= 0;
EDIS;
for(;;){};
}
//===========================================================================
// No more.
//===========================================================================
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -