技术热线: 0755-86643915

新闻动态

 芯海代理:CS1237电子秤方案数据采集

更新时间: 2024-01-15 15:41:14
阅读量:
 CS1237电子秤方案数据采集
//********************************************************************** 
//name:         GUA_CS1237.c 
//introduce:    CS1237驱动 
//author:       鼎盛合152
//email:        peakcoo@peakcoo.con
//shop:         www.peakcoo.com
//changetime:   2023.05.31 
//********************************************************************** 
#include "mt006.h" 
#include "GUA_CS1237.h" 
#include "GUA_Delay.h" 
#include "GUA_UART.h" 
 
/*********************宏定义************************/ 
#define GUA_OUT_H                 GPIO_WriteBit(GPIO0, GPIO_Pin_5, Bit_SET) 
#define GUA_OUT_L                 GPIO_WriteBit(GPIO0, GPIO_Pin_5, Bit_RESET) 
 
#define GUA_CLK_H                 GPIO_WriteBit(GPIO0, GPIO_Pin_4, Bit_SET) 
#define GUA_CLK_L                 GPIO_WriteBit(GPIO0, GPIO_Pin_4, Bit_RESET) 
 
 
#define GUA_OUT_OUT         0          //输出的宏 
#define GUA_OUT_IN          1          //输入的宏 
 
/*********************内部函数************************/ 
static void GUA_CS1237_GPIO_Out(GUA_U8 nGUA_Out_Status); 
static void GUA_CS1237_GPIO_Init(void); 
static void GUA_CS1237_WriteConfig(void); 
 
//********************************************************************** 
//name:         GUA_CS1237_ShutDownControl 
//introduce:    CS1237 低功耗控制 
//parameter:    nGUA_ShutDownControl_Status:GUA_SHUTDOWN_ON or GUA_SHUTDOWN_OFF 
//return:       none 
//author:     鼎盛合152
//email:        peakcoo@peakcoo.con
//shop:         www.peakcoo.com
//changetime:   2023.05.31 
//********************************************************************** 
void GUA_CS1237_ShutDownControl(GUA_U8 nGUA_ShutDownControl_Status) 

      //PIO2_3 LDO_EN低电平时,开启低功耗 
      if(nGUA_ShutDownControl_Status == GUA_SHUTDOWN_ON) 
      { 
           GPIO_WriteBit(GPIO2, GPIO_Pin_3, Bit_RESET); 
      } 
      //PIO2_3 LDO_EN高电平时,关闭低功耗 
      else 
      { 
           GPIO_WriteBit(GPIO2, GPIO_Pin_3, Bit_SET); 
      } 

 
//********************************************************************** 
//name:         GUA_CS1237_GPIO_Out 
//introduce:    CS1237 OUT引脚的输入和输出切换 
//parameter:    none 
//return:       none 
//author:       鼎盛合152
//email:        peakcoo@peakcoo.con
//shop:         www.peakcoo.com
//changetime:   2022.12.29 
//********************************************************************** 
static void GUA_CS1237_GPIO_Out(GUA_U8 nGUA_Out_Status) 

      GPIO_InitTypeDef GPIO_InitStructure; 
 
      //PIO0_5 DOUT设置为输出 
      if(nGUA_Out_Status == GUA_OUT_OUT) 
      { 
           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; 
           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_2; 
           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; 
           GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; 
           GPIO_Init(GPIO0, &GPIO_InitStructure); 
      } 
      //PIO0_5 DOUT设置为输入 
      else 
      { 
           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; 
           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_2; 
           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; 
           GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; 
           GPIO_Init(GPIO0, &GPIO_InitStructure); 
      } 

 
//********************************************************************** 
//name:         GUA_CS1237_GPIO_Init 
//introduce:    CS1237的GPIO初始化 
//parameter:    none 
//return:       none 
//author:     鼎盛合152
//email:        peakcoo@peakcoo.con
//shop:         www.peakcoo.com
//changetime:   2022.12.29 
//********************************************************************** 
static void GUA_CS1237_GPIO_Init(void) 

      GPIO_InitTypeDef GPIO_InitStructure; 
 
      //PIO0_4 SCK,注意不能同时初始化多个IO 
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; 
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_2; 
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; 
      GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; 
      GPIO_Init(GPIO0, &GPIO_InitStructure); 
      
      //PIO0_5 DOUT,注意不能同时初始化多个IO 
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; 
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_2; 
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; 
      GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; 
      GPIO_Init(GPIO0, &GPIO_InitStructure); 
      
      //PIO2_3 LDO_EN,注意不能同时初始化多个IO 
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; 
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_2; 
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; 
      GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; 
      GPIO_Init(GPIO2, &GPIO_InitStructure); 

 
 
//********************************************************************** 
//name:         GUA_CS1237_WriteConfig 
//introduce:    写cs1237配置 
//parameter:    none 
//return:       none 
//author:       鼎盛合152
//email:        peakcoo@peakcoo.con
//shop:         www.peakcoo.com
//changetime:   2022.12.29 
//********************************************************************** 
static void GUA_CS1237_WriteConfig(void) 

      GUA_U8 nGUA_I; 
      GUA_U8 nGUA_Data = 0x5C;                                //REF输出关闭 输出40HZ PGA=128(有效分辨率能达20位) 通道A 
      //GUA_U8 nGUA_Data = 0x4C;                                    //REF输出关闭 输出10HZ PGA=128(有效分辨率能达20位) 通道A 
      GUA_U16 nGUA_Timemout = 0; 
   
      //数据建立 
      GUA_CS1237_GPIO_Out(GUA_OUT_OUT);            //切换OUT引脚为输出 
      GUA_OUT_H;                                                                                //OUT 1 
      GUA_CS1237_GPIO_Out(GUA_OUT_IN);             //切换OUT引脚为输入 
      GUA_CLK_L;                                                                          //CLK 0 
      
      //查询OUT脚,等待CS1237准备好,如果超时则退出 
      while(GPIO_ReadDataBit(GPIO0, GPIO_Pin_5) == SET) 
      { 
           GUA_Delay_Ms(1); 
           if(++nGUA_Timemout > 300) 
           { 
                 GUA_CS1237_GPIO_Out(GUA_OUT_OUT); //切换OUT引脚为输出 
                 GUA_OUT_H;                                                                    
                 GUA_CLK_H; 
                 return; 
           } 
      } 
      
      //29个clk脉冲 
      for(nGUA_I=0; nGUA_I<29; nGUA_I++) 
      { 
           GUA_CLK_H;                                                                                
           GUA_Delay_Us(1); 
           GUA_CLK_L;                                                                          
           GUA_Delay_Us(1); 
      } 
      
      //第30~36个脉冲,写配置寄存器是0x65、读配置寄存器是0x56,这里是1100101(7位、0x65) 
      GUA_CS1237_GPIO_Out(GUA_OUT_OUT);                                                                               //切换OUT引脚为输出 
      GUA_CLK_H;GUA_Delay_Us(1);GUA_OUT_H;GUA_CLK_L;GUA_Delay_Us(1);//30 1 
      GUA_CLK_H;GUA_Delay_Us(1);GUA_OUT_H;GUA_CLK_L;GUA_Delay_Us(1);//31 1 
      GUA_CLK_H;GUA_Delay_Us(1);GUA_OUT_L;GUA_CLK_L;GUA_Delay_Us(1);//32 0 
      GUA_CLK_H;GUA_Delay_Us(1);GUA_OUT_L;GUA_CLK_L;GUA_Delay_Us(1);//33 0 
      GUA_CLK_H;GUA_Delay_Us(1);GUA_OUT_H;GUA_CLK_L;GUA_Delay_Us(1);//34 1 
      GUA_CLK_H;GUA_Delay_Us(1);GUA_OUT_L;GUA_CLK_L;GUA_Delay_Us(1);//35 0 
      GUA_CLK_H;GUA_Delay_Us(1);GUA_OUT_H;GUA_CLK_L;GUA_Delay_Us(1);//36 1 
      
      //第37个脉冲,写入了0x65 
      GUA_CLK_H;                                                                          
      GUA_Delay_Us(1); 
      GUA_CLK_L;                                                                          
      GUA_Delay_Us(1); 
      
      //第38~45个脉冲,写8位数据 
      for(nGUA_I=0; nGUA_I<8; nGUA_I++) 
      { 
           GUA_CLK_H;                                                                          
           GUA_Delay_Us(1); 
           
           if(nGUA_Data&0x80) 
                 GUA_OUT_H;                                                               
           else 
                 GUA_OUT_L;                                                               
           
           nGUA_Data <<= 1; 
           
           GUA_CLK_L;                                                                    
           GUA_Delay_Us(1); 
      } 
      
      //第46个脉冲结束,并释放引脚 
      GUA_OUT_H; 
      GUA_CLK_H; 
      GUA_Delay_Us(1); 
      GUA_CLK_L;                                                                                
      GUA_Delay_Us(1); 

 
//********************************************************************** 
//name:         GUA_CS1237_ReadConfig 
//introduce:    读cs1237配置 
//parameter:    none 
//return:       芯片的配置数据 
//author:       鼎盛合152
//email:        peakcoo@peakcoo.con
//shop:         www.peakcoo.com
//changetime:   2022.12.29 
//********************************************************************** 
GUA_U8 GUA_CS1237_ReadConfig(void) 

      GUA_U8 nGUA_I; 
      GUA_U8 nGUA_Data = 0;                             //读取到的数据 
      GUA_U16 nGUA_Timemout = 0;                   //超时数据 
      
      //数据建立 
      GUA_CS1237_GPIO_Out(GUA_OUT_OUT); //切换OUT引脚为输出 
      GUA_OUT_H;                                                                    //OUT 1 
      GUA_CS1237_GPIO_Out(GUA_OUT_IN);  //切换OUT引脚为输入 
      GUA_CLK_L;                                                               //CLK 0 
      
      //查询OUT脚,等待CS1237准备好,如果超时则退出 
      while(GPIO_ReadDataBit(GPIO0, GPIO_Pin_5) == SET) 
      { 
           GUA_Delay_Ms(1); 
           if(++nGUA_Timemout > 300) 
           { 
                 GUA_CS1237_GPIO_Out(GUA_OUT_OUT); //切换OUT引脚为输出 
                 GUA_CLK_H;                                                                    
                 GUA_OUT_H;                                                               
                 return 1; 
           } 
      } 
 
      //29个clk脉冲 
      for(nGUA_I=0; nGUA_I<29; nGUA_I++)// 产生第1到29个时钟 
      { 
           GUA_CLK_H;                                                               
           GUA_Delay_Us(1); 
           GUA_CLK_L;                                                         
           GUA_Delay_Us(1); 
      } 
      
      //第30~36个脉冲,写配置寄存器是0x65、读配置寄存器是0x56,这里是1010110(7位、0x56) 
      GUA_CS1237_GPIO_Out(GUA_OUT_OUT); //切换OUT引脚为输出 
      GUA_CLK_H;GUA_Delay_Us(1);GUA_OUT_H;GUA_CLK_L;GUA_Delay_Us(1);//30 1 
      GUA_CLK_H;GUA_Delay_Us(1);GUA_OUT_L;GUA_CLK_L;GUA_Delay_Us(1);//31 0 
      GUA_CLK_H;GUA_Delay_Us(1);GUA_OUT_H;GUA_CLK_L;GUA_Delay_Us(1);//32 1 
      GUA_CLK_H;GUA_Delay_Us(1);GUA_OUT_L;GUA_CLK_L;GUA_Delay_Us(1);//33 0 
      GUA_CLK_H;GUA_Delay_Us(1);GUA_OUT_H;GUA_CLK_L;GUA_Delay_Us(1);//34 1 
      GUA_CLK_H;GUA_Delay_Us(1);GUA_OUT_H;GUA_CLK_L;GUA_Delay_Us(1);//35 1 
      GUA_CLK_H;GUA_Delay_Us(1);GUA_OUT_L;GUA_CLK_L;GUA_Delay_Us(1);//36 0 
 
      //第37个脉冲,写入了0x56 
      GUA_OUT_H;                                                               
      GUA_CLK_H;                                                                    
      GUA_Delay_Us(1); 
      GUA_CLK_L;                                                                    
      GUA_Delay_Us(1); 
      
      //第38 - 45个脉冲了,读取数据 
      GUA_CS1237_GPIO_Out(GUA_OUT_IN);  //切换OUT引脚为输入 
      for(nGUA_I=0; nGUA_I<8; nGUA_I++) 
      { 
           //脉冲 
           GUA_CLK_H;                                                               
           GUA_Delay_Us(1); 
           GUA_CLK_L;                                                               
           GUA_Delay_Us(1); 
           
           //读出当前脉冲的高低电平 
           nGUA_Data <<= 1; 
           if(GPIO_ReadDataBit(GPIO0, GPIO_Pin_5) == SET) 
                 nGUA_Data++; 
      } 
      
      //第46个脉冲结束,并释放引脚 
      GUA_CLK_H;                                                                    
      GUA_Delay_Us(1); 
      GUA_CLK_L;                                                                    
      GUA_Delay_Us(1); 
      
      GUA_CS1237_GPIO_Out(GUA_OUT_OUT); //切换OUT引脚为输出 
      GUA_OUT_H;                                                               
      
      return nGUA_Data; 

 
//********************************************************************** 
//name:         GUA_CS1237_ReadADC 
//introduce:    读取ADC数据 
//parameter:    none 
//return:       一个有符号的ADC数据 
//author:       鼎盛合152
//email:        peakcoo@peakcoo.con
//shop:         www.peakcoo.com
//changetime:   2023.05.10 
//********************************************************************** 
GUA_32 GUA_CS1237_ReadADC(void) 

      GUA_U8 nGUA_I; 
      GUA_U32 nGUA_Data = 0;                            //读取到的数据 
      GUA_U16 nGUA_Timemout = 0;                   //溢出计时器 
      GUA_32 nGUA_Temp; 
      
      //数据建立 
      GUA_CS1237_GPIO_Out(GUA_OUT_OUT); //切换OUT引脚为输出 
      GUA_OUT_H;                                                                    //OUT 1 
      GUA_CS1237_GPIO_Out(GUA_OUT_IN);  //切换OUT引脚为输入 
      GUA_CLK_L;                                                                    //CLK 0 
      
      //查询OUT脚,等待CS1237准备好,如果超时则退出 
      while(GPIO_ReadDataBit(GPIO0, GPIO_Pin_5) == SET) 
      { 
           //延时1ms 
           GUA_Delay_Ms(1); 
           
           //超时,则直接退出程序 
           if(++nGUA_Timemout > 300) 
           { 
                 GUA_CS1237_GPIO_Out(GUA_OUT_OUT); //切换OUT引脚为输出 
                 GUA_CLK_H; 
                 GUA_OUT_H;                                                         
                 return 1; 
           } 
      }     
      
      //获取24位有效转换 
      for(nGUA_I=0; nGUA_I<24; nGUA_I++) 
      { 
           GUA_CLK_H; 
           GUA_Delay_Us(1); 
           
           nGUA_Data <<= 1; 
           if(GPIO_ReadDataBit(GPIO0, GPIO_Pin_5) == SET) 
                 nGUA_Data++; 
           
           GUA_CLK_L; 
           GUA_Delay_Us(1); 
      } 
      
      //第25~27个脉冲 
      for(nGUA_I=0; nGUA_I<3; nGUA_I++) 
      { 
           GUA_CLK_H; 
           GUA_Delay_Us(1); 
           GUA_CLK_L; 
           GUA_Delay_Us(1); 
      } 
      
      //释放DOUT脚,当下次再被拉低,表明新的数据已经准备好 
      GUA_CS1237_GPIO_Out(GUA_OUT_OUT); //切换OUT引脚为输出 
      GUA_OUT_H;                                                                    
      
      //判断是负数,最高位24位是符号位 
      if(nGUA_Data&0x00800000) 
      { 
           nGUA_Temp = -(((~nGUA_Data)&0x007FFFFF) + 1);//补码变原码 
      } 
      //正数的补码就是源码 
      else 
      { 
           nGUA_Temp = nGUA_Data&0x00ffffff;                             //去除高8位 
      } 
 
      return nGUA_Temp; 

 
//********************************************************************** 
//name:         GUA_CS1237_Init 
//introduce:    CS1237初始化 
//parameter:    none 
//return:       none 
//author:      鼎盛合152
//email:        peakcoo@peakcoo.con
//shop:         www.peakcoo.com
//changetime:   2022.12.29 
//********************************************************************** 
void GUA_CS1237_Init(void) 

      GUA_U8 nGUA_Config = 0;                //读取到的配置数据 
      GUA_U8 nGUA_ADC_Value = 0;  //前期不稳定的adc数据 
      
      //gpio初始化 
      GUA_CS1237_GPIO_Init(); 
      
      //退出低功耗模式 
      GUA_CS1237_ShutDownControl(GUA_SHUTDOWN_OFF);     
      
      //延时,如果不加延时,全速时会写入不正常 
      GUA_Delay_Ms(100); 
      
      //读cs1237配置,默认0x0C,如果写过的就会是0x5C 
      //nGUA_Config = GUA_CS1237_ReadConfig();     
      
      //发送配置 
      //GUA_UART_Send(nGUA_Config); 
      
      //写cs1237配置,写入0x5C 
      GUA_CS1237_WriteConfig(); 
 
      //读cs1237配置,判断是否0x5C写成功,并发给串口 
      nGUA_Config = GUA_CS1237_ReadConfig(); 
      GUA_UART_Send(nGUA_Config); 
      
      //过滤前几次读出的adc,并发给串口 
      for(GUA_U8 i=0; i<20; i++) 
      { 
           nGUA_ADC_Value = GUA_CS1237_ReadADC()>>2;         
           printf("%d 
", nGUA_ADC_Value); 
      }     


如有雷同,联系管理员删除。