📄 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 + -