参考设计
CS1237程序
CS1237是一款高精度、低功耗模数转换芯片,一路差分输入通道,内置温度传感器和高精度振荡器。
/*----------------------------------------------------------------------------
CODE NAME: AD_Communication.C
- description
- MCU与ADC通讯相关子程序
-----------------------------------------------------------------------------*/
//整个通讯时序的时间必须小于1个数据转换周期
//推荐每个CLK的时间长度:2uS ~ 15uS
/*-----------------------------------------------------------------------------
Name : F_AD_Clock
Function: ADC时序时钟
-----------------------------------------------------------------------------*/
void F_AD_Clock(void)
{
IO_CLK_AD = 1;
F_Delay();
IO_CLK_AD = 0;
F_Delay();
}
/*-----------------------------------------------------------------------------
Name : F_Read_AD_Byte
Function: 读3字节AD值
-----------------------------------------------------------------------------*/
void F_Read_AD(void)
{
_UCHAR i;
R_AD0.word = 0;
EIC20_EIE0 = 0; //关闭MCU_DAT管脚的外部中断(防止读写时误触发)
// while(IO_Data_AD);
for(i = 0; i 《 24; i++) //发送24个CLK,接收数据
{
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
//如果一个数据转换周期内对ADC进行两次或以上的读写操作,则需要发送46个CLK,而不是27个CLK
//(即:发送24个CLK读取数据,然后再发送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;
//关闭MCU_DAT管脚的外部中断(防止读写时误触发)
//----------------------------------
//1 ~ 3:clk1-clk27
//----------------------------------
for(i = 0; i 《 27; i++)
{
F_AD_Clock();
}
//----------------------------------
//4:clk28-clk29
//----------------------------------
IO_Data_AD_Dir = 1;
//把MCU_Data管脚设为输出
F_AD_Clock();
F_AD_Clock();
//----------------------------------
//5:clk30-clk36(发送读命令)
//----------------------------------
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管脚设为输入
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;
//关闭MCU_DAT管脚的外部中断(防止读写时误触发)
//----------------------------------
//1 ~ 3:clk1-clk27
//----------------------------------
for(i = 0; i 《 27; i++)
{
F_AD_Clock();
}
//----------------------------------
//4:clk28-clk29
//----------------------------------
IO_Data_AD_Dir = 1;
//把MCU_Data管脚设为输出
F_AD_Clock();
F_AD_Clock();
//----------------------------------
//5:clk30-clk36(发送写命令)
//----------------------------------
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管脚设为输入
F_AD_Clock();
//----------------------------------
EIC20_EIE0 = 1; //重新开启MCU_DAT管脚的外部中断
}
全部0条评论
快来发表一下你的评论吧 !