⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 signal_process.c

📁 串口通讯程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/**
  * 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 + -