I2C通讯中的复合模式

2019-07-20 05:10发布

这个代码是*火stm32的例程
I2C通讯中的复合模式要求发两个起始信号,第一个起始信号发送完发从机地址然后可以再发寄存器地址,第二个起始信号发完以后才能再发数据
而它的代码中发完存储器地址后就直接发数据,是不是错误的?
大神忙下

19 * @brief 写一个字节到I2C EEPROM 中
20 * @param pBuffer:缓冲区指针
21 * @param WriteAddr:写地址
22 * @retval 正常返回1,异常返回0
23 */
24 uint32_t I2C_EE_ByteWrite(u8* pBuffer, u8 WriteAddr)
25 {
26 /* 产生I2C 起始信号 */
27 I2C_GenerateSTART(EEPROM_I2C, ENABLE);
28
29 /*设置超时等待时间*/
30 I2CTimeout = I2CT_FLAG_TIMEOUT;
31 /* 检测 EV5 事件并清除标志*/
32 while (!I2C_CheckEvent(EEPROM_I2C, I2C_EVENT_MASTER_MODE_SELECT))
33 {
34 if ((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(0);
35 }
36
37 /* 发送EEPROM 设备地址 */
38 I2C_Send7bitAddress(EEPROM_I2C, EEPROM_ADDRESS,
39 I2C_Direction_Transmitter);
40
41 I2CTimeout = I2CT_FLAG_TIMEOUT;
42 /* 检测 EV6 事件并清除标志*/
43 while (!I2C_CheckEvent(EEPROM_I2C,
44 I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
45 {
46 if ((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(1);
47 }
48
49 /* 发送要写入的EEPROM 内部地址(即EEPROM 内部存储器的地址) */
50 I2C_SendData(EEPROM_I2C, WriteAddr);
51
52 I2CTimeout = I2CT_FLAG_TIMEOUT;
53 /* 检测 EV8 事件并清除标志*/
54 while (!I2C_CheckEvent(EEPROM_I2C,
55 I2C_EVENT_MASTER_BYTE_TRANSMITTED))
56 {
57 if ((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(2);
58 }
59 /* 发送一字节要写入的数据 */
60 I2C_SendData(EEPROM_I2C, *pBuffer);
61
62 I2CTimeout = I2CT_FLAG_TIMEOUT;
63 /* 检测 EV8 事件并清除标志*/
64 while (!I2C_CheckEvent(EEPROM_I2C,
65 I2C_EVENT_MASTER_BYTE_TRANSMITTED))
66 {
67 if ((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(3);
68 }
69
70 /* 发送停止信号 */
71 I2C_GenerateSTOP(EEPROM_I2C, ENABLE);
72
73 return 1;
74 }

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。