文章目录
一、分析数据手册
1. 确认寄存器
根据数据手册,ISL95311一共有三个寄存器用于完成操作
ACR->控制访问地址
IVR->上电恢复上一次的值
WR->写入数据
当ISL95311上电后,若不操作ACR,即ACR为默认值0x00
读时序访问地址0会得到IVR的值,写时序访问地址0会向IVR及WR写入相同的值
若操作ACR,将其值设置为0x80
读时序访问地址0会得到WR的值,写时序访问地址0只会向WR写入值
写时序访问地址2时控制ACR值
2. 确认访问时序
根据数据手册,I2C七位地址最后一位为读写控制位,A0 A1确认访问的器件地址
3. 确认读写时序
根据数据手册,写时序首先需要输入目标器件地址,然后输入寄存器控制地址,最后输入数值;读时序首先输入目标器件地址及寄存器控制地址,然后输入读指令获取对应寄存器值
二、STM32CubeMX配置
1. 时钟配置
2. I2C配置
3. GPIO配置
ISL95311 A0及A1默认接地
三、驱动编写
1. 添加头文件
创建ISL95311Ctrl.h,添加如下代码
#ifndef __ISL95311_CTRL_H
#define __ISL95311_CTRL_H
#include <stdint.h>
#include "stm32f1xx_hal.h"
#define ISL95311_ADDR 0x28
void ISL95311Ctrl_Init(void);
uint8_t Get_ISL95311_Value(void);
void Set_ISL95311_Value(uint8_t num);
#endif
2. 添加主文件
创建ISL95311Ctrl.c,添加如下代码
#include "ISL95311Ctrl.h"
#include "i2c.h"
void ISL95311Ctrl_Init(void)
{
MX_I2C1_Init();
}
static void ISL95311Ctrl_Write(uint8_t *data, uint16_t len)
{
while(HAL_I2C_Master_Transmit(&hi2c1, (uint16_t)(ISL95311_ADDR << 1), (uint8_t *)data, len, 0xff) != HAL_OK)
{
if(HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)
{
Error_Handler();
}
}
}
static void ISL95311Ctrl_Read(uint8_t *data, uint16_t len)
{
while(HAL_I2C_Master_Receive(&hi2c1, (uint16_t)(ISL95311_ADDR << 1), (uint8_t *)data, len, 0xff) != HAL_OK)
{
if(HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)
{
Error_Handler();
}
}
}
uint8_t Get_ISL95311_Value(void)
{
uint8_t ACR[2] = {0x02, 0x02};
uint8_t WR_Access = 0x00;
uint8_t res = 0;
ISL95311Ctrl_Write(ACR, 2);
ISL95311Ctrl_Write(&WR_Access, 1);
ISL95311Ctrl_Read(&res, 1);
return res;
}
void Set_ISL95311_Value(uint8_t num)
{
uint8_t ACR[2] = {0x02, 0x00};
uint8_t data[2] = {0x00, num};
ISL95311Ctrl_Write(ACR, 2);
ISL95311Ctrl_Write(data, 2);
}
总结
通过以上分析及步骤,我们就完成了ISL95311数字电位器的驱动程序,经测试可正常读写