关于I2C的时序问题就不多说了,简要地提一下吧。首先在SCL保持高电平的时候,SDA从高电平到低电平,表明给了一个start信号,数据的有效性只有在SCL保持高电平的时候才可以,若SCL为低电平,SDA高低电平切换一般都是为了数据的变化了。当产生一个START信号后,通过SDA发送一个slave_address来查找从机。这个地址可以是7bit或者10bit,后面紧接着跟着的第八位或者第十一位表示读写,也就是传输方向。当写模式时,发送地址后等待从机应答信号(SDA为低电平),当主机发送一个STOP(即SCL高电平,SDA由低电平拉高到高电平),转换停止。读模式中,主机发送了地址后,等待从机返回给他一个应答地址后,主机开始读数据,然后等待主机一个响应信号,则可以继续读数据,反之 ,当主机有一个非响应信号,则表示停止读数据。
一般情况下 ,I2C默认是在slave模式中的,所以用master模式的时候,必须产生一个START信号,当产生了 STOP信号,则又返回到了slave模式。
关于setup-time 和 hold-time, setuptime表示在SCL拉高之前,SDA保持稳定的时间,holdtime表示在SCL拉高之后 ,SDA保持稳定的时间,这两个条件需要参考具体的芯片时序满足,否则也不能正常的读出数据。
根据标准模式和快速模式配置相应的SCL高低电平占空比。
关于OWN_ADDRESS1,这个网上有很好的解释,它表示STM32设备本身的地址,当32作为主机时,我们是可以不用去管这个地址的,任意设个值,但是当32作为从机(也就是另一个MCU作为主机)时,我们就必须正确的配置它的地址。