日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/14 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32F407 硬件IIC驱动MCP4017 数字电位器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

STM32F407硬件IIC的應用驅動從機設備

文章目錄

  • STM32F407硬件IIC的應用驅動從機設備
  • 前言
  • 1、STM32F407的硬件IIC使用步驟
    • 1 IIC硬件引腳接口初始化.
  • 2、MCP4017使用說明
    • 2.1 電位器mcp4017地址.
    • 2.1 電位器mcp4017寫時序.
    • 2.2 電位器mcp4017讀時序.
  • 3 注意事項
  • 總結


前言

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_SDAGPIO_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);}

2、MCP4017使用說明

2.1 電位器mcp4017地址.

先看手冊找到設備地址:


從MCP4017手冊中可以看到7位地址是0x27 ,不包括讀寫位.

2.1 電位器mcp4017寫時序.


從圖可看到,主機通過IIC接口向MCP4017 寫一個字節 時序: 從機地址+寫命令+ 要寫的數據.
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 busyI2C_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 failI2C_Send7bitAddress(IIC, devAdder, I2C_Direction_Transmitter);//Timetmp = TimeLimit;//while((--Timetmp)&&(I2C_GetFlagStatus(IIC, I2C_FLAG_ADDR) == RESET));//EV6while((--Timetmp)&&(!I2C_CheckEvent(IIC,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)));//EV6if(Timetmp == 0)return -3;//i2c send address failedI2C_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 STOPI2C_GenerateSTOP(IIC, ENABLE);Timetmp = TimeLimit;while((--Timetmp)&&(I2C_GetFlagStatus(IIC, I2C_FLAG_BUSY)));return 1; }

2.2 電位器mcp4017讀時序.


從圖可看到,主機通過IIC接口向MCP4017 讀一個字節 時序: 從機地址+讀命令 后從機返回讀取的數據.
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 busywhile((--Timetmp)&&(I2C_GetFlagStatus(IIC, I2C_FLAG_BUSY)));if(Timetmp == 0)return -1;//i2c busyI2C_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 eventif(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 eventif(Timetmp == 0)return -7;//i2c reSend address failed//--ready to receive I2C_AcknowledgeConfig(IIC, DISABLE);//just receive one byte ,disable ACKI2C_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 enableI2C_AcknowledgeConfig(IIC, ENABLE);return 1; }

3 注意事項

本項目使用的是MCP4017 不要和MCP40D17搞混了兩者都屬于數字電位器但是兩者的讀寫時序不一樣要注意對照相應的datasheet的時序去修改代碼.否則會讀寫不成功.

總結

以上就是本人調試MCP4017的過程記錄.如有錯誤望指出.

總結

以上是生活随笔為你收集整理的STM32F407 硬件IIC驱动MCP4017 数字电位器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。