?? dtk-fft.c
字號:
/*********************************************************************************
* MCPSB.C v1.00 測試MCBSP同步串口測試的主程序 *
* 版權(c) 2003- 北京合眾達電子技術有限責任公司 *
* 設計者: 段立鋒 *
**********************************************************************************/
#include "type.h"
#include "codec.h"
#include "uart.h"
#include "sysreg.h"
#include "mcbsp54.h"
#include "memory.h"
#include "comm.h"
#include "math.h"
#include "stdio.h"
#include "tms320.h"
#include "dsplib.h"
/*幀長度的設定*/
#define FRAMLONGTH 0x104
#define DataLongth 0x100
typedef struct _UartForDec5416{
unsigned int Length;
unsigned int Type;
unsigned int Mutul;
unsigned int Data[DataLongth];
unsigned int Check;
}UartForDec5416, *PuartForDec5416;
HANDLE uart_a =0;
HANDLE codec_command =0;
HANDLE codec_data=0;
unsigned int audiodata =0;
PuartForDec5416 precieve =0;
unsigned int i= 0,r = 0;
unsigned int k= 0;
int uart_s=0,uart_err=0,fifostatus=0;
unsigned long flashbaddr=0;
unsigned long flashaddr = 0;
PuartForDec5416 psend=0;
PAdConfig padset = 0;
unsigned int datasendlong = 0;
unsigned int datasendlength = 0;
unsigned int sendcount = 0;
unsigned int errorsend = 0;
unsigned int adset[4] ={1024,0xd,0,0};
DATA dataleft[1536] ={0};
unsigned int dataright[1536] ={0};
unsigned int uart[0x104] ={0};
unsigned int uarts[0x104] = {0};
#pragma DATA_SECTION (fft_data,".result")
DATA fft_data[1024];
unsigned int mod[512];
ushort datacbrev=0;
int m=0;
double n;
double p,q;
main()
{
// int i,r;
/*設置系統時鐘*/
sys_clk(CLK160);
/*初始化DEC5416板卡*/
dec5416_init();
for(i= 0; i<0x104;i++)
{
uart[i] = 0x5555;
uarts[i] = 0x5555;
}
/*打開codec數據接口*/
codec_data = codec_open(CODEC_DATA);
/*打開codec命令接口*/
codec_command = codec_open(CODEC_COMMAND);
/*設置波特率,輸入與輸出均為8K*/
codec_sample_rate(codec_command,0xd);
/*獲取有效的串口句柄*/
uart_a = uart_open(UART_A);
/*初始化串口*/
uart_setup(uart_a, /*串口A*/
buad_19k2, /*串口的波特率設置*/
data_w8, /*數據長度為8*/
data_s1, /*數據停止位為1*/
//uart_parity, /*設置奇較驗位*/
0,
(fifo_enable+fifo_txdip16+fifo_rxdip16),/*FIFO設置*/
0); /*設置自閉環方式*/
/*串口A中斷設置*/
uart_interrupt_control( uart_a, uartint_rhr, uart_enable);
/*設置接收長度*/
uart_reclong_set(uart_a,FRAMLONGTH);
/*打開系統的串口中斷*/
sysint_enable(0x2);
/*配置系統存儲器*/
memory_set(0x80);
/*實驗主控程序*/
psend = (PuartForDec5416)(&uarts[0]);
padset = (PAdConfig)(&adset[0]);
/*通知主機,系統準備好*/
psend->Length = FRAMLONGTH;
psend->Type = UARTCOMMAND;
psend->Data[0] = INITOVER;
psend->Mutul = UARTCONT;
uart_send(uart_a,FRAMLONGTH, (unsigned int *)psend);
for(;;)
{
uart_recive(uart_a,&uart[0]);
/*判斷串口的狀態*/
uart_s =uart_status(uart_a);
if( uart_s == 2)
{
/*讀RHR清 RHR interrupt*/
uart_read_reg(uart_a,rhr);
/*復位FIFO指針*/
fifostatus = uart_read_reg(uart_a,fcr);
uart_write_reg(uart_a,fcr,fifo_rreset);
uart_write_reg(uart_a,fcr,fifostatus);
continue;
}
/*串口出錯*/
if(uart_s == ERROR)
{
/*讀狀態寄存器*/
uart_err = uart_read_reg(uart_a,lsr);
/*復位FIFO指針*/
fifostatus = uart_read_reg(uart_a,fcr);
uart_write_reg(uart_a,fcr,fifo_rreset);
uart_write_reg(uart_a,fcr,fifostatus);
continue;
}
/*數據較驗出錯*/
if(uart_s == 3)
{
/*通知主機程序通訊出錯,準備重發*/
psend->Length = FRAMLONGTH;
psend->Type = UARTCOMMAND;
psend->Data[0] = RECIEVEERROR;
psend->Mutul = UARTCONT;
uart_send(uart_a,FRAMLONGTH, (unsigned int *)psend);
continue;
}
/*數據未準備好*/
if(uart_s == 0)
{
precieve = (PuartForDec5416)(&uart[0]);
/*不是命令幀*/
if(precieve->Type != UARTCOMMAND)
{
/*無效命令*/
psend->Length = FRAMLONGTH;
psend->Type = UARTCOMMAND;
psend->Data[0] = COMMANDNODO;
psend->Mutul = UARTCONT;
uart_send(uart_a,FRAMLONGTH, (unsigned int *)psend);
precieve->Data[0] = 0;
}
continue;
}
/*接收從主機的數據*/
precieve = (PuartForDec5416)(&uart[0]);
switch(precieve->Data[0])
{
/*AD設置*/
case FFTSET:
for(i=0;i<3;i++)
{
adset[i] = precieve->Data[i+1];
}
/*設置數據發送長度*/
datasendlong = padset->SampleLong;
datasendlength= 3*datasendlong/2;
/*AD前向增益調整*/
codec_lineain_gain(codec_command, padset->GainSet);
/*AD采樣率*/
codec_sample_rate(codec_command, padset->SampleRate);
precieve->Data[0] = 0;
break;
/*啟動AD采樣*/
case FFTSTART:
sendcount = 0;
datasendlength= 3*datasendlong/2;
for(i = 0;i<padset->SampleLong;)
{
/* Wait for sample from handset */
while (!MCBSP_RRDY(CODEC_DATA)) {};
/* Read sample from and write back to handset codec */
/*左通路數據*/
dataleft[i] = *(volatile u16*)DRR1_ADDR(CODEC_DATA);
/* Wait for sample from handset */
while (!MCBSP_RRDY(CODEC_DATA)) {};
/*右通路數據*/
dataright[i] = *(volatile u16*)DRR1_ADDR(CODEC_DATA);
fft_data[i] = dataright[i];
i = i+1;
}
/*fft轉換*/
for(i=0;i<datasendlong;i++)
{
fft_data[i] = dataleft[i];
}
switch(datasendlong)
{
case 256:
/*256 point*/
cbrev(fft_data,fft_data,128);
rfft(fft_data,256,256);
break;
case 512:
/*512 point*/
cbrev(fft_data,fft_data,256);
rfft(fft_data,512,512);
break;
case 1024:
/*1024 point*/
cbrev(fft_data,fft_data,512);
rfft(fft_data,1024,1);
break;
}
/*求模*/
m=0;
for(i=0;i<datasendlong;i+=2)
{
p=fft_data[i];
q=fft_data[i+1];
n=p*p+q*q;
mod[m]=sqrt(n);
m++;
}
r= datasendlong;
/* dataleft(dataright)[]=addata[]+mod[]*/
for(i=0;i<datasendlong/2;i++)
{
dataleft[r]=mod[i];
dataright[r]=mod[i];
r++;
}
/*AD采樣結束*/
psend->Length = 1;
psend->Type = UARTCOMMAND;
psend->Data[0] = FFTOVER;
psend->Mutul = UARTCONT;
uart_send(uart_a,FRAMLONGTH, (unsigned int *)psend);
precieve->Data[0] = 0;
break;
/*AD數據傳送*/
case FFTDATASEND:
if(datasendlength <=256)
{
for(i = 0;i<datasendlength;i++)
{
/*確定通路*/
if(padset->DataLeft == ADDATALEFT)
{
psend->Data[i] = dataleft[i+sendcount*256];
}
else
{
psend->Data[i] = dataright[i+sendcount*256];
}
}
psend->Length = datasendlength;
psend->Type = UARTDATA;
psend->Mutul = UARTCONT;
uart_send(uart_a,FRAMLONGTH, (unsigned int *)psend);
precieve->Data[0] = 0;
break;
}
for(k = 0; k<256 ; k++)
{
/*確定通路*/
if(padset->DataLeft == ADDATALEFT)
{
psend->Data[k] = dataleft[k + sendcount*256];
}
else
{
psend->Data[k] = dataright[k+ sendcount*256];
}
}
psend->Length = 256;
psend->Type = UARTDATA;
psend->Mutul = UARTMUTL;
uart_send(uart_a,FRAMLONGTH, (unsigned int *)psend);
datasendlength = datasendlength - 256;
sendcount++;
precieve->Data[0] = 0;
break;
case RECIEVEERROR:
datasendlength= datasendlength + 256;
sendcount--;
precieve->Data[0] = FFTDATASEND;
break;
/*系統復位*/
case SYSRESET:
sys_set(0x4);
precieve->Data[0] =0;
break;
default:
break;
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -