【已解】添加光感bh1750发现i2c controller超时 —— PINMUX_CONFIG

1 引脚连接:

bh1750  |  duo 
vcc     |  3.3v(out)
gnd     |  gnd
scl     |  gpio0(gpio28)
sda     |  gpio1(gpio29)
addr    |  gnd

gpio28为芯片的io序号,gpio0为小板的io序号

查看io默认状态
duo-buildroot-sdk\build\boards\cv180x\cv1800b_milkv_duo_sd\u-boot\cvi_board_init.c

	PINMUX_CONFIG(IIC0_SDA, XGPIOA_29);
	PINMUX_CONFIG(IIC0_SCL, XGPIOA_28);

!!补充内容

上述配置会导致i2c0无法加载成功,报错提示i2c超时。
尝试更改为如下内容。

	PINMUX_CONFIG(IIC0_SDA, IIC0_SDA);
	PINMUX_CONFIG(IIC0_SCL, IIC0_SCL);

如图引脚名称为IIC0_SDA,可以复用为左边框住的内容,通过PINMUX_CONFIG配置即可。

2 添加dts

duo-buildroot-sdk\build\boards\cv180x\cv1800b_milkv_duo_sd\dts_riscv\cv1800b_milkv_duo_sd.dts

&i2c0 {
    status = "okay";
    bh1750:bh1750@23 {
        compatible = "rohm,bh1750";
        reg = <0x23>;
        status = "okay";
    };
};

3 打开config

duo-buildroot-sdk\build\boards\cv180x\cv1800b_milkv_duo_sd\cv1800b_milkv_duo_sd_defconfig

CONFIG_IIO=y
CONFIG_BH1750=y

iio一定要添加,驱动添加流程如下

duo-buildroot-sdk\linux_5.10\drivers\Makefile
obj-$(CONFIG_IIO)		+= iio/

duo-buildroot-sdk\linux_5.10\drivers\iio\Makefile
obj-y += light/

duo-buildroot-sdk\linux_5.10\drivers\iio\light\Makefile
obj-$(CONFIG_BH1750)		+= bh1750.o

4 查看编译log

CC drivers/iio/light/bh1750.o

5 查看设备中驱动和dts加载

[root@milkv]/# find | grep bh1750
find: ./proc/2874: No such file or directory
./sys/bus/i2c/drivers/bh1750
./sys/bus/i2c/drivers/bh1750/uevent
./sys/bus/i2c/drivers/bh1750/bind
./sys/bus/i2c/drivers/bh1750/unbind
./sys/firmware/devicetree/base/i2c@04000000/bh1750@23
./sys/firmware/devicetree/base/i2c@04000000/bh1750@23/compatible
./sys/firmware/devicetree/base/i2c@04000000/bh1750@23/status
./sys/firmware/devicetree/base/i2c@04000000/bh1750@23/reg
./sys/firmware/devicetree/base/i2c@04000000/bh1750@23/name

看起来dts和驱动都有添加到,但是使用i2cdetect -yr 0没有看到i2c地址,查看log才发现i2c0 time out了。

6 报错

[root@milkv]~# dmesg
[    1.943778] i2c_designware 4000000.i2c: controller timed out
[    1.949738] bh1750: probe of 0-0023 failed with error -110

请为有没有朋友遇到过这种问题,是否可以帮忙解答,感谢~

我也是iic0一直timeout,但是我用的是iic1,我的imx219在iic1可以检测到,楼主试试换到iic1呢

1 Like

好的,感谢,那看来不是个例了。
默认的i2c1应该是用小板的14、15引脚吧。

	PINMUX_CONFIG(PAD_MIPIRX1P, IIC1_SDA); // I2C 2
	PINMUX_CONFIG(PAD_MIPIRX0N, IIC1_SCL);
1 Like

简单的i2c oled 驱动尝试 - Duo - MilkV Community

这个帖子好像可以解决i2c0失败的问题。

build\boards\cv180x\cv1800b_milkv_duo_sd\u-boot\cvi_board_init.c

	PINMUX_CONFIG(IIC0_SDA, IIC0_SDA);
	PINMUX_CONFIG(IIC0_SCL, IIC0_SCL);

将IIC0的引脚mux回来。

看电路图像是引脚名称为IIC0_SCL,可以复用为多个,通过PINMUX_CONFIG可以指定。

我还没试,今晚回去编译试试看。

1 Like

已验证,设置后i2c0可以起来
image
就是不知道为什么56会出现。
UU表示驱动已经被加载了,其中bh1750的addr接地时i2c地址为0x23.

pinmux可以不用改代码,用这个帖子里的工具动态配置就可以

Milk-V Duo 引脚复用配置工具 cvi_pinmux

0x56是芯片内部集成的一个Debug模块,可以忽略之~

1 Like

好的,感谢解惑,学习了。
工具很好用,配置方便。