作者:卢浩
时间:2017.3.6
转载请注明出处
在7015上通过I2C挂在RTC(DS3232),首先我们需要在vivado工程里面确认I2C控制器已经被选中。
如下图:
我们可以看到I2C0 I2C1控制器都已经被PS端选中,我的实验中,是把DS3232挂载在I2C1控制器上。
首先了解一下原理,I2C通过读取DS3232的地址来进行通信,我们可以看一下DS3232的datasheet。
http://datasheets.maximintegrated.com/en/ds/DS3232.pdf
里面有这一句
The slaveaddress byte contains the 7-bit DS3232 address,which is 1101000,16进制0X68。
在zynq-zed.dts文件添加如下配置
aliases {
ethernet0 = &gem0;
i2c0 = &i2c0;
i2c1 = &i2c1;
serial0 = &uart1;
spi0 = &qspi;
mmc0 = &sdhci0;
};
&i2c1 {
status = "okay";
clock-frequency = <100000>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_i2c1_default>;
#address-cells = <1>;
#size-cells = <0>;
rtc@68 {
compatible = "dallas,ds3232";
#address-cells = <1>;
#size-cells = <0>;
reg = <0x68>;
};
};
&pinctrl0 {
pinctrl_i2c1_default: i2c1-default {
mux {
groups = "i2c1_0_grp";
function = "i2c1";
};
conf {
groups = "i2c1_0_grp";
bias-pull-up;
slew-rate = <0>;
io-standard = <1>;
};
};
};
在kernel的makemenuconfig里面选中关于DS3232的驱动;
<*> Dallas/Maxim DS3232/DS3234
如下图:
然后编译kernel和dts文件。上电启动,第一次使用的时候,才能会报错如下:
# hwclock
hwclock: RTC_RD_TIME: Invalid or incomplete multibyte or wide character
这里就需要把系统的时间设置到时钟芯片或主芯片自带的rtc里面去,如下
#hwclock –w
然后rtc就可以用了。
如果在调试过程中,内核启动log没有打印出关于ds3232的信息,那么就需要用示波器看一下I2C总线上的地址了,是不是0X68,然后是NCK还是ACK,判断硬件是否存在问题。