一、需要调用的库函数(本篇文章只讲主机作为发送器)
1.准备工作(读懂序列图)
2.需要调用的库函数,实现从主机向从机发送数据(省略了上图中标志位的检测,但本人亲测能实现IIC通信)
CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);//设置系统时钟为1分频,即不分频
CLK_PeripheralClockConfig(CLK_Peripheral_I2C1, ENABLE);//使能IIC的时钟
I2C_Init(I2C1, 100000, 0,
I2C_Mode_I2C, I2C_DutyCycle_2,
I2C_Ack_Enable, I2C_AcknowledgedAddress_7bit);//IIC的初始化I2C_Cmd(ENABLE);//使能IIC
I2C_GenerateSTART(I2C1, ENABLE);//IIC的起始信号
I2C_Send7bitAddress(I2C1, (uint8_t)SLAVE_ADDRESS, I2C_Direction_Transmitter);//7位从机地址+1位方向
I2C_SendData(I2C1, REGISTER_ADDRESS);//发送寄存器地址
I2C_SendData(I2C1, DATA);//向寄存器发数据
I2C_GenerateSTOP(I2C1, ENABLE);//IIC的停止信号
二、个人所犯的理解错误
1.对于IIC协议理解的错误
错误理解:我认为只要主机发送了起始信号,时钟线就会有脉冲
正确理解:时钟线和数据线同步存在,数据线在发送数据的时候,时钟线才会有脉冲
2.还是下面那张序列图,对寄存器写入数据理解错误
错误理解:因为上图数据是连续发送的,我认为当对从机的两个寄存器写入数据的时候,可以在一次开始信号和一次结束信号内完成,但实际上这样是不可以的,即流程为:起始信号——写入第一个寄存器地址和数据——写入第二个寄存器地址和数据——停止信号。
错误的原因:上述写法会导致单片机把第二个寄存器的地址和数据都看为数据,并且第一个寄存器后面的地址。
正确理解:我们对两个寄存器写入数据,要分两次发送,即流程为:第一次起始信号——写入第一个寄存器地址和数据——第一次停止信号,第二次起始信号——写入第二个寄存器地址和数据——第二次停止信号。