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);
}
}
如有雷同,联系管理员删除。