Stm32具有IIC接口,接口有以下主要特性
多主机功能:该模块既可做主设备也可做从设备
主设备功能
C地址检测
产生和检测7位/10位地址和广播呼叫
支持不同的通讯速度
状态标志:
发送器/接收器模式标志
字节发送结束标志
总线忙标志
错误标志
2个中断向量
可选的拉长时钟功能
具单字节缓冲器的DMA
虽然很多人说STM的硬件IIC不好用,但是对于这么一个设备去探索一下还是很有必要的,指不定哪天就用上了呢,
IIC借口一共有九个寄存器,比较重要的几个寄存器分别如下
1. CR1
由这几个位我们可以正常产生标准IIC的START条件STOP条件,ACK与NOACK
CR2
控制IIC的通行频率
这两位检测IIC总线是否收到数据
1. 对于硬件IIC的初始化流程包括
1. 配置IO口,配置为GPIO_Mode_AF_OD模式
2. 选择IIC模式
3. 选择是否使能自动应答以及设备地址长度
4. 设置IIC总线的传输速率
2. 硬件IIC的读写操作其实逻辑上和标准总线类似,也是发送地址等待ack发送数据等待ACK,但是因为有硬件的自动参与,所以我们不需要延时了
具体代码如下
void HmcIICInit(void)
{
/*GPIO初始化*/
GPIO_InitTypeDef GPIO_InitStructure;
/* 配置硬件IIC需要的变量 */
I2C_InitTypeDef I2C_InitStructure; /* 使能与 I2C1 有关的时钟 */
RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOB,ENABLE );
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE); /* PB6-I2C1_SCL、PB7-I2C1_SDA*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_Init(GPIOB, &GPIO_InitStructure); /*IIC外设初始化*/ /* I2C 配置 */
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C ; //配置为普通IIC模式
//I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
//I2C_InitStructure.I2C_OwnAddress1 = SlaveAddress;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; //使能自动应答
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = 50000; //5K的速度? /* I2C1 初始化 */
I2C_Init(I2C1, &I2C_InitStructure); /* 使能 I2C1 */
I2C_Cmd (I2C1,ENABLE);
/*允许应答模式*/
I2C_AcknowledgeConfig(I2C1, ENABLE);
} void HmcByteWrite(u8 addr,u8 dataValue)
{
I2C_GenerateSTART(I2C1,ENABLE); while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)); I2C_Send7bitAddress(I2C1,HMC_ADDR,I2C_Direction_Transmitter); while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); I2C_SendData(I2C1,addr); while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_SendData(I2C1,dataValue); while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_GenerateSTOP(I2C1,ENABLE); } u8 HmcByteRead(u8 addr)
{
u8 dataValue; while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY)); I2C_GenerateSTART(I2C1,ENABLE);//起始信号 while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)); I2C_Send7bitAddress(I2C1,HMC_ADDR,I2C_Direction_Transmitter);//发送设备地址+写信号 while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));// I2C_Cmd(I2C1,ENABLE); I2C_SendData(I2C1,addr);//发送存储单元地址,从0开始 while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_GenerateSTART(I2C1,ENABLE);//起始信号 while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)); I2C_Send7bitAddress(I2C1,HMC_ADDR,I2C_Direction_Receiver);//发送设备地址+读信号 while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); I2C_AcknowledgeConfig(I2C1,DISABLE); I2C_GenerateSTOP(I2C1,ENABLE); while(!(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED))); dataValue=I2C_ReceiveData(I2C1);//读出寄存器数据 return dataValue;
}
STM32硬件IIC操作的更多相关文章
-
STM32硬件IIC (转)
源: STM32硬件IIC
-
STM32硬件IIC驱动设计(转)
源: STM32硬件IIC驱动设计 参考: STM32—硬件IIC主机通信 STM32’s I2C 硬件BUG引发的血案(qzm) 解决STM32 I2C接口死锁在BUSY状态的方法讨论
-
(转)stm32硬件IIC
cube与I2C:https://www.cnblogs.com/121792730applllo/p/5044920.html I2C官网:https://www.i2c-bus.org/stand ...
-
STM32硬件IIC
/** * @brief 写一个字节到I2C设备中 * @param * @arg pBuffer:缓冲区指针 * @arg WriteAddr:写地址 * @retval 正常返回1,异常返回0 * ...
-
STM32 IIC双机通信—— HAL库硬件IIC版
参考传送门 关于IIC的原理这里我就不多说了,网上有很多很好的解析,如果要看我个人对IIC的理解的话,可以点击查看,这里主要讲一下怎样利用STM32CubeMx实现IIC的通讯,经过个人实践,感觉HA ...
-
STM32读取bq33100数据——硬件IIC
背景:拟采用bq33100超级电容管理芯片,实现自动的超级电容组的均压任务.需监控芯片的工作情况,以及电容组的均压情况. 平台: 硬件:STM32F103C8T6 通信:SMBus(低速IIC) 目标 ...
-
【STM32】IIC的基本原理(实例:普通IO口模拟IIC时序读取24C02)(转载)
版权声明:本文为博主原创文章,允许转载,但希望标注转载来源. https://blog.csdn.net/qq_38410730/article/details/80312357 IIC的基本介绍 ...
-
STM32串口寄存器操作(转)
源:STM32串口寄存器操作 //USART.C /************************************************************************** ...
-
浅谈 STM32 硬件I2C的使用 (中断方式 无DMA 无最高优先级)(转)
引子 STM32的硬件I2C很多人都对它望而却步.因为很多电工都说,STM32 硬件 I2C有BUG.不稳定.死机等等……最后都使用GPIO模拟I2C. 的确,模拟I2C好用.但是在我看来在一个72M ...
随机推荐
-
Oracle数据库锁表及解锁进程
下午代码迁移,更新数据库记录时for update语句无法执行,数据库被锁,KILL掉几个进程搞定. Oracle数据库操作中,我们有时会用到锁表查询以及解锁和kill进程等操作,那么这些操作是怎么实 ...
-
libcurl with telnet
#include <stdio.h>#include <string.h>#include <curl/curl.h>#include <curl/easy. ...
-
iOS - 指定视图的圆角个数-b
平常设置视图的圆角最普遍的就是设置四个角的,方法也就是一句代码解决: view.layer.cornerRadius = 10; 四个圆角 但有时需求会是指定某个,或者特定哪几个角设置圆角,所以我们需 ...
-
Android中Tomcat的简单配置和使用
因为学Android已经有一段时间了,但是在学校,服务器方面是个短板啊,没有专门的服务器拿给我们学生练手,所以只有自己找办法了.当然,Tomcat就是不二的选择了. 在网上看了看资料,还是觉得自己记录 ...
-
Android开发学习之Intent具体解释
Intent简单介绍和具体解释: Intent:协助应用间的交互与通信,Intent负责相应用中一次操作的动作.动作涉及的数据.附加数据进行描写叙述. ...
-
RTC-高效率实现TimerTicker编解码
源:RTC-高效率实现TimerTicker编解码 嵌入式系统中时间是很重要的,在以往的系统中设计者常常使用一种叫RTC的专用芯片来维持时间,这种芯片种类很多接口形式也很多,如常用的DS1302.PC ...
-
hadoop--安装1.2.1版本
hadoop的安装分为三种方式,第一种单机安装,一般用于调试(其实一般都不用).第二种,伪分布式安装,一般程序员开发会使用这种方式.第三种,分布式安装,在实际环境中应用.今天在这里记下的是第二种,即伪 ...
-
Flask开发微电影网站(十)
1.后台管理之角色管理 1.1 角色管理之定义角色表单 在app的admin目录的forms.py文件中,定义角色表单 # 角色表单 class RoleForm(FlaskForm): name = ...
-
每天一个linux命令:chown
1.命令简介 chown(Change owner) 用来改变某个文件或目录的所有者和所属的组,该命令可以向某个用户授权,使该用户变成指定文件的所有者或者改变文件所属的组.用户可以是用 ...
-
[原]Veracrypt使用Yubikey作为安全令牌
今天刚刚到货Yubikey 5 美亚 直邮 ,易客满国际,国内居然是顺丰配送,点个赞. 必备的控件 https://developers.yubico.com/yubikey-manager-qt/R ...