/**
* @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的更多相关文章

  1. STM32硬件IIC (转)

    源: STM32硬件IIC

  2. STM32硬件IIC驱动设计(转)

    源: STM32硬件IIC驱动设计 参考: STM32—硬件IIC主机通信 STM32’s I2C 硬件BUG引发的血案(qzm) 解决STM32 I2C接口死锁在BUSY状态的方法讨论

  3. STM32硬件IIC操作

    Stm32具有IIC接口,接口有以下主要特性 多主机功能:该模块既可做主设备也可做从设备 主设备功能 C地址检测 位/10位地址和广播呼叫 支持不同的通讯速度 状态标志: 发送器/接收器模式标志 字节 ...

  4. (转)stm32硬件IIC

    cube与I2C:https://www.cnblogs.com/121792730applllo/p/5044920.html I2C官网:https://www.i2c-bus.org/stand ...

  5. STM32 IIC双机通信—— HAL库硬件IIC版

    参考传送门 关于IIC的原理这里我就不多说了,网上有很多很好的解析,如果要看我个人对IIC的理解的话,可以点击查看,这里主要讲一下怎样利用STM32CubeMx实现IIC的通讯,经过个人实践,感觉HA ...

  6. STM32读取bq33100数据——硬件IIC

    背景:拟采用bq33100超级电容管理芯片,实现自动的超级电容组的均压任务.需监控芯片的工作情况,以及电容组的均压情况. 平台: 硬件:STM32F103C8T6 通信:SMBus(低速IIC) 目标 ...

  7. 【STM32】IIC的基本原理(实例:普通IO口模拟IIC时序读取24C02)(转载)

     版权声明:本文为博主原创文章,允许转载,但希望标注转载来源. https://blog.csdn.net/qq_38410730/article/details/80312357 IIC的基本介绍 ...

  8. STM32 硬件I2C 到底是不是个坑?

    /** ****************************************************************************** * @author    Maox ...

  9. STM32 硬件UART接收超时检测设置

    STM32 硬件UART接收超时检测设置 -----------------本文作者"智御电子",期待与电子爱好者交流学习.---------------- 应用场景 在uart应 ...

随机推荐

  1. numpy协方差矩阵numpy.cov

    numpy.cov(m, y=None, rowvar=True, bias=False, ddof=None, fweights=None, aweights=None)[source] Estim ...

  2. bootstrapValidator remote 的接受 验证 值

    本来之前也做过一次这样的验,但可能是这两天太热脑袋不够用了,于是就只有看看源码咯 that.updateStatus(updateAll ? $f.attr('data-bv-field') : $f ...

  3. Ubuntu 16.04 ORB_SLAM2+ROS+usb_cam+AR

    Ubuntu 16.04 ORB_SLAM2+ROS+usb_cam+AR 参考博文:http://blog.csdn.net/u79501/article/details/68942174 http ...

  4. Python装饰函数

    from time import ctime, sleep def tsfunc(func): def wrappedFunc(): print('[%s] %s() classed' % (ctim ...

  5. tkinter 提示符

    在python3.4中,原来的tkMessageBox变成tkinter.messagebox,使用方式如下: import tkinter.messagebox tkinter.messagebox ...

  6. sql中union 和union all

    两者都是把两个表合并到一起,不同的是,union是要去重的,union all不去重

  7. IP地址必知

    IP地址分类:A类IP段 0.0.0.0 ~ 127.255.255.255(0nnnnnnn.hhhhhhhh.hhhhhhhh.hhhhhhhh)(保留给ZF或大型企业)B类IP段 128.0.0 ...

  8. 登录mysql出现/var/lib/mysql/mysql.sock不存在

    问题描述: 1.mysql安装完成后,使用 service mysqld start 总是出现 start failed. 2.使用mysql -uroot -p登录出现找不到 /var/lib/my ...

  9. 共用tableview一个继承类里面有

    里面的复用cell会不会混在一起呢?

  10. 使用Fiddler远程抓包

    Fiddler简介以及web抓包 一.Fiddler简介 简单来说,Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯.网上简介很多,我们不多说. 二 ...