CS1237程序
CS1237是一款高精度、低功耗模數(shù)轉(zhuǎn)換芯片,一路差分輸入通道,內(nèi)置溫度傳感器和高精度振蕩器。
/*----------------------------------------------------------------------------
- description
-----------------------------------------------------------------------------*/
//整個通訊時序的時間必須小于1個數(shù)據(jù)轉(zhuǎn)換周期
//推薦每個CLK的時間長度:2uS ~ 15uS
/*-----------------------------------------------------------------------------
Name : F_AD_Clock
-----------------------------------------------------------------------------*/
void F_AD_Clock(void)
{
IO_CLK_AD = 1;
F_Delay();
IO_CLK_AD = 0;
F_Delay();
}
/*-----------------------------------------------------------------------------
Name : F_Read_AD_Byte
Function: 讀3字節(jié)AD值
-----------------------------------------------------------------------------*/
void F_Read_AD(void)
{
_UCHAR i;
R_AD0.word = 0;
EIC20_EIE0 = 0; //關(guān)閉MCU_DAT管腳的外部中斷(防止讀寫時誤觸發(fā))
// while(IO_Data_AD);
for(i = 0; i 《 24; i++) //發(fā)送24個CLK,接收數(shù)據(jù)
{
R_AD0.word 《《= 1;
F_AD_Clock();
if(IO_Data_AD)
{
R_AD0.word ++;
}
}
F_AD_Clock();
F_AD_Clock();
F_AD_Clock();
//CLK27,拉高DRDY
//如果一個數(shù)據(jù)轉(zhuǎn)換周期內(nèi)對ADC進(jìn)行兩次或以上的讀寫操作,則需要發(fā)送46個CLK,而不是27個CLK
//(即:發(fā)送24個CLK讀取數(shù)據(jù),然后再發(fā)送22個CLK)
EIC20_EIE0 = 1;
//
重新開啟
MCU_DAT
管腳的外部中斷
}
/*-----------------------------------------------------------------------------
Name : F_Rd_AdReg
Function: 讀取ADC寄存器
-----------------------------------------------------------------------------*/
_UCHAR
F_Rd_AdReg(void)
{
_UCHAR i;
union _UCHAR_BIT R_Temp;
//----------------------------------
EIC20_EIE0 = 0;
//關(guān)閉MCU_DAT管腳的外部中斷(防止讀寫時誤觸發(fā))
//----------------------------------
//1 ~ 3:clk1-clk27
//----------------------------------
for(i = 0; i 《 27; i++)
{
F_AD_Clock();
}
//----------------------------------
//4:clk28-clk29
//----------------------------------
IO_Data_AD_Dir = 1;
//把MCU_Data管腳設(shè)為輸出
F_AD_Clock();
F_AD_Clock();
//----------------------------------
//5:clk30-clk36(發(fā)送讀命令)
//----------------------------------
R_Temp.byte = 0xAC;
//讀命令(0x56)左移1位
for(i = 0; i 《 7; i ++)
{
if(R_Temp.bit.b07)
//MSB
{
IO_Data_AD = 1;
}
else
{
IO_Data_AD = 0;
}
R_Temp.byte = R_Temp.byte 《《 1;
F_AD_Clock();
}
//----------------------------------
//6:clk37
//----------------------------------
IO_Data_AD_Dir = 0;
//把MCU_Data管腳設(shè)為輸入
F_AD_Clock();
//----------------------------------
//7:clk38-clk45(讀取寄存器)
//----------------------------------
R_Temp.byte = 0;
for(i = 0; i 《 8; i++)
{
R_Temp.byte 《《= 1;
F_AD_Clock();
if(IO_Data_AD)
{
R_Temp.byte ++;
}
}
//----------------------------------
//8:clk46
//----------------------------------
F_AD_Clock();
//----------------------------------
EIC20_EIE0 = 1;
//重新開啟MCU_DAT管腳的外部中斷
return R_Temp.byte;
}
/*-----------------------------------------------------------------------------
Name : F_Wr_AdReg
Function: 寫入ADC寄存器
-----------------------------------------------------------------------------*/
void F_Wr_AdReg(_UCHAR R_AdReg)
{
_UCHAR i;
union _UCHAR_BIT R_Temp;
//----------------------------------
EIC20_EIE0 = 0;
//關(guān)閉MCU_DAT管腳的外部中斷(防止讀寫時誤觸發(fā))
//----------------------------------
//1 ~ 3:clk1-clk27
//----------------------------------
for(i = 0; i 《 27; i++)
{
F_AD_Clock();
}
//----------------------------------
//4:clk28-clk29
//----------------------------------
IO_Data_AD_Dir = 1;
//把MCU_Data管腳設(shè)為輸出
F_AD_Clock();
F_AD_Clock();
//----------------------------------
//5:clk30-clk36(發(fā)送寫命令)
//----------------------------------
R_Temp.byte = 0xCA;
//寫命令(0x65)左移1位
for(i = 0; i 《 7; i ++)
{
if(R_Temp.bit.b07) //MSB
{
IO_Data_AD = 1;
}
else
{
IO_Data_AD = 0;
}
R_Temp.byte = R_Temp.byte 《《 1;
F_AD_Clock();
}
//----------------------------------
//6:clk37
//----------------------------------
F_AD_Clock();
//----------------------------------
//7:clk38-clk45(寫入寄存器)
//----------------------------------
R_Temp.byte = R_AdReg;
for(i = 0; i 《 8; i ++)
{
if(R_Temp.bit.b07) //MSB
{
IO_Data_AD = 1;
}
else
{
IO_Data_AD = 0;
}
R_Temp.byte = R_Temp.byte 《《 1;
F_AD_Clock();
}
//----------------------------------
//8:clk46
//----------------------------------
IO_Data_AD_Dir = 0;
//把MCU_Data管腳設(shè)為輸入
F_AD_Clock();
//----------------------------------
EIC20_EIE0 = 1; //重新開啟MCU_DAT管腳的外部中斷
}
評論
查看更多