当前位置:首页 > 单片机 > 单片机
[导读]1 /**2 * @brief 写一个字节到I2C设备中3 * @param 4 * @arg pBuffer:缓冲区指针5 * @arg WriteAddr:写地址6 * @retval 正常返回1,异常返回07 */8 uint8_t I2C_ByteWrite(u8 pBuffer, u8 WriteAddr)9

1 /**

2 * @brief 写一个字节到I2C设备中

3 * @param

4 * @arg pBuffer:缓冲区指针

5 * @arg WriteAddr:写地址

6 * @retval 正常返回1,异常返回0

7 */

8 uint8_t I2C_ByteWrite(u8 pBuffer, u8 WriteAddr)

9 {

10 /* Send STRAT condition */

11 I2C_GenerateSTART(macI2Cx, ENABLE);

12

13 I2CTimeout = I2CT_FLAG_TIMEOUT;

14

15

16 /* Test on EV5 and clear it */

17 //启动信号发出之后要等待状态寄存器SR1的位0(SB=1),状态寄存器SR2的位1(BUSY=1)和位0(MSL=1),此时表明主模式下,起始条件已发送,总线处于忙状态;确保IIC通讯正确

18 while(!I2C_CheckEvent(macI2Cx, I2C_EVENT_MASTER_MODE_SELECT))

19 {

20 if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback();

21 }

22

23 /* Send slave address for write */

24 I2C_Send7bitAddress(macI2Cx, MPU6050_SLAVE_ADDRESS, I2C_Direction_Transmitter);//7bit slave address + read/write (0write,1 read)

25

26 I2CTimeout = I2CT_FLAG_TIMEOUT;

27

28 /* Test on EV6 and clear it */

29 //从机地址发出之后,等待 BUSY, MSL, ADDR, TXE and TRA flags标志位

30 while(!I2C_CheckEvent(macI2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))

31 {

32 if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback();

33 }

34

35 /* Send the slave's internal address to write to */

36 I2C_SendData(macI2Cx, WriteAddr);

37

38 I2CTimeout = I2CT_FLAG_TIMEOUT;

39 /* Test on EV8 and clear it */

40 /* TRA, BUSY, MSL, TXE and BTF flags */

41 while(!I2C_CheckEvent(macI2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED))

42 {

43 if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback();

44 }

45

46 /* Send the byte to be written */

47 I2C_SendData(macI2Cx, pBuffer);

48

49 I2CTimeout = I2CT_FLAG_TIMEOUT;

50

51 /* Test on EV8 and clear it */

52 /* TRA, BUSY, MSL, TXE and BTF flags */

53 while(!I2C_CheckEvent(macI2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED))

54 {

55 if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback();

56 }

57

58 /* Send STOP condition */

59 I2C_GenerateSTOP(macI2Cx, ENABLE);

60

61 return 1; //正常返回1

62 }


IIC事件检测:498页。STM32的硬件IIC通信非常严格,每一步都要检测相应的标志位是否正确,确保通信不会出错。



1 /**

2 * @brief 从I2C设备里面读取一块数据

3 * @param

4 * @arg pBuffer:存放从slave读取的数据的缓冲区指针

5 * @arg WriteAddr:接收数据的从设备的地址

6 * @arg NumByteToWrite:要从从设备读取的字节数

7 * @retval 正常返回1,异常返回0

8 */

9 uint8_t I2C_BufferRead(u8* pBuffer, u8 ReadAddr, u16 NumByteToRead)

10 {

11 I2CTimeout = I2CT_LONG_TIMEOUT;

12

13 while(I2C_GetFlagStatus(macI2Cx, I2C_FLAG_BUSY)) // Added by Najoua 27/08/2008

14 {

15 if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback();

16 }

17

18 I2C_GenerateSTART(macI2Cx, ENABLE);

19

20 I2CTimeout = I2CT_FLAG_TIMEOUT;

21

22 /* Test on EV5 and clear it */

23 while(!I2C_CheckEvent(macI2Cx, I2C_EVENT_MASTER_MODE_SELECT))

24 {

25 if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback();

26 }

27

28 /* Send slave address for write */

29 I2C_Send7bitAddress(macI2Cx, MPU6050_SLAVE_ADDRESS, I2C_Direction_Transmitter);

30

31 I2CTimeout = I2CT_FLAG_TIMEOUT;

32

33 /* Test on EV6 and clear it */

34 while(!I2C_CheckEvent(macI2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))

35 {

36 if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback();

37 }

38

39 /* Clear EV6 by setting again the PE bit */

40 I2C_Cmd(macI2Cx, ENABLE);

41

42 /* Send the slave's internal address to write to */

43 I2C_SendData(macI2Cx, ReadAddr);

44

45 I2CTimeout = I2CT_FLAG_TIMEOUT;

46

47 /* Test on EV8 and clear it */

48 while(!I2C_CheckEvent(macI2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED))

49 {

50 if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback();

51 }

52

53 /* Send STRAT condition a second time */

54 I2C_GenerateSTART(macI2Cx, ENABLE);

55

56 I2CTimeout = I2CT_FLAG_TIMEOUT;

57 /* Test on EV5 and clear it */

58 while(!I2C_CheckEvent(macI2Cx, I2C_EVENT_MASTER_MODE_SELECT))

59 {

60 if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback();

61 }

62

63 /* Send slave address for read */

64 I2C_Send7bitAddress(macI2Cx, MPU6050_SLAVE_ADDRESS, I2C_Direction_Receiver);

65

66 I2CTimeout = I2CT_FLAG_TIMEOUT;

67

68 /* Test on EV6 and clear it */

69 while(!I2C_CheckEvent(macI2Cx, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED))

70 {

71 if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback();

72 }

73

74 /* While there is data to be read */

75 while(NumByteToRead)

76 {

77 if(NumByteToRead == 1)

78 {

79 /* Disable Acknowledgement */

80 I2C_AcknowledgeConfig(macI2Cx, DISABLE);

81

82 /* Send STOP Condition */

83 I2C_GenerateSTOP(macI2Cx, ENABLE);

84 }

85

86 /* Test on EV7 and clear it */

87 if(I2C_CheckEvent(macI2Cx, I2C_EVENT_MASTER_BYTE_RECEIVED))

88 {

89 /* Read a byte from the slave */

90 *pBuffer = I2C_ReceiveData(macI2Cx);

91

92 /* Point to the next location where the byte read will be saved */

93 pBuffer++;

94

95 /* Decrement the read bytes counter */

96 NumByteToRead--;

97 }

98 }

99

100 /* Enable Acknowledgement to be ready for another reception */

101 I2C_AcknowledgeConfig(macI2Cx, ENABLE);

102

103 return 1; //正常,返回1

104 }


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

在嵌入式开发中,STM32的时钟系统因其灵活性和复杂性成为开发者关注的焦点。然而,看似简单的时钟配置背后,隐藏着诸多易被忽视的陷阱,轻则导致系统不稳定,重则引发硬件损坏。本文从时钟源选择、PLL配置、总线时钟分配等关键环...

关键字: STM32 时钟系统

在嵌入式系统开发中,STM32系列微控制器的内部温度传感器因其低成本、高集成度特性,广泛应用于设备自检、环境监测等场景。然而,受芯片工艺差异和电源噪声影响,其原始数据存在±1.5℃的固有误差。本文从硬件配置、校准算法、软...

关键字: STM32 温度传感器

在能源效率与智能化需求双重驱动下,AC-DC转换器的数字控制技术正经历从传统模拟方案向全数字架构的深刻变革。基于STM32微控制器的PFM(脉冲频率调制)+PWM(脉冲宽度调制)混合调制策略,结合动态电压调整(Dynam...

关键字: AC-DC STM32

当前智能家居产品需求不断增长 ,在这一背景下 ,对现有浇花装置缺陷进行了改进 ,设计出基于STM32单片机的全 自动家用浇花机器人。该设计主要由机械结构和控制系统构成 ,机械结构通过麦克纳姆轮底盘与喷洒装置的结合实现机器...

关键字: STM32 麦克纳姆轮 安全可靠 通过性强

用c++编程似乎是让你的Arduino项目起步的障碍吗?您想要一种更直观的微控制器编程方式吗?那你需要了解一下Visuino!这个图形化编程平台将复杂电子项目的创建变成了拖动和连接块的简单任务。在本文中,我们将带您完成使...

关键字: Visuino Arduino ESP32 STM32

基于STM32与LoRa技术的无线传感网络凭借其低功耗、广覆盖、抗干扰等特性,成为环境监测、工业自动化等场景的核心解决方案。然而,如何在复杂电磁环境中实现高效休眠调度与动态信道优化,成为提升网络能效与可靠性的关键挑战。本...

关键字: STM32 LoRa

在实时控制系统、高速通信协议处理及高精度数据采集等对时间敏感的应用场景中,中断响应延迟的优化直接决定了系统的可靠性与性能上限。STM32系列微控制器凭借其灵活的嵌套向量中断控制器(NVIC)、多通道直接内存访问(DMA)...

关键字: STM32 DMA

数字电源技术向高功率密度、高效率与高动态响应方向加速演进,STM32微控制器凭借其基于DSP库的算法加速能力与对LLC谐振变换器的精准控制架构,成为优化电源动态性能的核心平台。相较于传统模拟控制或通用型数字控制器,STM...

关键字: STM32 数字电源

STM32微控制器凭借其针对电机控制场景的深度优化,成为高精度、高可靠性驱动系统的核心选择。相较于通用型MCU,STM32在电机控制领域的核心优势集中体现在FOC(磁场定向控制)算法的硬件加速引擎与PWM死区时间的动态补...

关键字: STM32 电机控制

无线充电技术加速渗透消费电子与汽车电子领域,基于Qi协议的无线充电发射端开发成为智能设备能量补给的核心课题。传统模拟控制方案存在响应滞后、参数调整困难等问题,而基于STM32的数字PID控制结合FOD(Foreign O...

关键字: STM32 无线充电
关闭