基于智多晶SL2-25E开发板的I2C通信测试

2020-08-05 13:22

1I2C总线协议特征

1)总线传输以起始信号作为开始标志,结束信号作为终止标志,起始和结束信号都是由主设备产生

2)空闲状态下,SCLSDA都是高电平;SCL为高且SDA由高变低,表明起始信号到来;SCL为高且SDA由低变高,表明结束信号到来。

3)数据传输以字节为单位,高位先传,在Bit0传完后紧接着ACK应答,从设备发来的应答位,因此SDAinout类型的端口;根据ACK应答位主设备可得知从设备是否还能接收数据。

4I2C总线上的每一个设备都有一个特定地址,主从设备的通信是建立在地址基础上,通信的顺序是先发7bit地址,和1bit方向(读/,收到应答之后,接下去就是数据的传输。

2智多晶SL2-25E开发板上有一颗基于I2C接口的EEPROM芯片AT24LC04本次我们要做的I2C接口通信实验是用FPGA模拟I2C接口时序,AT24LC04写入和读出一个数据来验证。芯片连接原理图如下所示:

SCLSDA空闲是高电平,因此需要上拉;WP已经被硬件拉高,没有写保护功能,FPGA可以随意读写数据。

在写Verilog代码之前,我们必须先翻阅24LC04datasheet了解读写时序和参数,有如下特点:

1SCL的最大发送时钟不得高于400KHz

2)写时序如下图:

CONTROL BYTE用于标定器件的设备地址,

在该器件中B1B0都等于0因此7bit设备地址就是1010000读写标志位为低表示写操作,电平表示读操作。

从写时序图可以看出,一个写过程就是:起始信号 -> 先发CONTROL BYTE -> 发存储地址 -> 发数据 -> 结束,这样就可以把数据写入对应的存储地址中。

3时序

从时序图可以看出读数据的过程稍微麻烦一些,注意要发两次CONTROL BYTE第一个CONTROL BYTER/W位为第二个CONTROL BYTER/W位为过程是:起始信号 -> 发第一个CONTROL BYTER/W=0 -> 再发存储地址 -> 重发起始信号 -> 再发第二个CONTROL BYTER/W=1 -> 开始从SDA反向接收数据 -> 结束

3程序设计

程序依旧采用状态机设计方法,读和写分开,通过一个输入读写标志来选择读或写:

在读和写的程序段内,严格按照24LC04的读写时序图来执行,开发板的时钟是25MHz程序中设置的计数值200,因此SCL的发送时钟等于125KHz,处于器件规定的参数范围内(400KHz。读写部分的程序篇幅比较长,不在这里贴出来了,兴趣的小伙伴可以发邮件到文章末尾的邮箱进行咨询。

4程序验证

在工程顶层写一段先写后读的控制代码,用于测试:

先在地址1写入8’h51读出来,到板卡的LED灯上去显示,高电平灯亮。

经过验证,LED灯可以正确显示写入后读出的数据:

多次尝试对不同存储地址写和读不同数据,测试结果均正确,到此程序的调试就结束了。

总结:I2C的设备可以是MCU或其它带I2C接口的器件,一条总线上可以同时挂很多个从设备,各自都有设备地址,必须严格按照芯片器件的datasheet来设计读写时序,如果有感兴趣的小伙伴,可以发邮件到:linxingyuan@isilicontech.com我们可以提供开发板的源代码工程给大家测试。