打印
[资料分享]

ADS8555驱动分享--DSP28335

[复制链接]
483|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xyz549040622|  楼主 | 2019-12-21 10:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 xyz549040622 于 2019-12-21 23:19 编辑
// TI File $Revision: /Final ok version for SH's EVM board/ (Jack's remark: This is Dale's code, better than me)

//###########################################################################
// FILE:    ADS8556-6ch.c
//
// TITLE:   Test ADS8556 for total 6 channels.
// DESCRIPTION:
//###########################################################################


#include "DSP28x_Project.h"     
#define BUF_6CH          6  
#define BUF_Times       48  
#define Result_total   288
#pragma DATA_SECTION(ADS8556_Result,"DMARAML6");
#pragma DATA_SECTION(ADS8556_Buf,"ZONE6DATA");
volatile Uint16 ADS8556_Result[Result_total];
volatile Uint16 ADS8556_Buf[BUF_6CH];
volatile Uint16 *ADCDest;
volatile Uint16 *ADCSource;
volatile Uint16 m;
volatile Uint16 INT_Flag;    // INT finish flag
void Gpio_setup1(void);   
void init_zone6(void);      
void delay_loop(void);
void delay_short(void);
interrupt void xint1_isr(void);

void main(void)
{
   Uint16 i;
   Uint16 j;

   // Step 1. Initialize System Control:
   // PLL, WatchDog, enable Peripheral Clocks
   // This example function is found in the DSP2833x_SysCtrl.c file.
   InitSysCtrl();

   // Step 2. Clear all interrupts and initialize PIE vector table:
   // Disable CPU interrupts
   DINT;

   // Initialize PIE control registers to their default state.
   // The default state is all PIE interrupts disabled and flags
   // are cleared.
   // This function is found in the DSP2833x_PieCtrl.c file.
   InitPieCtrl();

   // Disable CPU interrupts and clear all CPU interrupt flags:
   IER = 0x0000;
   IFR = 0x0000;

   // Initialize the PIE vector table with pointers to the shell Interrupt
   // Service Routines (ISR).
   // This will populate the entire table, even if the interrupt
   // is not used in this example.  This is useful for debug purposes.
   // The shell ISR routines are found in DSP2833x_DefaultIsr.c.
   // This function is found in DSP2833x_PieVect.c.
   InitPieVectTable();

   // Interrupts that are used in this example are re-mapped to
   // ISR functions found within this file.
   EALLOW;        // This is needed to write to EALLOW protected registers
   PieVectTable.XINT1 = &xint1_isr;    // For ADS8556
   EDIS;   // This is needed to disable write to EALLOW protected registers

   // Step 3. Initialize all the Device Peripherals:
   // This function is found in DSP2833x_InitPeripherals.c
   // InitPeripherals(); // Not required for this example

   // Step 4. User specific code:
   
    Gpio_setup1();     // For ADS8556
            
        // Initalize XINTF Zone
    init_zone6();     // For ADS8556
    ////    InitXintf();  // Not required for this program

   // Initialize Tables
   for (i=0; i<BUF_6CH; i++)
   {
    ADS8556_Buf[i] = i;
   }
   for (j=0; j<Result_total; j++)
   {
          ADS8556_Result[j] = j;
   }

   // Enable Xint1 and XINT2 in the PIE: Group 1 interrupt 4 & 5
   PieCtrlRegs.PIECTRL.bit.ENPIE = 1;         
   PieCtrlRegs.PIEIER1.bit.INTx4 = 1;         
//   PieCtrlRegs.PIEIER1.bit.INTx5 = 1;      
   IER |= M_INT1;                             
   EINT;

   // F28335's GPIO12(for ADS8556) is interrupt input for XINT1
   EALLOW;
   GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 0;  
   GpioCtrlRegs.GPADIR.bit.GPIO12 = 0;  
   GpioCtrlRegs.GPAQSEL1.bit.GPIO12=0;   
   GpioCtrlRegs.GPACTRL.bit.QUALPRD1=0xFF;
   EDIS;

   EALLOW;
   GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 12;  
   EDIS;
   XIntruptRegs.XINT1CR.bit.POLARITY = 0;
   XIntruptRegs.XINT1CR.bit.ENABLE = 1;   

   // Step 5. Configure and main loop
        INT_Flag = 0;
    ADCDest   = &ADS8556_Result[0];
        ADCSource = &ADS8556_Buf[0];
    GpioDataRegs.GPASET.bit.GPIO7 = 1;            
    delay_loop();     
    GpioDataRegs.GPACLEAR.bit.GPIO7 = 1;     


        for(;;)
{
    for(m=0; m<BUF_Times; m++)   
    {
           GpioDataRegs.GPASET.bit.GPIO13 = 1;     // Load output latch
    delay_short();

        while(INT_Flag == 0) { }  
        INT_Flag = 0;

    delay_short();
        }            
  }

    //Just sit and loop forever (optional):
   //   for(;;);
}

    // Step 6. Insert all local Interrupt Service Routines (ISRs) and functions here:
        // If local ISRs are used, reassign vector addresses in vector table as shown in Step
interrupt void xint1_isr(void)
{
    unsigned char   n;

   for (n=0; n<BUF_6CH; n++)
   {
     *ADCDest++ = *ADCSource++;
   }

         ADCSource = &ADS8556_Buf[0];
        ADCDest= &ADS8556_Result[ m * 6];
        INT_Flag = 1;  
               
    GpioDataRegs.GPACLEAR.bit.GPIO13 = 1;     // Load output latch
        PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}


void delay_loop(void)
{
    unsigned char   j;
        unsigned char   k;
    for( j = 100; j > 0; j--)
    for( k = 200; k > 0; k--);   
}

void Gpio_setup1(void)         
{
   EALLOW;
   GpioCtrlRegs.GPAPUD.bit.GPIO15 = 0;     
   GpioDataRegs.GPACLEAR.bit.GPIO15 = 1;   
   GpioCtrlRegs.GPAMUX1.bit.GPIO15 = 0;   
   GpioCtrlRegs.GPADIR.bit.GPIO15 = 1;   
   GpioCtrlRegs.GPAPUD.bit.GPIO14 = 0;   
   GpioDataRegs.GPASET.bit.GPIO14 = 1;     
   GpioCtrlRegs.GPAMUX1.bit.GPIO14 = 0;   
   GpioCtrlRegs.GPADIR.bit.GPIO14 = 1;     
   GpioCtrlRegs.GPBPUD.bit.GPIO48 = 0;     
   GpioDataRegs.GPBCLEAR.bit.GPIO48 = 1;   
   GpioCtrlRegs.GPBMUX2.bit.GPIO48 = 0;   
   GpioCtrlRegs.GPBDIR.bit.GPIO48 = 1;   
   GpioCtrlRegs.GPBPUD.bit.GPIO49 = 0;     
   GpioDataRegs.GPBSET.bit.GPIO49 = 1;     
   GpioCtrlRegs.GPBMUX2.bit.GPIO49 = 0;   
   GpioCtrlRegs.GPBDIR.bit.GPIO49 = 1;  
   GpioCtrlRegs.GPAPUD.bit.GPIO7 = 0;   
   GpioDataRegs.GPACLEAR.bit.GPIO7 = 1;
   GpioCtrlRegs.GPAMUX1.bit.GPIO7 = 0;   
   GpioCtrlRegs.GPADIR.bit.GPIO7 = 1;  
   GpioCtrlRegs.GPAPUD.bit.GPIO5 = 0;   
   GpioDataRegs.GPASET.bit.GPIO5 = 1;  
   GpioCtrlRegs.GPAMUX1.bit.GPIO5 = 0;
   GpioCtrlRegs.GPADIR.bit.GPIO5 = 1;   
   GpioCtrlRegs.GPAPUD.bit.GPIO6 = 0;  
   GpioDataRegs.GPASET.bit.GPIO6 = 1;   
   GpioCtrlRegs.GPAMUX1.bit.GPIO6 = 0;  
   GpioCtrlRegs.GPADIR.bit.GPIO6 = 1;  
   GpioCtrlRegs.GPAPUD.bit.GPIO16 = 0;     
   GpioDataRegs.GPACLEAR.bit.GPIO16 = 1;   
   GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 0;   
   GpioCtrlRegs.GPADIR.bit.GPIO16 = 1;   
   GpioCtrlRegs.GPAPUD.bit.GPIO17 = 0;     
   GpioDataRegs.GPACLEAR.bit.GPIO17 = 1;   
   GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 0;   
   GpioCtrlRegs.GPADIR.bit.GPIO17 = 1;  
   GpioCtrlRegs.GPAPUD.bit.GPIO18 = 0;   
   GpioDataRegs.GPACLEAR.bit.GPIO18 = 1;
   GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 0;   
   GpioCtrlRegs.GPADIR.bit.GPIO18 = 1;     
   GpioCtrlRegs.GPAPUD.bit.GPIO19 = 0;   
   GpioDataRegs.GPASET.bit.GPIO19 = 1;   
   GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 0;  
   GpioCtrlRegs.GPADIR.bit.GPIO19 = 1;   
   GpioCtrlRegs.GPAPUD.bit.GPIO13 = 0;   
   GpioDataRegs.GPACLEAR.bit.GPIO13 = 1;   
   GpioCtrlRegs.GPAMUX1.bit.GPIO13 = 0;   
   GpioCtrlRegs.GPADIR.bit.GPIO13 = 1;   
}

void init_zone6(void)         
{
    // Make sure the XINTF clock is enabled
        SysCtrlRegs.PCLKCR3.bit.XINTFENCLK = 1;

        // Configure the GPIO for XINTF with a 16-bit data bus
        // This function is in DSP2833x_Xintf.c
        InitXintf16Gpio();

    EALLOW;
    // All Zones---------------------------------
    // Timing for all zones based on XTIMCLK = 1/2 SYSCLKOUT
    XintfRegs.XINTCNF2.bit.XTIMCLK = 1;   // 0 XTIMCLK = SYSCLKOUT
    // Buffer up to 3 writes
    XintfRegs.XINTCNF2.bit.WRBUFF = 3;
    // XCLKOUT is enabled
    XintfRegs.XINTCNF2.bit.CLKOFF = 0;
    // XCLKOUT = XTIMCLK/2
    XintfRegs.XINTCNF2.bit.CLKMODE = 1;   // 0 XCLKOUT = XTIMCLK

    // Zone 6------------------------------------
    // When using ready, ACTIVE must be 1 or greater
    // Lead must always be 1 or greater
    // Zone write timing
    XintfRegs.XTIMING6.bit.XWRLEAD = 3;
    XintfRegs.XTIMING6.bit.XWRACTIVE = 7;
    XintfRegs.XTIMING6.bit.XWRTRAIL = 7;
    // Zone read timing
    XintfRegs.XTIMING6.bit.XRDLEAD = 3;  //1
    XintfRegs.XTIMING6.bit.XRDACTIVE = 7;  //3
    XintfRegs.XTIMING6.bit.XRDTRAIL = 3;  //0

    //  double all Zone read/write lead/active/trail timing
    XintfRegs.XTIMING6.bit.X2TIMING = 1;  // 0 - don't

    // Zone will not sample XREADY signal
    XintfRegs.XTIMING6.bit.USEREADY = 0;
    XintfRegs.XTIMING6.bit.READYMODE = 0;

    // 1,1 = x16 data bus
    // 0,1 = x32 data bus
    // other values are reserved
    XintfRegs.XTIMING6.bit.XSIZE = 3;
    EDIS;

   //Force a pipeline flush to ensure that the write to
   //the last register configured occurs before returning.
   asm(" RPT #7 || NOP");
}

void delay_short(void)
{
    unsigned char   j;
        unsigned char   k;
    for( j = 10; j > 0; j--)
    for( k = 225; k > 0; k--);     
}


//===========================================================================
// No more.
//===========================================================================



使用特权

评论回复

相关帖子

沙发
internally| | 2019-12-23 19:41 | 只看该作者
感谢楼主分享!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:qq群: 嵌入式系统arm初学者 224636155←← +→→点击-->小 i 精品课全集,21ic公开课~~←←→→点击-->小 i 精品课全集,给你全方位的技能策划~~←←

2782

主题

19267

帖子

104

粉丝