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

📄 ads7871.c

📁 高速12bit模数转换芯片ADS7871驱动源程序
💻 C
字号:
/*******************************************************************************
*
* File: ads7871.c
* Data: 2006.04.17
*
*******************************************************************************/

#include "datatype.h"

#include "LPC23xx.h"
#include "config.h"
#include "console.h"

#include "ads7871.h"

/*******************************************************************************
*******************************************************************************/
#define SET_ADC_CLK()   IOSET0 = 1<<15
#define CLR_ADC_CLK()   IOCLR0 = 1<<15

#define SET_ADC_CS()    IOSET0 = 1<<16
#define CLR_ADC_CS()    IOCLR0 = 1<<16

#define SET_ADC_DI()    IOSET0 = 1<<17
#define CLR_ADC_DI()    IOCLR0 = 1<<17

#define GET_ADC_DO()    (IOPIN0&(1<<18))

/*******************************************************************************
*******************************************************************************/
static void SPI_OUT_DAT8(unsigned char data)
{
    unsigned char i = 0;

    for (i=0; i<8; i++)
    {
        if (data & 0x80)
        {
            SET_ADC_DI();
        }
        else
        {
            CLR_ADC_DI();
        }
        data = data<<1;

        CLR_ADC_CLK( );
        SET_ADC_CLK( );
    }
}

/*******************************************************************************
*******************************************************************************/
static void SPI_OUT_DAT16(unsigned short data)
{
    unsigned char i = 0;

    for (i=0; i<16; i++)
    {
        if (data & 0x8000)
        {
            SET_ADC_DI();
        }
        else
        {
            CLR_ADC_DI();
        }
        data = data<<1;

        CLR_ADC_CLK( );
        SET_ADC_CLK( );
    }
}

/*******************************************************************************
*******************************************************************************/
static unsigned char SPI_IN_DAT8( void )
{
    unsigned char i = 0;
    unsigned char tmp=0;

    for (i=0; i<8; i++)
    {
        CLR_ADC_CLK( );
        SET_ADC_CLK( );

        tmp <<= 1;
        if (GET_ADC_DO())
        {
            tmp |= 1;
        }
    }
    return tmp;
}

/*******************************************************************************
*******************************************************************************/
static unsigned short SPI_IN_DAT16( void )
{
    unsigned char  i = 0;
    unsigned short tmp=0;

    for (i=0; i<16; i++)
    {
        CLR_ADC_CLK( );
        SET_ADC_CLK( );

        tmp <<= 1;
        if (GET_ADC_DO())
        {
            tmp |= 1;
        }
    }

    return tmp;
}

/*******************************************************************************
*******************************************************************************/
static unsigned char SPI_ADC_Read(unsigned short addr)
{
    unsigned char tmp=0;

    CLR_ADC_CS();

    SPI_OUT_DAT8((ADS7871_REG_READ|addr));

    tmp = SPI_IN_DAT8();

    SET_ADC_CS();

    return tmp;
}

/*******************************************************************************
*******************************************************************************/
static void SPI_ADC_Write8(unsigned short addr,unsigned short data)
{
    unsigned short tmp=0;

    CLR_ADC_CS();

    tmp = (ADS7871_REG_WRITE<<8) | (addr<<8) | (data&0xFF);

    SPI_OUT_DAT16(tmp);

    SET_ADC_CS();
}

/*******************************************************************************
* 名称: ADS7871_Init( )
* 功能: 硬件初始化函数
*******************************************************************************/
int ADS7871_Init(void)
{
    unsigned char tmp=0;

    PINSEL0 &= ~(0x03<<30);
    PINSEL1 &= ~(0x3F<< 0);
    IODIR0  |=  (0x07<<15);
    IODIR0  &= ~(0x01<<18);

    SET_ADC_CLK();
    SET_ADC_CS();

    // check ID register
    tmp = SPI_ADC_Read(ADS7871_ID);
    if (tmp != ADS7871_ID_VALUE)
    {
        return -1;
    }

    SPI_ADC_Write8(ADS7871_ADCTRL, 0);

    // setup reference and buffer
    SPI_ADC_Write8(ADS7871_REFOSC, (ADS7871_REFOSC_OSCR |
                                    ADS7871_REFOSC_OSCE |
                                    ADS7871_REFOSC_REFE |
                                    ADS7871_REFOSC_BUFE));
    return 0;
}

/*******************************************************************************
* 名称: ADS7871_Value()
* 功能: 读转换结果函数
*******************************************************************************/
int ADS7871_Value(unsigned char ctrl)
{
    int result = 0;

    // assert chip select
    CLR_ADC_CS();

    // start conversion
    SPI_OUT_DAT8(ADS7871_CONVERT | ctrl);

    // release chip select
    SET_ADC_CS();

    // wait for completion
    while ((SPI_ADC_Read(ADS7871_GAINMUX) & ADS7871_GAINMUX_CNVBSY));

    // assert chip select
    CLR_ADC_CS();

    // read result
    SPI_OUT_DAT8(ADS7871_REG_READ | ADS7871_REG_16BIT | ADS7871_RESULTHI);

    result = (int)SPI_IN_DAT16();

    // release chip select
    SET_ADC_CS();

    return (result>>4)&0x0FFF;   //ads7871:return (result>>2)&0x3FFF;

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -