CS1232电路与应用

CS1232电路与应用

image-20260508133910435

image-20260508133858390

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();
        // 在这里做去皮、滤波、重量换算
    }
}
posted @ 2026-05-08 13:43  Q&25  阅读(23)  评论(3)    收藏  举报