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