CS1237驱动程序参考代码

参考设计

21人已加入

描述

  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管脚的外部中断

  }

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分