STM32 CubeMX TPL0102 I2C

接口

STM32 CubeMX TPL0102 I2C_第1张图片STM32 CubeMX TPL0102 I2C_第2张图片

一个电位器分为左右两端(H/L)和中间抽头(W),Rtot大约为10kΩ。

中间抽头的位置由一个8位寄存器控制,0~255 对应 L和W之间的电阻0~10kΩ。

一个TPL0102内有A、B两个电位器,分别用两个8位寄存器控制。

A2\A1\A0 分别用于设置器件地址的Bit3\Bit2\Bit1

STM32 CubeMX TPL0102 I2C_第3张图片

寄存器

STM32 CubeMX TPL0102 I2C_第4张图片

寄存器地址

功能

0x00

RA寄存器  用于控制电位器A的抽头位置

0x01

RB寄存器  用于控制电位器B的抽头位置

0x02

无意义,内容对器件没有影响

...

...

0x0F

无意义,内容对器件没有影响

0x10

ACR 访问控制寄存器

访问控制寄存器(ACR)

STM32 CubeMX TPL0102 I2C_第5张图片

TPL0102_BIT_VOL      7   //W/R   0:保存在IVR(掉电保存)   1:保存在WR(掉电不保存)
TPL0102_BIT_SHDN   6   //W/R   0:关机模式                           1:禁用关机模式
TPL0102_BIT_WIP       5   //R       0:没在写入IVR                     1:正在写入IVR(WIP=1时无法写入WR或ACR)

程序

tpl0102.c

#include "tpl0102.h"
#include 

#include "main.h"
#include "i2c.h"

#include "stm32f1xx_hal_i2c.h"

/*
i2c addr:  1010 (bit2)(bit1)(bit0)(r/w)
write addres:0xa0
read  addres:0xa1

寄存器地址   功能
0x00          RA
0x01          RB
0x03          NULL
...           ...
0x0f          NULL
0x10          ACR
*/

#define _BV(b) (1UL << (b))

#define TPL0102_ADDRESS   0xa0
#define I2C_TIMEOUT       0xff

//TPL0102 Register Addresses
#define TPL0102_REG_RA    0x00
#define TPL0102_REG_RB    0x01
#define TPL0102_REG_ACR   0x10

//TPL0102 Access Control Register Bits (ACR)
#define TPL0102_BIT_VOL   7   //W/R   0:保存在IVR(掉电保存)   1:保存在WR(掉电不保存)
#define TPL0102_BIT_SHDN  6   //W/R   0:关机模式                 1:禁用关机模式
#define TPL0102_BIT_WIP   5   //R     0:没在写入IVR              1:正在写入IVR(WIP=1时无法写入WR或ACR)


void tpl0102_test()
{
  //查询是否有可用的I2C器件 并输出地址
  uint8_t datarecev[4];
  for(uint8_t i=0;i<255;i++)
  {
    HAL_StatusTypeDef re = HAL_I2C_Mem_Read(&hi2c2, i, 0, 
      I2C_MEMADD_SIZE_8BIT, datarecev, 1,0xff);
    if(HAL_OK == re)printf("0x%02x ",i);
    else printf(".");
  }
  printf("\n\n");
}

void tpl0102_set(uint8_t setA, uint8_t setB)
{
  uint8_t configReg = 0;
  configReg &= ~_BV(TPL0102_BIT_VOL);   //0:IVR 掉电保存
  configReg |= _BV(TPL0102_BIT_SHDN);   //1:禁用关机模式
  
  uint8_t dataWrite[3] = {configReg, setA, setB};
  
  HAL_StatusTypeDef re = HAL_I2C_Mem_Write(&hi2c2, TPL0102_ADDRESS, TPL0102_REG_ACR, 
    I2C_MEMADD_SIZE_8BIT, dataWrite, 3,0xff);
}

void tpl0102_get()
{
  uint8_t dataRead[3];
  
  HAL_StatusTypeDef re = HAL_I2C_Mem_Read(&hi2c2, TPL0102_ADDRESS, TPL0102_REG_ACR, 
    I2C_MEMADD_SIZE_8BIT, dataRead, 3,0xff);
  
  printf("0x%02x  0x%02x 0x%02x  \n",*dataRead, *(dataRead+1), *(dataRead+2));
}

uint8_t getWipStatus()
{
  uint8_t regValue;
  HAL_I2C_Mem_Read(&hi2c2,TPL0102_ADDRESS, TPL0102_REG_ACR, 
    I2C_MEMADD_SIZE_8BIT, ®Value,1,I2C_TIMEOUT);
  return (regValue >> TPL0102_BIT_WIP) & 0x01;
}

 

tpl0102.h

#ifndef __tpl0102_H
#define __tpl0102_H
#ifdef __cplusplus
 extern "C" {
#endif

#include "main.h"


void tpl0102_test(void);

void tpl0102_set(uint8_t setA, uint8_t setB);

void tpl0102_get(void);


#ifdef __cplusplus
}
#endif
#endif /*__tpl0102_H */

 

你可能感兴趣的:(stm32)