DS3553驱动

数据手册这是官方文档如有需要在这里查看

一. 简介

  • 3.3V工作电压下功耗

    待机电流:1.8uA

    休眠电流:4uA

    工作电流:28uA

  • 通讯接口

    从I2C接口,标准频率:100khz,快速频率:400khz

  • 中断输出

    中断1:单步脉冲输出

    中断2 :抬手亮屏中断

二. 关键参数

  • I2C地址

image-20251110091215676

  • 通信要求

    image-20251110093425030

    image-20251110091412311

  • 寄存器

  1. 芯片ID寄存器

image-20251110092329177

​

  1. 用户设置寄存器

image-20251110092548071

  1. 步数寄存器

image-20251110093017854

三. 代码

1. i2c

i2c.c

static I2C_HandleTypeDef *s_i2cMap[] = 
{
    [I2C_NUM_1] = &hi2c1, 
    [I2C_NUM_2] = NULL, 
};

/**
 * @brief  i2c发送数据
 * 
 * @param  i2c_num           i2c编号
 * @param  i2c_addr          i2c地址
 * @param  i2c_reg           i2c寄存器地址
 * @param  i2c_addr_len      i2c地址长度
 * @param  tx_data           发送的数据
 * @param  tx_data_len       发送的数据长度        
 * 
 * @retval                   返回是否发送成功
 */
com_status_t i2c_send_data(i2c_num_t i2c_num,
                           uint8_t i2c_addr,
                           uint8_t i2c_reg,
                           uint8_t i2c_addr_len,
                           uint8_t* tx_data, 
                           const uint16_t tx_data_len)
{
  if (NULL == tx_data || 0 == tx_data_len)
  {
    return COM_ERROR;
  }
  if (I2C_MAX_NUM <= i2c_num || NULL == s_i2cMap[i2c_num]) 
  {
    return COM_ERROR;
  }

  if(HAL_OK == HAL_I2C_Mem_Write(s_i2cMap[i2c_num], 
                                 i2c_addr,
                                 i2c_reg,
                                 i2c_addr_len,
                                 tx_data, 
                                 tx_data_len, 
                                 1000))
    return COM_OK;  
  else
    return COM_ERROR;    
}

/**
 * @brief  i2c接收数据
 * 
 * @param  i2c_num           i2c编号
 * @param  i2c_addr          i2c地址
 * @param  i2c_reg           i2c寄存器地址
 * @param  i2c_addr_len      i2c地址长度
 * @param  rx_data           接收数据
 * @param  rx_data           要接收数据长度
 * 
 * @retval                   返回是否接收成功
 */
com_status_t i2c_recv_data(i2c_num_t i2c_num,
                           uint8_t i2c_addr,
                           uint8_t i2c_reg,
                           uint8_t i2c_addr_len,
                           uint8_t* rx_data, 
                           size_t rx_data_len)
{
  if (NULL == rx_data || 0 == rx_data_len)
  {
    return COM_ERROR;
  }
  if (I2C_MAX_NUM <= i2c_num || NULL == s_i2cMap[i2c_num]) 
  {
    return COM_ERROR;
  }

  if(HAL_OK == HAL_I2C_Mem_Read(s_i2cMap[i2c_num],
                                i2c_addr,
                                i2c_reg,
                                i2c_addr_len,
                                rx_data, 
                                rx_data_len, 
                                1000))
  {
    return COM_OK;
  }
  else
    return COM_ERROR;
}

i2c.h

typedef enum 
{
    I2C_NUM_1 = 1,          /* I2C 1       */
    I2C_NUM_2 = 2,          /* I2C 2       */
    I2C_MAX_NUM             /* 最大I2C数量  */
} i2c_num_t;

/**
 * @brief  i2c发送数据
 * 
 * @param  i2c_num           i2c编号
 * @param  i2c_addr          i2c地址
 * @param  i2c_reg           i2c寄存器地址
 * @param  i2c_addr_len      i2c地址长度
 * @param  tx_data           发送的数据
 * @param  tx_data_len       发送的数据长度        
 * 
 * @retval                   返回是否发送成功
 */
com_status_t i2c_send_data(i2c_num_t i2c_num,
                           uint8_t i2c_addr,
                           uint8_t i2c_reg,
                           uint8_t i2c_addr_len,
                           uint8_t* tx_data, 
                           const uint16_t tx_data_len);

/**
 * @brief  i2c接收数据
 * 
 * @param  i2c_num           i2c编号
 * @param  i2c_addr          i2c地址
 * @param  i2c_reg           i2c寄存器地址
 * @param  i2c_addr_len      i2c地址长度
 * @param  rx_data           接收数据
 * @param  rx_data           要接收数据长度
 * 
 * @retval                   返回是否接收成功
 */
com_status_t i2c_recv_data(i2c_num_t i2c_num,
                           uint8_t i2c_addr,
                           uint8_t i2c_reg,
                           uint8_t i2c_addr_len,
                           uint8_t* rx_data, 
                           size_t rx_data_len);

2. DS3553

Int_DS3553.c

#include "Int_DS3553.h"

/**
 * @brief  DS355 获取步数
 * 
 * @param  step_cnt          返回获取的步数
 * 
 * @return 是否获取成功
 */
 com_status_t Int_DS3553_get_step_cnt(uint32_t *step_cnt)
 {
    uint8_t rx_buf[3];
    memset(rx_buf, 0, 3);

    DS3553_CS_L;
    Com_delay_ms(10);
    /* 读取 CHIP ID */
    if(COM_OK == i2c_recv_data(DS3553_I2C_NUM, 
                               DS3553_I2C_READ_ADDR, 
                               DS3553_STEP_CNT_L_REG, 
                               I2C_MEMADD_SIZE_8BIT,
                               rx_buf,
                               3))
    {
        DS3553_CS_H;
        *step_cnt = (rx_buf[2] << 16) | (rx_buf[1] << 8) | rx_buf[0];

        debug_println("DS3553 STEP CNT: %d", *step_cnt);
        Com_delay_ms(10);
        return COM_OK;
    }    

    DS3553_CS_H;
    Com_delay_ms(10);
    return COM_ERROR;
 }
/**
 * @brief  DS3553 初始化
 * 
 * @param  无
 * 
 * @return 无
 */
void DS3553_Init(void)
{
    uint8_t reg_data = 0;

    /* 读取 CHIP ID */
    i2c_recv_data(DS3553_I2C_NUM, 
                  DS3553_I2C_READ_ADDR, 
                  DS3553_CHIP_ID_REG, 
                  I2C_MEMADD_SIZE_8BIT,
                  &reg_data,
                  1);

    debug_println("DS3553 CHIP ID: 0x%02X", reg_data);

    /* 设置用户寄存器 */
    reg_data = 0x12;
    i2c_send_data(DS3553_I2C_NUM, 
                  DS3553_I2C_WRITE_ADDR, 
                  DS3553_USER_SET_REG, 
                  I2C_MEMADD_SIZE_8BIT,
                  &reg_data,
                  1);
}

Int_DS3553.h

#ifndef INT_DS3553_H
#define INT_DS3553_H

#include <stdio.h>
#include "stdlib.h"  

#include "stm32f1xx_hal.h"
#include "i2c.h"
#include "gpio.h"

#include "Com_Debug.h"
#include "Com_tool.h"
#include "Com_config.h"

/* DS3553 I2C 号         */
#define DS3553_I2C_NUM             I2C_NUM_1
/* DS3553 I2C 地址       */
#define DS3553_I2C_ADDR            0x4E
/* DS3553 I2C 读地址     */
#define DS3553_I2C_READ_ADDR       (DS3553_I2C_ADDR | 0x01)
/* DS3553 I2C 写地址     */
#define DS3553_I2C_WRITE_ADDR      (DS3553_I2C_ADDR | 0x00)
/* DS3553 I2C 寄存器地址 */
#define DS3553_CHIP_ID_REG         0x01
#define DS3553_USER_SET_REG        0xC3
#define DS3553_STEP_CNT_L_REG      0xC4
#define DS3553_STEP_CNT_M_REG      0xC5
#define DS3553_STEP_CNT_H_REG      0xC6

/**
 * @brief DS3553 初始化
 * 
 * @param 无
 * 
 * @return 无
 */
void DS3553_Init(void);

/**
 * @brief  DS355 获取步数
 * 
 * @param  step_cnt          返回获取的步数
 * 
 * @return 是否获取成功
 */
 com_status_t Int_DS3553_get_step_cnt(uint32_t *step_cnt);

#endif

posted @ 2025-11-10 12:11  2666666  阅读(60)  评论(0)    收藏  举报