因为需要连接一款i2c接口的OLED,需要使用PS端的i2c接口。
1、PL端勾选上i2c并通过EMIO分配引脚(PS可以通过驱动EMIO控制PL部分的引脚)。
2、设备树zynq-7000.dtsi中将i2c0打成okay(最好在zynq-zed.dts中更改),
i2c1: i2c@e0005000 {
compatible = "cdns,i2c-r1p10";
status = "okay";
clocks = <&clkc 39>;
interrupt-parent = <&intc>;
interrupts = <0 48 4>;
reg = <0xe0005000 0x1000>;
#address-cells = <1>;
#size-cells = <0>;
};
3、编译后放到sd中或者烧到flash中启动,设备下会多出i2c-0节点
zynq> ls /dev/
AXIDMA ram10 tty36
console ram11 tty37
cpu_dma_latency ram12 tty38
full ram13 tty39
i2c ram14 tty4
i2c-0 ram15 tty40
4、至此就可以编写应用程序了,进行i2c的读写操作。
iic_fd = open("/dev/i2c-0",O_RDWR);
void Write_IIC_Command(unsigned char IIC_Command)
{
struct i2c_rdwr_ioctl_data i2c_data;
struct i2c_msg data_msgs[3];
int ret;
unsigned char buf[2];
i2c_data.nmsgs = 1;
data_msgs[0].addr=0x78>>1;
data_msgs[0].flags=0;//0-write,1-read
data_msgs[0].len=2;
data_msgs[0].buf = buf;
data_msgs[0].buf[0] = 0x00;
data_msgs[0].buf[1] = IIC_Command;
i2c_data.msgs = data_msgs;
ret = ioctl(iic_fd,I2C_RDWR,&i2c_data);
if(ret<0)
perror("Write_IIC_Command error\n");
}