技术热线: 0755-86643915

新闻动态

芯海电子秤方案芯片CS1237的程序参考

更新时间: 2024-01-16 15:38:04
阅读量:
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管脚的外部中断


      }

          资源源自网络,侵删