CS1232电路与应用


cs1232.h
#ifndef CS1232_H
#define CS1232_H
#include "stm32g0xx_hal.h"
// 引脚定义
#define CS1232_DOUT_PIN GPIO_PIN_1
#define CS1232_DOUT_PORT GPIOA
#define CS1232_SCLK_PIN GPIO_PIN_0
#define CS1232_SCLK_PORT GPIOA
#define CS1232_PDWN_PIN GPIO_PIN_2
#define CS1232_PDWN_PORT GPIOA
// 基础操作宏
#define CS1232_SCLK_H HAL_GPIO_WritePin(CS1232_SCLK_PORT, CS1232_SCLK_PIN, GPIO_PIN_SET)
#define CS1232_SCLK_L HAL_GPIO_WritePin(CS1232_SCLK_PORT, CS1232_SCLK_PIN, GPIO_PIN_RESET)
#define CS1232_DOUT_READ HAL_GPIO_ReadPin(CS1232_DOUT_PORT, CS1232_DOUT_PIN)
#define CS1232_PDWN_H HAL_GPIO_WritePin(CS1232_PDWN_PORT, CS1232_PDWN_PIN, GPIO_PIN_SET)
#define CS1232_PDWN_L HAL_GPIO_WritePin(CS1232_PDWN_PORT, CS1232_PDWN_PIN, GPIO_PIN_RESET)
// 增益配置(硬件已经固定GAIN1/GAIN0,这里只做定义)
typedef enum
{
CS1232_GAIN_1 = 0,
CS1232_GAIN_2 = 1,
CS1232_GAIN_64 = 2,
CS1232_GAIN_128 = 3
} CS1232_Gain_t;
// 函数声明
void CS1232_Init(void);
int32_t CS1232_ReadADC(void);
void CS1232_PowerDown(uint8_t enable);
#endif
cs1232.c
#include "cs1232.h"
/**
* @brief 初始化CS1232(DOUT、SCLK、PDWN)
*/
void CS1232_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
// 使能GPIO时钟
__HAL_RCC_GPIOA_CLK_ENABLE();
// SCLK、PDWN 配置为推挽输出
GPIO_InitStruct.Pin = CS1232_SCLK_PIN | CS1232_PDWN_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// DOUT 配置为输入(带上拉可选,根据需要开启)
GPIO_InitStruct.Pin = CS1232_DOUT_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL; // 或 GPIO_PULLUP
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// 初始状态
CS1232_SCLK_L; // SCLK 必须默认低,防止进入Standby
CS1232_PDWN_H; // 退出掉电模式
}
/**
* @brief 读取一次24位ADC数据
* @retval 有符号24位ADC值
*/
int32_t CS1232_ReadADC(void)
{
uint32_t data = 0;
uint8_t i;
// 1. 等待数据就绪(DOUT拉低)
while(CS1232_DOUT_READ != 0);
// 2. 读取24位数据,高位在前
for(i = 0; i < 24; i++)
{
CS1232_SCLK_H;
data <<= 1;
if(CS1232_DOUT_READ)
{
data |= 0x01;
}
CS1232_SCLK_L;
}
// 3. 手册要求:读完后第25个时钟拉高DOUT,为下一次转换准备
CS1232_SCLK_H;
HAL_Delay_us(1);
CS1232_SCLK_L;
// 4. 将24位无符号数据转为有符号数(补码处理)
int32_t adc_val = (int32_t)(data << 8) >> 8;
return adc_val;
}
/**
* @brief 控制CS1232进入/退出掉电模式
* @param enable: 1=进入掉电,0=退出掉电
*/
void CS1232_PowerDown(uint8_t enable)
{
if(enable)
{
CS1232_PDWN_L;
}
else
{
CS1232_PDWN_H;
}
}
使用示例
#include "cs1232.h"
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
CS1232_Init();
while(1)
{
int32_t adc = CS1232_ReadADC();
// 在这里做去皮、滤波、重量换算
}
}