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