DS3553驱动
数据手册这是官方文档如有需要在这里查看
一. 简介
-
3.3V工作电压下功耗
待机电流:1.8uA
休眠电流:4uA
工作电流:28uA
-
通讯接口
从I2C接口,标准频率:100khz,快速频率:400khz
-
中断输出
中断1:单步脉冲输出
中断2 :抬手亮屏中断
二. 关键参数
- I2C地址

-
通信要求


-
寄存器
- 芯片ID寄存器

- 用户设置寄存器

- 步数寄存器

三. 代码
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,
®_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,
®_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

浙公网安备 33010602011771号