本队伍号为CICC3152
上一篇讲述如何将axi总线引出,本组使用axi_gpio ip模拟SDA,SCL信号,在芯来sdk中建工程,定义写寄存器,读寄存器函数
有必要介绍一下AXI_GPIO及如何使用AXI_GPIO模拟I2C时序。AXI_GPIO是Xilinx官方提供的IP核,其内部包含7个寄存器,前四个寄存器偏移地址从0x00到0x0F,每个都是32位的寄存器,可以控制GPIO的方向和写的数据,只需这四个寄存器便可实现I2C时序的模拟。
由于I2C只使用了两根线——一根数据线,一根时钟线,所以对于它的时序模拟较为简单。首先必须要有起始信号和结束信号。当时钟线为1,数据线产生下降沿,即是I2C的起始信号;当时钟线为高,数据线处于上升沿,即是I2C的结束信号。由此便可以较为简单的模拟出开始和结束信号。需要注意的是,开始信号和结束信号都是由主机产生的,使用AXI_GPIO时通过将第二个和第四个寄存器置0,可以实现通道为输出。
发送数据的过程与上述类似,时钟线自始至终向外输出。每次在上升沿,都将数据线赋值为对应的发送位的数据,由于是主机向从机发送数据,那么数据线自然也是设置为输出。需要注意的是,I2C总线每次只能发送8为数据,每8位数据发送完,从机会返回一个ack信号——从机将数据线拉低。所以发送完成之后,我们要释放数据线,将数据线置1,使得从机可以对数据线进行拉低操作,当然在此处也必须要修改寄存器配置,使得数据线方向为输入。其实此处我们可以取巧,在已经测试过从设备可用的状况下,我们可以直接模拟一个ack信号,这样就可以省略一个检测ack信号的函数。
外部逻辑分析检测I2C信号,能够返回ACK,读写成功