STM32硬件IIC
/**
* @brief 写一个字节到I2C设备中
* @param
* @arg pBuffer:缓冲区指针
* @arg WriteAddr:写地址
* @retval 正常返回1,异常返回0
*/
uint8_t I2C_ByteWrite(u8 pBuffer, u8 WriteAddr)
{
/* Send STRAT condition */
I2C_GenerateSTART(macI2Cx, ENABLE); I2CTimeout = I2CT_FLAG_TIMEOUT; /* Test on EV5 and clear it */
//启动信号发出之后要等待状态寄存器SR1的位0(SB=1),状态寄存器SR2的位1(BUSY=1)和位0(MSL=1),此时表明主模式下,起始条件已发送,总线处于忙状态;确保IIC通讯正确
while(!I2C_CheckEvent(macI2Cx, I2C_EVENT_MASTER_MODE_SELECT))
{
if((I2CTimeout--) == ) return I2C_TIMEOUT_UserCallback();
} /* Send slave address for write */
I2C_Send7bitAddress(macI2Cx, MPU6050_SLAVE_ADDRESS, I2C_Direction_Transmitter);//7bit slave address + read/write (0write,1 read) I2CTimeout = I2CT_FLAG_TIMEOUT; /* Test on EV6 and clear it */
//从机地址发出之后,等待 BUSY, MSL, ADDR, TXE and TRA flags标志位
while(!I2C_CheckEvent(macI2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
{
if((I2CTimeout--) == ) return I2C_TIMEOUT_UserCallback();
} /* Send the slave's internal address to write to */
I2C_SendData(macI2Cx, WriteAddr); I2CTimeout = I2CT_FLAG_TIMEOUT;
/* Test on EV8 and clear it */
/* TRA, BUSY, MSL, TXE and BTF flags */
while(!I2C_CheckEvent(macI2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED))
{
if((I2CTimeout--) == ) return I2C_TIMEOUT_UserCallback();
} /* Send the byte to be written */
I2C_SendData(macI2Cx, pBuffer); I2CTimeout = I2CT_FLAG_TIMEOUT; /* Test on EV8 and clear it */
/* TRA, BUSY, MSL, TXE and BTF flags */
while(!I2C_CheckEvent(macI2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED))
{
if((I2CTimeout--) == ) return I2C_TIMEOUT_UserCallback();
} /* Send STOP condition */
I2C_GenerateSTOP(macI2Cx, ENABLE); return ; //正常返回1
}
IIC事件检测:498页。STM32的硬件IIC通信非常严格,每一步都要检测相应的标志位是否正确,确保通信不会出错。
/**
* @brief 从I2C设备里面读取一块数据
* @param
* @arg pBuffer:存放从slave读取的数据的缓冲区指针
* @arg WriteAddr:接收数据的从设备的地址
* @arg NumByteToWrite:要从从设备读取的字节数
* @retval 正常返回1,异常返回0
*/
uint8_t I2C_BufferRead(u8* pBuffer, u8 ReadAddr, u16 NumByteToRead)
{
I2CTimeout = I2CT_LONG_TIMEOUT; while(I2C_GetFlagStatus(macI2Cx, I2C_FLAG_BUSY)) // Added by Najoua 27/08/2008
{
if((I2CTimeout--) == ) return I2C_TIMEOUT_UserCallback();
} I2C_GenerateSTART(macI2Cx, ENABLE); I2CTimeout = I2CT_FLAG_TIMEOUT; /* Test on EV5 and clear it */
while(!I2C_CheckEvent(macI2Cx, I2C_EVENT_MASTER_MODE_SELECT))
{
if((I2CTimeout--) == ) return I2C_TIMEOUT_UserCallback();
} /* Send slave address for write */
I2C_Send7bitAddress(macI2Cx, MPU6050_SLAVE_ADDRESS, I2C_Direction_Transmitter); I2CTimeout = I2CT_FLAG_TIMEOUT; /* Test on EV6 and clear it */
while(!I2C_CheckEvent(macI2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
{
if((I2CTimeout--) == ) return I2C_TIMEOUT_UserCallback();
} /* Clear EV6 by setting again the PE bit */
I2C_Cmd(macI2Cx, ENABLE); /* Send the slave's internal address to write to */
I2C_SendData(macI2Cx, ReadAddr); I2CTimeout = I2CT_FLAG_TIMEOUT; /* Test on EV8 and clear it */
while(!I2C_CheckEvent(macI2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED))
{
if((I2CTimeout--) == ) return I2C_TIMEOUT_UserCallback();
} /* Send STRAT condition a second time */
I2C_GenerateSTART(macI2Cx, ENABLE); I2CTimeout = I2CT_FLAG_TIMEOUT;
/* Test on EV5 and clear it */
while(!I2C_CheckEvent(macI2Cx, I2C_EVENT_MASTER_MODE_SELECT))
{
if((I2CTimeout--) == ) return I2C_TIMEOUT_UserCallback();
} /* Send slave address for read */
I2C_Send7bitAddress(macI2Cx, MPU6050_SLAVE_ADDRESS, I2C_Direction_Receiver); I2CTimeout = I2CT_FLAG_TIMEOUT; /* Test on EV6 and clear it */
while(!I2C_CheckEvent(macI2Cx, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED))
{
if((I2CTimeout--) == ) return I2C_TIMEOUT_UserCallback();
} /* While there is data to be read */
while(NumByteToRead)
{
if(NumByteToRead == )
{
/* Disable Acknowledgement */
I2C_AcknowledgeConfig(macI2Cx, DISABLE); /* Send STOP Condition */
I2C_GenerateSTOP(macI2Cx, ENABLE);
} /* Test on EV7 and clear it */
if(I2C_CheckEvent(macI2Cx, I2C_EVENT_MASTER_BYTE_RECEIVED))
{
/* Read a byte from the slave */
*pBuffer = I2C_ReceiveData(macI2Cx); /* Point to the next location where the byte read will be saved */
pBuffer++; /* Decrement the read bytes counter */
NumByteToRead--;
}
} /* Enable Acknowledgement to be ready for another reception */
I2C_AcknowledgeConfig(macI2Cx, ENABLE); return ; //正常,返回1
}
STM32硬件IIC的更多相关文章
- STM32硬件IIC (转)
源: STM32硬件IIC
- STM32硬件IIC驱动设计(转)
源: STM32硬件IIC驱动设计 参考: STM32—硬件IIC主机通信 STM32’s I2C 硬件BUG引发的血案(qzm) 解决STM32 I2C接口死锁在BUSY状态的方法讨论
- STM32硬件IIC操作
Stm32具有IIC接口,接口有以下主要特性 多主机功能:该模块既可做主设备也可做从设备 主设备功能 C地址检测 位/10位地址和广播呼叫 支持不同的通讯速度 状态标志: 发送器/接收器模式标志 字节 ...
- (转)stm32硬件IIC
cube与I2C:https://www.cnblogs.com/121792730applllo/p/5044920.html I2C官网:https://www.i2c-bus.org/stand ...
- 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 硬件I2C 到底是不是个坑?
/** ****************************************************************************** * @author Maox ...
- STM32 硬件UART接收超时检测设置
STM32 硬件UART接收超时检测设置 -----------------本文作者"智御电子",期待与电子爱好者交流学习.---------------- 应用场景 在uart应 ...
随机推荐
- mybatis-3 cache 源码赏析
总结: 从缓存策略源码,可以分析java相关类库 mybatis-3/src/main/java/org/apache/ibatis/cache/decorators/SoftCache.java p ...
- Indexes (also called “keys” in MySQL)
High Performance MySQL, Third Edition by Baron Schwartz, Peter Zaitsev, and Vadim Tkachenko Is an ...
- mongo_action
https://docs.mongodb.com/manual/introduction/ { name: "sue", age: 3, status: "A" ...
- nginx ipv4 ipv6 chrome /firefox remote-address/chrome://net-internals/dns
nginx ---access log server {listen 80;listen [::]:80;server_name localhost;location / {proxy_http_ve ...
- version `GLIBC_2.14' not found问题
先对比下源码编译.RPM 包和 YUM 三种安装方法的优劣: 源码编译:可以自行指定编译参数,自由度高,略显麻烦.但是如果不安装最新版本,BUGs 和 CVEs 是不会被修复的,和咸鱼没什么差别: R ...
- Linux 系统内核的调试
http://www.ibm.com/developerworks/cn/linux/l-kdb/index.html 本文将首先介绍 Linux 内核上的一些内核代码监视和错误跟踪技术,这些调试和跟 ...
- c#导出ListView中的数据到Excel表格
1.添加组件:Microsoft.Office.Interop.Excel 步骤:右键点击“引用”--->添加引用--->COM--->Microsoft.Office.Intero ...
- iOS-数据缓存(转载)
一.关于同一个URL的多次请求 有时候,对同一个URL请求多次,返回的数据可能都是一样的,比如服务器上的某张图片,无论下载多少次,返回的数据都是一样的. 上面的情况会造成以下问题 (1)用户流量的浪费 ...
- SpringBoot @Transactional声明事务无效问题
查看系统支持的存储引擎:show engines; 查看表使用的引擎:show table status from db_name where name='table_name'; 修改表引擎方法: ...
- redis连接池的标准用法:
from .conf import HOST, PORT, POOL_NAME import redis redis_pool = redis.ConnectionPool(host=HOST, po ...