首页 > 其他分享 >STM32---I2C通讯

STM32---I2C通讯

时间:2023-10-11 12:12:50浏览次数:43  
标签:--- STM32 InitStructure IIC GPIO CheckEvent I2C I2C2

STM32的I2C通讯可以使用两种方式实现,分别是软件I2C,和硬件I2C。软件I2C主要是通过代码手动翻转电平来模拟时序;硬件I2C主要使用通过STM32自带的硬件外设实现。以下,我着重讲述一下硬件I2C的部分。

 

想要使用硬件I2C,主要分为以下四个步骤:

第一步,开启GPIO和I2C的时钟

跟GPIO一样,I2C需要开启时钟。

 

第二步,把IIC对应的GPIO口初始化成-复用开漏模式-

使用硬件I2C时,一般都是将引脚设置为复用开漏模式。

 

第三步,使用结构体配置IIC

跟GPIO一样,I2C也有结构体,通过配置结构体来确认I2C的通讯参数。

 

第四步,I2C_CMD使能硬件I2C

使能硬件I2C。

 

好了,现在我们知道具体的步骤了,具体讲述以下几个I2C常用的函数。

/* ---------------------------------------------- 常用I2C函数 ----------------------------------------------  */
void I2C_GenerateStart()//IIC产生起始条件
/* 具体可以查看手册  CR1_START位 */

void I2C_GenerateStop()//IIC产生终止条件
/* 具体可以查看手册 CR1_STOP位 */

void I2C_AcknowledeConfig()//配置IIC的应答使能
/* 具体可以查看手册 CR1_ACK位 */

void I2C_SendData()//用于传输IIC数据
/* 具体可以查看手册 DR寄存器
DR(数据寄存器)的-发送器模式-

*/

uint8_t I2C_ReceiveData ()//接受IIC传输的数据
/* 具体可以查看手册 DR寄存器
DR(数据寄存器)的-接收器模式-

*/

I2C_Send7bitAddress()//IIC发送7位地址
/* 设置了地址最低位

如果地址最低位为1-就是读
如果地址最低位为0-就是写

*/

 

既然知道了这几个函数,但是怎么去判断函数有没有执行(怎么去判断函数执行到了哪里)。这时,我们可以通过使用状态检测函数来识别当前状态,以便捕捉到I2C的时序。

 

/* ---------------------------------------------- IIC状态检测函数 ----------------------------------------------  */

 

Basic State Monitoring//基本状态监控-通过检测寄存器的状态,来判断当前状态


I2C_CheckEvent ()//同时判断一个或多个标志位,来确定EV_X是否发生

FlagStatus I2C_GetFlagStatus()//获取IIC标志位
void I2C_ClearFlag()//清除IIC标志位
FlagStatus I2C_GetITFlagStatus()//获取IIC中断标志位
void I2C_ClearITPendingBit()//清除IIC中断标志位

 

/* ---------------------------------------------- 硬件IIC代码----------------------------------------------  */

 

既然知道了如何进行I2C通讯,那么就开始写代码吧,一下是硬件I2C的代码部分

I2C_Init(){


RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2 ,ENABLE);//开启I2C外设的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB ,ENABLE);//开启GPIOB的时钟


GPIO_TypeDef GPIO_InitStructure ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;//复用开漏模式
GPIO_InitStructure.GPIO_Pin =GPIO_PIN_10|GPIO_PIN_11;//pin10和pin11
GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHZ;//50MHZ
GPIO(GPIO_B ,&GPIO_InitStructure);


I2C_InitTypeDef I2C_InitStructure ;
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C ;//IIC模式-I2CI2C模式; SMBusDevice-SMBus总线的设备; SMBusHost-SMBus总线的主机;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable ;//应答位配置,默认是应答的。
I2C_InitStructure.I2C_ClockSpeed =50000 ;//时钟频率 ,必须是400kHZ以下的速度。
I2C_InitStructure.I2C_DutyCycle =I2C_DutyCycle_2;时钟占空比,只有进入到快速状态时才有用 100kHZ -40kHZ。小于100kHZ占空比是1:1
I2C_InitStructure.I2C_AcknowledgeAddress =I2C_AcknowledgeAddress_7bit ;//STM32作为从机,可以相应几位的地址。
I2C_InitStructure.I2C_OwnAddress1 = 0x00 ;

I2C_Init(I2C2 , &I2C_InitStructure);
I2C_Cmd (I2C2 ,Enable);

}

void I2C_Wirte (Uint8_t RegAddress,Uint8_t Data ){

I2C_GenerateStart(I2C2 ,ENABLE );//起始
While (I2C_CheckEvent (I2C2,I2C_EVENT_MASTER_MODE_SELECT)!=SUCCESS);//等待EV5事件发生

I2C_Send7bitAddress(I2C2 , MPU6050_Address , I2C_Direction_Transmitter);//发送7位地址主机地址
While (I2C_CheckEvent (I2C2,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)!=SUCCESS);//等待EV6事件发生
I2C_SendData(I2C2, RegAddress);
While (I2C_CheckEvent (I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTING)!=SUCCESS);//等待EV8事件发生

I2C_SendData(I2C2,Data);
While (I2C_CheckEvent (I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTED)!=SUCCESS);//等待EV8_2事件发生,终止
I2C_GenerateStop(I2C2 ,ENABLE);


}

Uint8_t I2C_Read (Uint8_t RegAddress){

I2C_GenerateStart(I2C2 ,Enable );//起始
While (I2C_CheckEvent (I2C2,I2C_EVENT_MASTER_MODE_SELECT)!=SUCCESS);//等待EV5事件发生

I2C_Send7bitAddress(I2C2 , MPU6050_Address , I2C_Direction_Transmitter);//发送7位地址
While (I2C_CheckEvent (I2C2,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)!=SUCCESS);//等待EV6事件发生
I2C_SendData(I2C2, RegAddress);
While (I2C_CheckEvent (I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTED)!=SUCCESS);//等待EV8事件发生

I2C_GenerateStart(I2C2 ,Enable );//起始
While (I2C_CheckEvent (I2C2,I2C_EVENT_MASTER_MODE_SELECT)!=SUCCESS);//等待EV5事件发生

I2C_Send7bitAddress(I2C2 , MPU6050_Address , I2C_Direction_Receiver);//发送7位地址从机地址
While (I2C_CheckEvent (I2C2,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)!=SUCCESS);//等待从机EV6事件发生
//接收一个数据之前就要提前设置好ACK位和STOP位

I2C_AcknowledeConfig(I2C2, DISABLE);
I2C_GenerateStop(I2C2 ,ENABLE);


While (I2C_CheckEvent (I2C2,I2C_EVENT_MASTER_BYTE_RECEIVED)!=SUCCESS);//等待从机EV6_1事件发生
DATA = I2C_ReceiveData(I2C2);
I2C_AcknowledeConfig(I2C2, ENABLE);

return DATA;

}

 

以上,如有错误,请帮忙指正。

 

标签:---,STM32,InitStructure,IIC,GPIO,CheckEvent,I2C,I2C2
From: https://www.cnblogs.com/xuegaogao/p/17745418.html

相关文章

  • KBU810-ASEMI高性能整流桥KBU810
    编辑:llKBU810-ASEMI高性能整流桥KBU810型号:KBU810品牌:ASEMI封装:KBU-4恢复时间:>50ns正向电流:8A反向耐压:1000V芯片个数:4引脚数量:4类型:整流桥、功率整流器件特性:功率整流器件、高性能整流桥浪涌电流:200A正向压降:1.10V封装尺寸:如图工作温度:-55°C~150°CKBU810特性超......
  • 为什么 CSS flex 布局中没有 `justify-items` 和 `justify-self`?
    为什么CSSflex布局中没有justify-items和justify-self?为什么在CSSflex布局中存在align-items和align-self,却没有justify-items和justify-self呢?要解答这个问题,首先需要理解主轴(mainaxis)和交叉轴(crossaxis)之间的差异。1.主轴和交叉轴的区别在没有折行的情况......
  • LAS Spark 在 TPC-DS 的优化揭秘
    更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群文章主要介绍了火山引擎湖仓一体分析服务LASSpark(下文以LASSpark指代)在TPC-DS上的性能突破与优化策略。TPC-DS是一个模拟复杂数据仓库环境的测试基准,LASSpark通过采用规则优化、缓......
  • MySQL--索引
    MySQL--索引索引概述索引是帮助MySQL高效获取数据的数据结构(有序)演示使用全表扫描性能极低使用二叉搜索树更高效优缺点索引结构B+Tree索引Hash索引R-Tree(空间索引)Full-text(全文索引)存储引擎支持情况平常所说的索引都是指的B+树索引二叉树B-Tree(多路......
  • element 的 el-cascader 控件,去掉空子集
    后端返回的树结构数据: template:<el-cascaderv-model="ruleForm.columnAll":options="allColumnData":props="{value:'columnId',label:'columnName',children:'children'}"/> methods://获取......
  • vite.config.js base 与 vue-router base
    vite.config.jsbase决定了打包后,资源引用的前缀base:'/hlw/'linkref='/hlw/assets'打包后的dist要放到/hlw路径下base的值与process.env.BASE_URL、import.meta.env.BASE_URL一致vuerouter的base决定了,多页面的访问路径当vite.config.js与router中的base......
  • winform-RichTextBox控件(有格式文本控件)
    RichTextBox控件用于显示、输入和操作带有格式的文本   除了执行TextBox控件的所有功能外,还可以显示字体、颜色和链接 1、在RichTextBox控件中显示滚动条  2、在RichTextBox控件中设置字体属性 3、将RichTextBox控件显示为超链接样式 4、在RichTextBox控件......
  • 私密离线聊天新体验!llama-gpt聊天机器人:极速、安全、搭载Llama 2
    “私密离线聊天新体验!llama-gpt聊天机器人:极速、安全、搭载Llama2,尽享CodeLlama支持!”一个自托管的、离线的、类似chatgpt的聊天机器人。由美洲驼提供动力。100%私密,没有数据离开您的设备。Demohttps://github.com/getumbrel/llama-gpt/assets/10330103/5d1a76b8-ed03-4a51-9......
  • mountpoint-s3 ga 并提供了安装包
    mountpoint-s3就在最近ga了,同时还提供了rpm以及deb包,可以方便安装使用安装直接下载对应的包,安装就可以了,比如下载rpm的然后yuminstall就可以了,但是因为默认没有systemd管理,需要自己配置参考使用环境配置version:"3"services:s3:image:......
  • Matlab-数据拟合子程序
    可自行设置拟合多项式形式直接调用即可调用格式:[PPb5_xi,PPb5_yi]=Poly_Drizzly(PPb5_x,PPb5_y);子程序:function[xi,yi]=Poly_Drizzly(x,y)%已知函数,'independent',自变量名,'coefficients',{变量名};f=fittype('d*PPb_x^3+c*PPb_x^2+a*PPb_x......