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; F_AD_Clock(); F_AD_Clock(); //把 MCU_Data 管脚设为输出 //
//5 :clk30-clk36( 发送读命令 ) // R_Temp.byte = 0xAC; for(i = 0;
i < 7; i ++) { if(R_Temp.bit.b07) { // 读命令 (0x56) 左移 1 位 //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;
F_AD_Clock(); // // 把 MCU_Data 管脚设为输入
//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;
//