12 FPGA IIC 读写案例
1 案例简介
案例功能描述:本案例主要演示如何通过 IIC 通信协议,在 ARM 端实现对 FPGA 寄存器的读写操作。案例基于 Linux 系统的标准 IIC 工具(如 i2cset、i2cget、i2cdetect 等),自定义了测试程序,提供了完整的 IIC 通信测试流程,验证 IIC 通信的正确性。
2.标准 IIC 工具读写FPGA
在IIC通信中,FPGA作为从机,可通过以下指令查看从机地址。如图,其设备地址为0x66。
i2cdetect -r -y -a 0

目前代码中定义了三个寄存器地址为0x00、0x01、0x02。其中0x02为只读寄存器。对于0x00寄存器可以测试读写数据是否正确,例如写1,读出来也是1即通信正常。
执行以下命令,向0X00寄存器中写入数值0X40。
i2cset -r -y -a 0 0x66 0x00 0x40

执行以下命令,读取寄存器0x00的值,可以看到读出了0x40,和写入的值一致。
i2cget -f -y -a 0 0x66 0x00
也可执行以下命令,查看设备所有寄存器的值。
i2cdump -f -y -a 0 0x66

其中,0x01寄存器可以控制底板上LED灯的状态。可向0X01寄存器写入数值来控制LED灯的状态。
#点亮
i2cset -f -y -a 0 0x66 0x01 0x01
#熄灭
i2cset -f -y -a 0 0x66 0x01 0x01
3 案例操作流程
本案例基于Linux系统的标准IIC工具,优化了指令设计,使其更加直观和用户友好。用户可根据需求自行更改源程序。
打开终端,将本案例 bin 目录下(05-开发资料\软件开发资料\linux_demo\smdt_fpga_i2c_demo\bin)的可执行程序 smdt_fpga_i2c 拷贝至开发板文件系统 (源码可以在 src 路径下查看)。
#修改 Linux 内核日志的显示级别,内核的日志级别被设置为只显示紧急或更高级别的消息
echo 1 4 1 7 > /proc/sys/kernel/printk
在终端执行如下指令,切换到 smdt_fpga_i2c 可执行程序所在目录
#切换到 smdt_fpga_i2c 可执行程序所在目录
cd ‘可执行文件所在目录’
#查看 smdt_fpga_i2c 是否在该目录下
ls
若可执行文件 smdt_fpga_i2c 在当前目录下,则修改可执行文件的权限
#修改文件权限
chmod 777 smdt_fpga_i2c
#查询是否修改成功
ls -ld smdt_fpga_i2c
查询确认文件修改权限成功后,执行 ./smdt_fpga_i2c -h 可以查看该程序的帮助信息
./smdt_fpga_i2c -h
执行结果如下图:

执行以下命令,可对设备寄存器0X00进行读写操作。
#写操作
./smdt_fpga_i2c -write 0x00 0x11
#读操作
./smdt_fpga_i2c -read 0x00
执行以下命令,可对设备寄存器0X01进行写操作控制底板上LED灯亮灭。
#点亮
./smdt_fpga_i2c -led ON
#熄灭
./smdt_fpga_i2c -led OFF