打印
[STM32F4]

STM32F407 硬件IIC驱动MCP4017 数字电位器

[复制链接]
1418|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
前言

MCP4017是一款可以通过IIC接口进行配置的可调电位器,此电位器有128个可配值.因为项目需要我们需要使用MCP4017调节电阻值.来作为其他部分电路的外围电路部分,可在调试的时候灵活配置.
1、STM32F407的硬件IIC使用步骤
1 IIC硬件引脚接口初始化.

首先需要初始化IIC引脚的SCK 和SDA 的模式为GPIO_Mode_AF,然后需要初始化IIC的配置寄存器,此过程固件库已经帮忙封装成接口,我们只需要调用接口配置即可.我们需要深入了解底层原理,可通过STM32f407手册对照相关寄存器理解硬件电路.

void I2C3_Init(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;
    I2C_InitTypeDef I2C_InitStructure;
    RCC_ClocksTypeDef   rcc_clocks;

    /* GPIO Peripheral clock enable */
    RCC_AHB1PeriphClockCmd(IIC_SDA_GPIO_CLK|IIC_SCL_GPIO_CLK, ENABLE);
    /*i2c3 Peripheral clock enable */
    RCC_APB1PeriphClockCmd(IIC_CLK, ENABLE);
   

    /*I2C3 configuration*/
    GPIO_PinAFConfig(IIC_SDA_PORT, IIC_SDA_PINSOURCE, IIC_SDA_AF);
    GPIO_PinAFConfig(IIC_SCL_PORT, IIC_SCL_PINSOURCE, IIC_SCL_AF);

    // Pc9: I2C_SDA
    GPIO_InitStructure.GPIO_Pin = IIC_SDA_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
    GPIO_Init(IIC_SDA_PORT, &GPIO_InitStructure);

        //PA8: I2C_SCL
    GPIO_InitStructure.GPIO_Pin = IIC_SCL_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
    GPIO_Init(IIC_SCL_PORT, &GPIO_InitStructure);

    /* I2C Struct Initialize */
    I2C_DeInit(IIC);
    I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
    I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
    I2C_InitStructure.I2C_OwnAddress1 = 0x01;
    I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
    I2C_InitStructure.I2C_ClockSpeed = 50000;
    I2C_InitStructure.I2C_AcknowledgedAddress =          I2C_AcknowledgedAddress_7bit;
    I2C_Init(IIC, &I2C_InitStructure);

    /* I2C Initialize */
    I2C_Cmd(IIC, ENABLE);
          I2C_AcknowledgeConfig(IIC, ENABLE);


}




使用特权

评论回复
沙发
发给她更好fh|  楼主 | 2023-3-29 12:36 | 只看该作者
2、MCP4017使用说明
2.1 电位器mcp4017地址.

  先看手册找到设备地址:

    1



从MCP4017手册中可以看到7位地址是0x27 ,不包括读写位.

使用特权

评论回复
板凳
发给她更好fh|  楼主 | 2023-3-29 12:38 | 只看该作者
2.1 电位器mcp4017写时序.

从图可看到,主机通过IIC接口向MCP4017 写一个字节 时序: 从机地址+写命令+ 要写的数据.

使用特权

评论回复
地板
发给她更好fh|  楼主 | 2023-3-29 12:38 | 只看该作者
STM32F407作为主机写的代码如下所示:
以下代码经验证可以正常写数据到MCP4017.


static uint32_t GetI2C3TimeLimit(void)
{
        RCC_ClocksTypeDef RCC_Clocks;
        RCC_GetClocksFreq(&RCC_Clocks);
        return RCC_Clocks.SYSCLK_Frequency/10000;
}
int32_t IIC3_WriteOneByte(uint8_t devAdder,  uint8_t value)
{
        uint32_t TimeLimit     = GetI2C3TimeLimit();
        uint32_t Timetmp            = TimeLimit;
       

        while((--Timetmp)&&(I2C_GetFlagStatus(IIC, I2C_FLAG_BUSY)));
        if(Timetmp == 0)
                return -1;//i2c busy
         
        I2C_GenerateSTART(IIC, ENABLE);
        Timetmp            = TimeLimit;

        while((--Timetmp)&&(!I2C_CheckEvent(IIC,I2C_EVENT_MASTER_MODE_SELECT)));//EV5

        //while((--Timetmp)&&(I2C_GetFlagStatus(IIC, I2C_FLAG_SB) == RESET));//EV5  
        if(Timetmp == 0)
                return -2;//i2c send start fail
       
        I2C_Send7bitAddress(IIC, devAdder, I2C_Direction_Transmitter);//
        Timetmp            = TimeLimit;

        //while((--Timetmp)&&(I2C_GetFlagStatus(IIC, I2C_FLAG_ADDR) == RESET));//EV6
        while((--Timetmp)&&(!I2C_CheckEvent(IIC,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)));//EV6
        if(Timetmp == 0)

                return -3;//i2c send address failed
       
       

        I2C_SendData(IIC, value);
        Timetmp            = TimeLimit;
        while((--Timetmp)&&(!I2C_CheckEvent(IIC,I2C_EVENT_MASTER_BYTE_TRANSMITTED)));//
        if(Timetmp == 0)
                return -6;//i2c send data failed
       
        //--SEND STOP
        I2C_GenerateSTOP(IIC, ENABLE);
        Timetmp            = TimeLimit;
        while((--Timetmp)&&(I2C_GetFlagStatus(IIC, I2C_FLAG_BUSY)));
       
        return 1;
}

使用特权

评论回复
5
发给她更好fh|  楼主 | 2023-3-29 12:39 | 只看该作者
2.2 电位器mcp4017读时序.


从图可看到,主机通过IIC接口向MCP4017 读一个字节 时序: 从机地址+读命令 后从机返回读取的数据.

使用特权

评论回复
6
发给她更好fh|  楼主 | 2023-3-29 12:40 | 只看该作者
STM32F407作为主机读的代码如下所示:

int32_t IIC3_ReadOneByte(uint8_t devAdder, uint8_t *data) // is used  only  for mcp4017 read timing
{
    uint32_t TimeLimit     = GetI2C3TimeLimit();
        uint32_t Timetmp            = TimeLimit;
       
        //--Whether the status is busy
        while((--Timetmp)&&(I2C_GetFlagStatus(IIC, I2C_FLAG_BUSY)));
        if(Timetmp == 0)
                return -1;//i2c busy
       
        I2C_GenerateSTART(IIC, ENABLE);//after send start bit ,automaticlly switch to master mod .
        Timetmp            = TimeLimit;
        while((--Timetmp)&&(!I2C_CheckEvent(IIC,I2C_EVENT_MASTER_MODE_SELECT)));// EV5 event
        if(Timetmp == 0)
                return -6;//i2c reSend start fail
       
        //--send 7bit address (receive/read mod)
        I2C_Send7bitAddress(IIC, devAdder, I2C_Direction_Receiver);//
        Timetmp            = TimeLimit;
        while((--Timetmp)&&(!I2C_CheckEvent(IIC,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)));//EV6 event
        if(Timetmp == 0)
                return -7;//i2c reSend address failed
       
        //--ready to receive
        I2C_AcknowledgeConfig(IIC, DISABLE);//just receive one byte ,disable ACK
        I2C_GenerateSTOP(IIC, ENABLE);
        Timetmp            = TimeLimit;
        while((--Timetmp)&&(!I2C_CheckEvent(IIC,I2C_EVENT_MASTER_BYTE_RECEIVED)));//EV7事件
        if(Timetmp == 0)
                return -8;//i2c no received
       
       
        *data = I2C_ReceiveData(IIC);//save data

        //--ACK enable
        I2C_AcknowledgeConfig(IIC, ENABLE);
       
        return 1;
}

使用特权

评论回复
7
发给她更好fh|  楼主 | 2023-3-29 12:50 | 只看该作者
3 注意事项

本项目使用的是MCP4017 不要和MCP40D17搞混了两者都属于数字电位器但是两者的读写时序不一样要注意对照相应的datasheet的时序去修改代码.否则会读写不成功.
总结

以上就是本人调试MCP4017的过程记录.如有错误望指出.

使用特权

评论回复
8
zhuhuis| | 2023-3-29 19:15 | 只看该作者
怎么可能

使用特权

评论回复
9
bqyj| | 2023-3-29 19:18 | 只看该作者
别打击楼主,万一真是他写的呢

使用特权

评论回复
10
jiahy| | 2023-3-29 19:20 | 只看该作者
你都说万一了,哈哈

使用特权

评论回复
11
Clyde011| | 2024-1-27 13:24 | 只看该作者

脉冲变压器的原/副边相位关系,

使用特权

评论回复
12
万图| | 2024-1-27 15:20 | 只看该作者

还有另一种技术正在变得普遍

使用特权

评论回复
13
Uriah| | 2024-1-27 16:23 | 只看该作者

测试结果可能包括输出电压和电流、电压波浪、效率、负载能力等指标

使用特权

评论回复
14
Uriah| | 2024-1-27 16:23 | 只看该作者

测试结果可能包括输出电压和电流、电压波浪、效率、负载能力等指标

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

37

主题

546

帖子

1

粉丝