1.模拟I2C协议需要熟读数据手册掌握时序
2.I2C协议对时序的要求比SPI更严格,具体表现在时钟SCL处于高电平时,SDA线上传输的数据必须稳定,否则将被视为开始或截止传输的信号。
如何保证信号稳定?这个问题困扰了我几天,后来用double时钟的方法解决
具体解决方法如下:
输入信号为CLK,SCL信号为CLK的2分频,即采用两个周期来处理一个SCL信号
当送START信号或者送STOP信号时,在第二个时钟的下降沿改变SDA信号,此时可以保证SCL为高电平
当送普通数据时,在第一个时钟周期的下降沿改变SDA信号,可保证SCL为高时,数据不变。
具体可以参考以下时序图
3.sda口为双向inout口线,在FPGA中处理起来比较麻烦,其实搞懂了还是很简单的
对inout口线类型要选择为bidir,刚开始设置成output,能收到数据就怪了
双向总线总结:
一般用高阻态来控制信号的进出,需要上拉电阻!归纳为一句话“当需要输入的时候将输出置为高阻态”。
使用时,输出数据时可以任意置数,输入数据时将首先将 sda <= 1'bz,然后才可以读取sda。