CS1237驱动程序参考代码

CS1237驱动程序参考代码,第1张

  CS1237程序

  CS1237是一款高精度、低功耗模数转换芯片,一路差分输入通道,内置温度传感器和高精度振荡器

  /*----------------------------------------------------------------------------

  CODE NAME: AD_CommunicaTIon.C

  - descripTIon

  - MCUADC通讯相关子程序

  -----------------------------------------------------------------------------*/

  //整个通讯时序的时间必须小于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管脚的外部中断

  }

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/dianzi/2596824.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-09
下一篇 2022-08-09

发表评论

登录后才能评论

评论列表(0条)

保存