四、IIC通讯
(一)、概述
本章节进入到IIC通讯篇章,本篇章开始就得开始付费啦,请关注的各位理解,因为代码每个人的想法不同书写的个人版权,请大家注意版权问题,IIC通讯主要分为两大部分,一个是主机读和主机写,另一个是从机接收,IIC具体的原理这里就不细讲,主要是依据IIC时序进行代码编写,本节主要是介绍IIC主机写程序,依据的是SMBUS2.0协议,它与IIC的不同在于存在IIC_SCL时钟的约束,即SMBUS是IIC的一个子集。
(二)、时序介绍
了解IIC协议的小伙伴们因该都知道,IIC主要有几个重要的信号,分别是IIC读写开始信号,一个是应答信号,另一个是IIC停止信号,就以开始信号为例,什么时候表示IIC开始读写?在原理上我们知道IIC-SCL为高电平时,IIC-SDA从高电平转为低电平表示读写开始,但是需要保持多久才能时开始信号?
这就涉及到建立时间与保持时间的概念了,如上图TBUF和THD_STA,它的意思是开始信号条件前需要保持最少TBUF的时间,并且IIC-SDA下降后需要等待THD_STA时间IIC-SCL才能从高电平变为低电平;从表中可以看到Min和Max字样,后面跟随着Units表示单位,所以可以知道开始信号条件前需要保持最少TBUF == 4.7us的时间,并且IIC-SDA下降后需要等待THD_STA == 4.0us的时间IIC-SCL才能从高电平变为低电平,这样就能表示IIC传输开始。
又因为IIC的传输速率是10K到400Khz,但是SMBUS的传输速率是10K到100Khz,那我们产生的IIC-SCL就得符合上述标准;但是我们的IIC-SCL是要一直产生的吗?答案是不需要一直产生,因为IIC是两线协议,可能这两根线并不是挂载着一个主机一个从机的情况,可能有多个主机和多个从机的情况,所以我们并不需要一直的发送IIC-SCL;那么问题来了,如何保证时序要求在范围内,其实只要以及使用时钟的分频出所需要速率即可。
在数据端也是需要遵循建立时间和保持时间,但是可以看到它的时间单位是在纳秒级别的,在变化速率为微妙级的情况下,我是进行忽略处理的;好的,现在话不多说,我的IIC-MASTER-WRITE的代码支持什么功能呢?一个是支持是否采用寄存器地址,另一个是支持连续写,可以任意涉及连续写的次数,代码如下:
// ********************************************************
// Copyright: CSDN account juningc
// The email address is: [email protected]
// Unauthorized copying is prohibited. If you need to use it, please contact the author
// All interpretation rights belong to the copyright author
// ********************************************************
module iic_write_master #
(
parameter DWID = 8 ,
parameter UCNT = 25 ,
parameter BUILD_TIME = 5 , //us
parameter HOLD_TIME = 4 //us
)
(
input clk_sys ,
input rst_sys ,
//
input waddr_mode , // 0:使用寄存器地址 1:不适用地址
input write_dena ,
input [6:0] slave_addr ,
input [7:0] regis_addr ,
input [DWID-1:0] write_data ,
input [3:0] write_numb , // 连续写次数,理论上可以写N个Byte,但是最好限制在4个以下
output reg bus_busy , // 总线繁忙状态
//
input i2c_scl_m_i ,
output i2c_scl_m_o ,
out