您现在的位置: 主页 > MCU > 单片机技术应用 > STM32硬件IIC -
本文所属标签:
为本文创立个标签吧:

STM32硬件IIC -

来源: 网络用户发布,如有版权联系网管删除 2018-09-06 

[导读]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 /**

本文引用地址: http://www.21ic.com/app/mcu/201807/784108.htm

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 }




              查看评论 回复



 

网站地图

围观()