📄 signal_process.c
字号:
/**
* signal process file
*
*
* This is file includes get AD signal, get DI signal, output DA signal, output DO signal
*
*/
#include "include/AT91SAM7s64.h"
#include "project.h"
#include <stdio.h>
#include "cdc_enumerate.h"
#define MCK 47923200//48054857 // MCK (PLLRC div by 2)
//########################################################
// 外部变量定义
//
//########################################################
extern unsigned char packet[140];
extern struct _AT91S_CDC pCDC;
//would be useless
/*
#define MSG_SIZE 1000
extern unsigned char data[MSG_SIZE];
extern unsigned char DZ_send_data[64];
extern int da_channle,da_data;
extern char* usart_input(void);
#define TEST_DEBUG 1
#undef ADC_DEBUG
#undef DAC_DEBUG
*/
//########################################################
// ADC converter
// function: adc_read(ch);
// ch variable is a channel number (0-7)
// return value is the adc value that has been converted
//########################################################
// blow define can be changed
#define AT91C_ADC_CS_0_7 1 /* select spi cs0 as CS signal */
#define AT91C_ADC_CS_8_15 0 /* select spi cs0 as CS signal */
#define ADC_BUFF_SIZE 20 /* buffer size for pdc get data*/
#define ADC_DELNUM 1 // kick number for bigger or litter number
// blow define can not be change unless you know what you do
#define ADC_CLK 2400000
#define AT91C_ADC_TIMEOUT 10000
//#define ADS8345_BUSY AT91C_PIO_PB30 // use as ads8345 BUSY pin
// command byte define
#define ADS8345_PWON 0x03 //No power-down between conversions
#define ADS8345_INCLOCK 0x02 // Internal clock mode.
#define ADS8345_SGL 0x1<<2 //Single-Ended mode
#define ADS8345_COM (1<<7)|(ADS8345_PWON)|(ADS8345_SGL)
#define ADS8345_CH(CH) (CH<<4)|ADS8345_COM //extern clock ,sgl mode,no power
#define ADS8345_CH2(CH) (1<<7)|(CH<<4)|(ADS8345_SGL)
#define ADS8345_CH3(CH) (1<<7)|(CH<<4)|(ADS8345_INCLOCK)|(ADS8345_SGL) // internal clk , sgl mode
#define ADS8345_OFF (1<<7)|(ADS8345_SGL)
#define ADC_TEST_CHANNEL 0
#define ADC_TEST_DELAY 10000000
//#####################################################
// DAC converter
// function:dac_write(int ch,int data)
// ch is channel number;
// data is a value that need to be converted
//######################################################
/* define ports*/
//#define AT91C_DAC_LDAC AT91C_PIO_PB30
#define AT91C_DAC_CS2 2
#define AT91C_DAC_OUT (1<<3)
#define DAC_CLK 10000000
#define AT91_DAC_CTRL0 0x8
#define AT91_DAC_CTRL1 0x9
#define AT91_DAC_PRE 0xa
#define AT91_DAC_AB 0xc
#define AT91_DAC_CD 0xd
#define AT91_DAC_EF 0xe
#define AT91_DAC_GH 0xf
#define CTRL0_DATA 0x0
#define CTRL1_DATA 0x0
#define PRESET_DATA 0x800
#define DAC_TEST_CHANNEL 0
#define DAC_TEST_DELAY 1000
//#####################################################
// 信号测试函数声明
//
//######################################################
void adc_test(void);
void dac_test(unsigned char da_command_packet[]);
void test_do(unsigned char do_command_packet[]);
void test_di(void);
//实时时钟测试函数
void clock_test(void);
//串口初始化、发送函数
extern void usart_output(unsigned char*);
extern unsigned int datalength;
extern void Usart_init(void);
//extern void AT91F_DBGU_Printk(char *);
//extern void AT91F_DBGU_Init(void);
//######################################################
// define ADC local variable
//
//######################################################
unsigned short t_padcbyte[ADC_BUFF_SIZE];
unsigned short t_pnadcbyte[ADC_BUFF_SIZE];
unsigned short r_padcbyte[ADC_BUFF_SIZE];
unsigned short r_pnadcbyte[ADC_BUFF_SIZE];
unsigned short r_temp[ADC_BUFF_SIZE/2];
//######################################################
// define fuction
//config PIO for SPI
//######################################################
__inline void AT91F_SPI_CfgPIO2 (void)
{
// Configure PIO controllers to periph mode
AT91F_PIO_CfgPeriph(
AT91C_BASE_PIOA, // PIO controller base address
((unsigned int) AT91C_PA13_MOSI ) |
((unsigned int) AT91C_PA14_SPCK ) |
((unsigned int) AT91C_PA11_NPCS0 ) |
((unsigned int) AT91C_PA12_MISO ), // Peripheral A
((unsigned int) AT91C_PA9_NPCS1 ) |
((unsigned int) AT91C_PA22_NPCS3 ) |
((unsigned int) AT91C_PA3_NPCS3 ) |
((unsigned int) AT91C_PA5_NPCS3 ) |
((unsigned int) AT91C_PA10_NPCS2 )
//|((unsigned int) AT91C_PA30_NPCS2 )
); // Peripheral B
}
//#####################################################
// 选择SPI外设
// for select spi npcs value,store in SPI_MR register
//######################################################
void AT91F_SPI_CsSel(int cs)
{
switch(cs){
case 0:
AT91F_SPI_CfgMode(AT91C_BASE_SPI, AT91C_SPI_MSTR | AT91C_SPI_PS_FIXED|AT91C_SPI_MODFDIS
| 0xe<<16);
break;
case 1:
AT91F_SPI_CfgMode(AT91C_BASE_SPI, AT91C_SPI_MSTR | AT91C_SPI_PS_FIXED|AT91C_SPI_MODFDIS
| 0xd<<16);
break;
case 2:
AT91F_SPI_CfgMode(AT91C_BASE_SPI, AT91C_SPI_MSTR | AT91C_SPI_PS_FIXED|AT91C_SPI_MODFDIS
| 0xb<<16);
break;
case 3:
AT91F_SPI_CfgMode(AT91C_BASE_SPI, AT91C_SPI_MSTR | AT91C_SPI_PS_FIXED|AT91C_SPI_MODFDIS
| 0x7<<16);
break;
default:
AT91F_SPI_CfgMode(AT91C_BASE_SPI, AT91C_SPI_MSTR | AT91C_SPI_PS_FIXED|AT91C_SPI_MODFDIS
| 0xf<<16);
break;
}
}
//#####################################################
// 延时函数
//
//######################################################
void adc_delay(int num){
for(int i=1;i<num;i++)
for(int j=1;j<AT91C_ADC_TIMEOUT;j++);
}
//#####################################################
// 关于AD采样的函数
// 开始
//######################################################
void cfg_adc(int chip_select)
{
AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOA ) ;
//AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOB ) ;
/*#ifdef ADC_DEBUG
AT91F_DBGU_Init();
AT91F_DBGU_Printk("\n\rInit SPI ADC Interface\n\r");
#endif*/
AT91F_SPI_CfgPIO2();
//* \brief Enable Peripheral clock in PMC for SPI
AT91F_SPI_CfgPMC();
//* Reset the SPI
AT91F_SPI_Reset(AT91C_BASE_SPI);
//* Configure SPI in Master Mode with No CS selected !!!
AT91F_SPI_CfgMode(AT91C_BASE_SPI, AT91C_SPI_DLYBCS|AT91C_SPI_MSTR | AT91C_SPI_PS_FIXED|AT91C_SPI_MODFDIS | AT91C_SPI_PCS);
//* Configure SPI CS0 register for Serial ADC
AT91F_SPI_CfgCs(AT91C_BASE_SPI,chip_select,AT91C_SPI_DLYBCT|AT91C_SPI_BITS_16| (AT91C_SPI_DLYBS & 0x100000) | ((MCK/(2*ADC_CLK)) << 8));
//* Enable the SPI
AT91F_PDC_Open (AT91C_BASE_PDC_SPI);
AT91F_SPI_Enable(AT91C_BASE_SPI);
}
int channel_trans(int ch)
{
int chsel;
chsel=ch&0x7;
switch(chsel){
case 0:
return 0x0;
case 1:
return 0x4;
case 2:
return 0x1;
case 3:
return 0x5;
case 4:
return 0x2;
case 5:
return 0x6;
case 6:
return 0x3;
case 7:
return 0x7;
default:
return 0x0;
}
}
// ch is a adc channel num ,in sum 8 channel,return value is a trans ADC value
int adc_read(int ch)
{
int average = 0;
int sum = 0;
int chip_select;
int i,j,temp,adc_channel;
if(ch >= 0 && ch <=7)
{
chip_select = AT91C_ADC_CS_0_7;
}
else if(ch >= 8 && ch <= 15)
{
chip_select = AT91C_ADC_CS_8_15;
}
adc_channel = channel_trans(ch%8);
cfg_adc(chip_select);
AT91F_SPI_CsSel(chip_select);
for(int i=0;i<ADC_BUFF_SIZE;i+=2){
t_padcbyte[i]=((ADS8345_CH3(adc_channel))<<8);
t_padcbyte[i+1]=0;
}
for(int i=0;i<ADC_BUFF_SIZE;i+=2){
t_pnadcbyte[i]=((ADS8345_CH3(adc_channel))<<8);
t_pnadcbyte[i+1]=0;
}
for(int i=0;i<ADC_BUFF_SIZE;i++){
r_padcbyte[i]=0;
}
#if 0
while( AT91C_BASE_PDC_SPI->PDC_TCR );
while( AT91C_BASE_SPI->SPI_SR & AT91C_SPI_NSSR==0 );
while( AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TXEMPTY==0 );
while( AT91C_BASE_PDC_SPI->PDC_TCR );
while( AT91C_BASE_SPI->SPI_SR & AT91C_SPI_NSSR==0 );
while( AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TXEMPTY==0 );
#endif
AT91F_PDC_DisableRx(AT91C_BASE_PDC_SPI);
AT91F_PDC_DisableTx(AT91C_BASE_PDC_SPI);
*AT91C_SPI_TPR=(unsigned int )&t_padcbyte[0];
*AT91C_SPI_RPR=(unsigned int )&r_padcbyte[0];
*AT91C_SPI_TNPR=(unsigned int )&t_pnadcbyte[0];
*AT91C_SPI_RNPR=(unsigned int )&r_pnadcbyte[0];
*AT91C_SPI_TCR = ADC_BUFF_SIZE;
*AT91C_SPI_RCR = ADC_BUFF_SIZE;
*AT91C_SPI_TNCR = ADC_BUFF_SIZE;
*AT91C_SPI_RNCR = ADC_BUFF_SIZE;
*AT91C_SPI_PTCR = AT91C_PDC_TXTEN + AT91C_PDC_RXTEN;
while( !AT91F_PDC_IsRxEmpty(AT91C_BASE_PDC_SPI) );
for(int i=1;i<ADC_BUFF_SIZE;i+=2){
r_padcbyte[i/2] = r_padcbyte[i];
r_padcbyte[i/2] = r_padcbyte[i/2] + 0x8000 ;
r_padcbyte[i/2] = r_padcbyte[i/2]&0xFFFF;
}
int m=ADC_BUFF_SIZE/2;
for (i=0; i<m-1; i++)
{
for(j=0; j<m-i-1; j++)
{
if (r_padcbyte[j]>r_padcbyte[j+1])
{
temp = r_padcbyte[j];
r_padcbyte[j] = r_padcbyte[j+1];
r_padcbyte[j+1] = temp;
}
}
}
for(i=ADC_DELNUM; i<m-ADC_DELNUM; i++)
{
sum=sum+r_padcbyte[i];
}
average = (sum/(m-ADC_DELNUM*2));
//v_output = 5*average/65535;
AT91F_SPI_Disable(AT91C_BASE_SPI);
AT91F_PMC_DisablePCK(AT91C_BASE_PMC,AT91C_ID_SPI);
return average;
}
void adc_test()
{
int i,ch;
int data = 0;
char buf[6];
int packet_pointer = 1;
// Enter Main Tests
for(ch = 0;ch < 16; ch++)
{
/*usart_input();
ch_now = (DZ_send_data[4] - 48) * 10 + DZ_send_data[5] - 48;
if(ch_now != ch || DZ_send_data[1] != 'A' || DZ_send_data[2] != 'D')
{
statement = 1;
break;
}*/
for(i = 0;i < 6; i++)
{
buf[i] = 0;
}
data = adc_read(ch);
buf[0] = '$';
buf[1] = (char)(data/10000 + 48);
data = data % 10000;
buf[2] = (char)(data/1000 + 48 );
data = data % 1000;
buf[3] = (char)(data/100 + 48 );
data = data % 100;
buf[4] = (char)(data/10 + 48 );
data = data % 10;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -