一个电位器分为左右两端(H/L)和中间抽头(W),Rtot大约为10kΩ。
中间抽头的位置由一个8位寄存器控制,0~255 对应 L和W之间的电阻0~10kΩ。
一个TPL0102内有A、B两个电位器,分别用两个8位寄存器控制。
A2\A1\A0 分别用于设置器件地址的Bit3\Bit2\Bit1
寄存器地址 |
功能 |
0x00 |
RA寄存器 用于控制电位器A的抽头位置 |
0x01 |
RB寄存器 用于控制电位器B的抽头位置 |
0x02 |
无意义,内容对器件没有影响 |
... |
... |
0x0F |
无意义,内容对器件没有影响 |
0x10 |
ACR 访问控制寄存器 |
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 */