数字电位器mcp4017驱动调试记录---stm32f072,I2C2

本文介绍使用STM32通过I2C接口控制MCP4017电位器的方法,详细阐述了I2C配置、读写操作及代码实现,适用于嵌入式硬件开发人员。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

电位器mcp4017要比4561驱动简单,先看手册找到设备地址:

看读写时序发现没有寄存器地址什么的,直接是设备地址+读写命令+data

写一个字节:设备地址+写命令+要写的数据

实际波形:写数据20h

附上代码:i2c2.c

#include "i2c2.h"

uint32_t I2C_Timeout;

/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/

/*f042的PB10 PB11是I2C1,F072的PB10 PB11是I2C2*/
void I2C2_GPIO_Configuration(void)
{
  GPIO_InitTypeDef  GPIO_InitStruct; 
	
	/* Enable  GPIOA clock */
	  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);	

  /*!< GPIO configuration */  
  /*!< Configure sEE_I2C pins: SCL */
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_Level_3;
  GPIO_InitStruct.GPIO_OType = GPIO_OType_OD;
  GPIO_Init(GPIOB , &GPIO_InitStruct);
  
  /*!< Configure sEE_I2C pins: SDA */
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_11;
  GPIO_Init(GPIOB , &GPIO_InitStruct);
	
 /* Connect PXx to I2C_SCL*/
  GPIO_PinAFConfig( GPIOB , GPIO_PinSource10, GPIO_AF_1); 
  /* Connect PXx to I2C_SDA*/
   GPIO_PinAFConfig( GPIOB ,GPIO_PinSource11, GPIO_AF_1); 
}
/**
  * @brief  I2C接口初始化
  *         初始化为I2C1主机,7位地址模式,启用模拟滤波器,停用数字滤波器,
  *         启用应答,I2C传输速度100KHz
  * @param  无
  * @retval 无
  */
void I2C2_Init_Config(void)
{
  I2C_InitTypeDef I2C_InitStructure;
  
 // RCC_I2CCLKConfig(RCC_I2C1CLK_SYSCLK);
  
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE);
  
  I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
  I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
  I2C_InitStructure.I2C_AnalogFilter = I2C_AnalogFilter_Enable;
  I2C_InitStructure.I2C_DigitalFilter = 0x01;
  I2C_InitStructure.I2C_OwnAddress1 = 0x00;
  I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
  I2C_InitStructure.I2C_Timing = 0x30E32E44;
  I2C_Init(I2C2, &I2C_InitStructure);
  
  I2C_Cmd(I2C2, ENABLE);
}
void I2C2_init(void)
{
  I2C2_GPIO_Configuration();
	I2C2_Init_Config();
}
/**
  * @brief  从I2C1总线上的某一器件的某一起始地址中读取一定字节的数据到数组中
  * @param  driver_Addr:I2C器件地址
  * @param  start_Addr:起始字节地址(4017没用到,调用的时候写的是0,也可以直接去掉)
  * @param  number_Bytes:要读取的字节数量(小于一页)
  * @param  read_Buffer:存放读取数据的数组指针
  * @retval 是否读取成功
  */
I2C_Status I2C2_Read_NBytes(uint8_t driver_Addr, uint8_t start_Addr, uint8_t number_Bytes, uint8_t *read_Buffer)
{
  uint8_t read_Num;
  
  I2C_Timeout = I2C_TIMEOUT;
  while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY) != RESET)
  {
    if((I2C_Timeout--) == 0)
    {
      return I2C_FAIL;
    }
  }
   
  I2C_TransferHandling(I2C2, driver_Addr, number_Bytes,  I2C_AutoEnd_Mode, I2C_Generate_Start_Read);//读命令
  
  for(read_Num = 0; read_Num < number_Bytes; read_Num++)
  {
    I2C_Timeout = I2C_TIMEOUT;
    while(I2C_GetFlagStatus(I2C2, I2C_FLAG_RXNE) == RESET)
    {
      if((I2C_Timeout--) == 0)
      {
        return I2C_FAIL;
      }
    }
    
    read_Buffer[read_Num] = I2C_ReceiveData(I2C2);
  }
  
  I2C_Timeout = I2C_TIMEOUT;
  while(I2C_GetFlagStatus(I2C2, I2C_FLAG_STOPF) == RESET)
  {
    if((I2C_Timeout--) == 0)
    {
      return I2C_FAIL;
    }
  }

  return I2C_OK;
}

/**
  * @brief  从I2C1的总线上的某一器件的某一起始地址中读取一定字节的数据到数组中
  * @param  driver_Addr:I2C器件地址
  * @param  start_Addr:起始字节地址(4017没用到,调用的时候写的是0)
  * @param  number_Bytes:要读取的字节数量(小于一页)
  * @param  write_Buffer:存放读取数据的数组指针
  * @retval 是否读取成功
  */
I2C_Status I2C2_Write_NBytes(uint8_t driver_Addr, uint8_t start_Addr, uint8_t number_Bytes, uint8_t *write_Buffer)
{
  uint8_t write_Num;
  
  I2C_Timeout = I2C_TIMEOUT;
  while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY) != RESET)
  {
    if((I2C_Timeout--) == 0)
    {
      return I2C_FAIL;
    }
  }
  
  I2C_TransferHandling(I2C2, driver_Addr, 1, I2C_Reload_Mode, I2C_Generate_Start_Write);//写设备地址
  
  I2C_Timeout = I2C_TIMEOUT;
  while(I2C_GetFlagStatus(I2C2, I2C_FLAG_TXIS) == RESET)
  {
    if((I2C_Timeout--) == 0)
    {
      return I2C_FAIL;
    }
  }

  I2C_TransferHandling(I2C2, driver_Addr, number_Bytes, I2C_AutoEnd_Mode, I2C_No_StartStop);//
  
  for(write_Num = 0; write_Num < number_Bytes; write_Num++)
  {
    I2C_Timeout = I2C_TIMEOUT;
    while(I2C_GetFlagStatus(I2C2, I2C_FLAG_TXIS) == RESET)
    {
      if((I2C_Timeout--) == 0)
      {
        return I2C_FAIL;
      }
    }
    
    I2C_SendData(I2C2, write_Buffer[write_Num]);
  }

  I2C_Timeout = I2C_TIMEOUT;
  while(I2C_GetFlagStatus(I2C2, I2C_FLAG_STOPF) == RESET)
  {
    if((I2C_Timeout--) == 0)
    {
      return I2C_FAIL;
    }
  }
  
  
  return I2C_OK;
}

#define MCP4017_adr  0x5e

uint8_t BMP085_Temperature_Data_Buffer[5];
/****************************************************************************************************
函 数 名:read_mcp4561
函数说明:读寄存器值,读一个字节
输入形参:无
*****************************************************************************************************/
void read_mcp4017(void)
{
	uint8_t BMP085_TEMPERATURE_NUMBER = 1;
  if(I2C2_Read_NBytes(MCP4017_adr, 0, BMP085_TEMPERATURE_NUMBER, BMP085_Temperature_Data_Buffer) == I2C_FAIL)
  {
    
  }  
}
/****************************************************************************************************
函 数 名:write_mcp4561
函数说明:写寄存器值
输入形参:要写入的数组

*****************************************************************************************************/
void write_mcp4017(uint8_t *write_Buffer)
{

	if(I2C2_Write_NBytes(MCP4017_adr,0,1,write_Buffer)== I2C_FAIL )
	{
		if(I2C2_Write_NBytes(MCP4017_adr,0,1,write_Buffer)== I2C_FAIL )
		{}			
	}

}

i2c2.h

#ifndef __I2C1_H
#define __I2C1_H

/* Includes ------------------------------------------------------------------*/
#include "stm32f0xx.h"

/* Exported types ------------------------------------------------------------*/
typedef enum
{
  I2C_OK                                          = 0,
  I2C_FAIL                                        = 1
}I2C_Status;

/* Exported constants --------------------------------------------------------*/
#define I2C_TIMING                                0x00210507
#define I2C_TIMEOUT                               0x1000

/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */
void I2C2_init(void);
I2C_Status I2C2_Read_NBytes(uint8_t driver_Addr, uint8_t start_Addr, uint8_t number_Bytes, uint8_t *read_Buffer); 
I2C_Status I2C2_Write_NBytes(uint8_t driver_Addr, uint8_t start_Addr, uint8_t number_Bytes, uint8_t *write_Buffer); 
void read_mcp4017(void);
void write_mcp4017(uint8_t *write_Buffer);

#endif

应用:

BMP085_write_Data_Buffer[0] =0x20;

write_mcp4017(BMP085_write_Data_Buffer);    
Delay_ms(12);            
read_mcp4017();    

STM32微控制器上实现I&sup2;C接口驱动数字电位器,通常涉及硬件配置和软件编程两个主要部分。STM32系列微控制器支持硬件I&sup2;C通信模块,可以方便地与支持I&sup2;C协议的外围设备(如数字电位器)进行通信。 以下是一个基于STM32 HAL库的示例代码,展示了如何使用I&sup2;C接口驱动数字电位器(以MCP4131为例)。该示例假设已经正确配置了I&sup2;C外设和GPIO引脚。 ### 硬件准备 - STM32微控制器(例如STM32F4系列) - 数字电位器(如MCP4131) - I&sup2;C接口连接:SCL和SDA引脚连接到STM32的I&sup2;C接口 ### 示例代码 ```c #include "main.h" #include <string.h> // MCP4131 I2C地址 #define MCP4131_ADDRESS 0x2F << 1 // MCP4131的7位地址为0x2F,左移一位为8位地址格式 // MCP4131命令定义 #define WRITE_COMMAND 0x00 // 写入数据命令 // 函数:设置电位器阻值 void MCP4131_SetResistance(uint8_t resistanceValue) { uint8_t data[2]; data[0] = WRITE_COMMAND; // 命令字节 data[1] = resistanceValue; // 要写入的电阻值(0-255) // 使用HAL库的I2C_Master_Transmit函数发送数据 HAL_I2C_Master_Transmit(&hi2c1, MCP4131_ADDRESS, data, sizeof(data), HAL_MAX_DELAY); } int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_I2C1_Init(); // 初始化I2C1 // 设置电位器阻值为128(中间值) MCP4131_SetResistance(128); while (1) { // 主循环 } } ``` ### 初始化I&sup2;C的函数(MX_I2C1_Init) 以下是一个I&sup2;C初始化函数的示例,通常由STM32CubeMX生成: ```c void MX_I2C1_Init(void) { hi2c1.Instance = I2C1; hi2c1.Init.ClockSpeed = 100000; // I2C时钟速度为100kHz hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2; hi2c1.Init.OwnAddress1 = 0; hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; hi2c1.Init.OwnAddress2 = 0; hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; HAL_I2C_Init(&hi2c1); } ``` ### 说明 - **MCP4131** 是一款通过I&sup2;C接口控制的数字电位器,支持0-255的电阻值调节。 - **HAL_I2C_Master_Transmit** 是STM32 HAL库提供的用于I&sup2;C主设备发送数据的函数。 - **I&sup2;C时钟速度** 可以根据具体应用需求进行调整,标准模式为100kHz,快速模式为400kHz。 ### 注意事项 - 确保I&sup2;C总线上的上拉电阻已正确连接,以保证I&sup2;C通信的稳定性。 - 根据所使用的STM32型号和开发环境,可能需要调整GPIO引脚配置和I&sup2;C初始化参数。 - 如果使用不同的数字电位器(如AD5171、DS1804等),需要查阅对应的数据手册,确保命令格式和地址正确。 ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值