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

📄 drv_tlc2543.c

📁 12位ADC芯片TLC2543的驱动程序
💻 C
字号:
/***************************************************************************
 *   drv_tlc2543.c:  TLC2543(ADC)驱动程序文件, 
 *           for Lpc213x System(nxp LPC213x Family Microprocessors)
 *           Use MCU Spi interface.
 *   
 *   by   :  SuperLjm
 *
 *   Copyright(C) 2008, SuperStudio
 *   All rights reserved.
 *
 *   History
 *   2008.04.02  ver 1.00    Prelimnary version, first Release
 *
***************************************************************************/
#include "config.h"

ADCTLC2543 myAdc;

/*****************************************************************************
* 函数名: AdcSckClr
* 说明  : ADC SCK引脚置0
* 
*****************************************************************************/
static void AdcSckClr(void)
{
	IOCLR0 =SCK;
}

/*****************************************************************************
* 函数名: AdcSckSet
* 说明  : ADC SCK引脚置1
* 
*****************************************************************************/
static void AdcSckSet(void)
{
	IOSET0 =SCK;
}

/*****************************************************************************
* 函数名: AdcCsClr
* 说明  : ADC CS引脚置0
* 
*****************************************************************************/
static void AdcCsClr(void)
{
	IOCLR1 =CS0;
}

/*****************************************************************************
* 函数名: AdcCsSet
* 说明  : ADC CS引脚置1
* 
*****************************************************************************/
static void AdcCsSet(void)
{
	IOSET1 =CS0;
}

/*****************************************************************************
* 函数名: AdcMosiClr
* 说明  : ADC MOSI引脚置0
* 
*****************************************************************************/
static void AdcMosiClr(void)
{
	IOCLR0 =MOSI;
}

/*****************************************************************************
* 函数名: AdcMosiClr
* 说明  : ADC MOSI引脚置1
* 
*****************************************************************************/
static void AdcMosiSet(void)
{
	IOSET0 =MOSI;
}

/*****************************************************************************
* 函数名: AdcGetMiso
* 说明  : 读取ADC MISO引脚值
* 
*****************************************************************************/
static unsigned char AdcGetMiso(void)
{
	return(((IOPIN0 & (MISO) ) >>5));
}

/*****************************************************************************
* 函数名: AdcGetEoc
* 说明  : 读取ADC EOC引脚值
* 
*****************************************************************************/
static unsigned char AdcGetEoc(void)
{
	return((IOPIN0 &AD_INT >>15));
}

/*****************************************************************************
* 函数名: Tlc2543Init
* 说明  : TLC1543芯片初始化,对应的MCU引脚全部设为GPIO,
*                           使用IO模拟实现SPI读写。
* 参数  : None
* 返回值: None
* 
*****************************************************************************/
void Tlc2543Init(void)
{
	PINSEL0 &= ~((0x03u <<30)|(0x03 <<12)|(0x03 <<10)|(0x03 <<8));
	IODIR0   = (IODIR0 | SCK| MOSI) &(~MISO) &(~AD_INT);
		
	AdcCsSet();
	AdcSckClr();
	AdcMosiClr();
	
	myAdc.datalength = AD_12BIT;
	myAdc.dataformat = AD_MSB_F;
	myAdc.volpol     = AD_POL_UI;				//无极性
	
	myAdc.Vref   =2500;							//2500mV基准电压
	myAdc.OvTime =600;
}

/*****************************************************************************
* 函数名: Tlc2543SpiRd
* 说明  : 读取TLC2543转换值
* 参数  : indata - 同时写入的数据
* 返回值: None
* 
*****************************************************************************/
int Tlc2543SpiRd(char indata)
{
	unsigned char i =0;
	unsigned int  uiRdData =0;
	unsigned char ucWrData =0;
	
	ucWrData =indata;
	AdcCsSet();
	AdcSckClr();

	AdcCsClr();
	for( i=0; i<12; i++)
	{
		
		if( (ucWrData &0x80))					/* 写入数据					*/
		{
			AdcMosiSet();
		}
		else
		{
			AdcMosiClr();
		}
		ucWrData <<= 1;
		
		if( AdcGetMiso() ==1)					/* 读取数据					*/
		{
			uiRdData |=0x01;
		}
		uiRdData <<= 1;
		DlykTicks (2);
		
		AdcSckSet();							/* 时钟上升沿	 			*/
		DlykTicks (2);
		AdcSckClr();							/* 时钟下降沿				*/
		DlykTicks (2);
	}
	DlykTicks (5);
	AdcCsSet();
	
	uiRdData >>= 1;
	uiRdData &= 0x0fff;							/* 截取低12位				*/
	
	return uiRdData;
}

/*****************************************************************************
* 函数名: Tlc2543Read
* 说明  : 读取TLC2543转换值
* 参数  : ch    - 通道号( 0 - 10, 加3个校准通道 )
* 		  num   - 采样数
*         aderr - 错误类型(返回值)
*
* 返回值: 采样到的电压值
* 
*****************************************************************************/
float Tlc2543Read(unsigned char ch,unsigned int num,unsigned char *aderr)
{
	unsigned char ucCtrl =0;					/* 控制字					*/
	unsigned char ucOvTime =0;
	unsigned int  uiAdcData=0;
	
	float fVol =0;
	
	*aderr =TRUE;
	
	ucCtrl =((ch <<4) &0xF0) |( myAdc.datalength) |(myAdc.dataformat) |(myAdc.volpol);
	Tlc2543SpiRd(ucCtrl);

	while(AdcGetEoc() ==0)
	{
		if(ucOvTime >(myAdc.OvTime))
		{
			*aderr =FALSE;						/* 读取超时					*/
			return 0;
		}
		ucOvTime++;
	}
	uiAdcData =Tlc2543SpiRd(ucCtrl);			/* 读取ADC转换值			*/
	
	fVol = ((myAdc.Vref) *1000/4096) *uiAdcData /1000;
	
	return fVol;
}

/***************************************************************************
**                            End Of File
***************************************************************************/












⌨️ 快捷键说明

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