RPi CM4 關閉開啟I2C1與I2C0 Pin腳功能發生衝突
前言
本篇內容主要介紹如何同時關閉I2C1又啟用I2C0。
前提準備
一塊已經裝好RPi OS的樹梅派板子。
開啟I2C功能
使用raspi-config來開啟I2C interface。如下指令。
~$ sudo raspi-config
下面請選擇3 Interface Options。
Raspberry Pi Compute Module 4 Rev 1.0
┌─────────┤ Raspberry Pi Software Configuration Tool (raspi-config) ├──────────┐
│ │
│ 1 System Options Configure system settings │
│ 2 Display Options Configure display settings │
│ 3 Interface Options Configure connections to peripherals │
│ 4 Performance Options Configure performance settings │
│ 5 Localisation Options Configure language and regional settings │
│ 6 Advanced Options Configure advanced settings │
│ 8 Update Update this tool to the latest version │
│ 9 About raspi-config Information about this configuration tool │
│ │
│ │
│ │
│ │
│ │
│ <Select> <Finish> │
│ │
└──────────────────────────────────────────────────────────────────────────────┘
下面請選擇I5 I2C
┌─────────┤ Raspberry Pi Software Configuration Tool (raspi-config) ├──────────┐
│ │
│ I1 Legacy Camera Enable/disable legacy camera support │
│ I2 SSH Enable/disable remote command line access using SSH │
│ I3 VNC Enable/disable graphical remote access using RealVNC │
│ I4 SPI Enable/disable automatic loading of SPI kernel module │
│ I5 I2C Enable/disable automatic loading of I2C kernel module │
│ I6 Serial Port Enable/disable shell messages on the serial connection │
│ I7 1-Wire Enable/disable one-wire interface │
│ I8 Remote GPIO Enable/disable remote access to GPIO pins │
│ │
│ │
│ │
│ │
│ │
│ <Select> <Back> │
│ │
└──────────────────────────────────────────────────────────────────────────────┘
下面請選擇Yes
┌──────────────────────────────────────────────────────────┐
│ │
│ Would you like the ARM I2C interface to be enabled? │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ <Yes> <No> │
│ │
└──────────────────────────────────────────────────────────┘
我們去/boot/config.txt會發現多了一行設定參數
~$ cat /boot/config.txt |grep i2c
dtparam=i2c_arm=on
dtparam是設定dts的參數,這邊device tree開啟I2C,所以我們可以到/dev底下看是否有長出i2c設備出來。
$ ls /dev/i2c*
/dev/i2c-1
看到確實有i2c interface。
我們上面發現設定raspi-config 啟用i2c其實是去/boot/config.txt中開啟dtparam=i2c_arm=on
也就是說我們也可以不使用raspi-config,直接在/boot/config.txt中修改dtparam=i2c_arm=on/off來啟閉i2c1。
那為什麼他是開啟i2c1而不是i2c0呢?
前面提到dtparam其實是設定dts,所以我們去查rpi的dts source code。如下圖。
有此可知i2c_arm是i2c1, i2c_vc是i2c0。
開啟I2C0關閉I2C1
上面我們從dts知道i2c1的label對應的是i2c_arm, i2c0對應的是i2c_vc
開啟方式是dtparam=i2c_arm=on
關閉的話我們可以看到
~$ dtparam -h i2c_arm
i2c_arm Set to "on" to enable the ARM's i2c interface
(default "off")
所以我們把原本的dtparam=i2c_arm=on刪除或是改成dtparam=i2c_arm=off。
再來開啟i2c0的話可以看到
~$ dtparam -h i2c_vc
i2c_vc Set to "on" to enable the i2c interface
usually reserved for the VideoCore processor
(default "off")
所以開啟的方式是dtparam=i2c_vc=on
修改後我的/boot/config.txt如下
# Uncomment some or all of these to enable the optional hardware interfaces
dtparam=i2c_arm=off
dtparam=i2c_vc=on
設定好之後請重新開機
我們可以看到/dev底下的i2c設備
~$ ls /dev/i2c*
/dev/i2c-0
i2c0被打開,i2c1不見了~
I2C與UART2同時啟用發生衝突
從上圖我們可以知道I2C0是ALT0 GPIO0與GPIO1,I2C1是ALT0 的GPIO2與GPIO3,而UART2是 ALT4的GPIO0~GPIO3,I2C與UART2兩者同時啟用會發生pin衝突如下log。
[ 4.952466] pinctrl-bcm2835 fe200000.gpio: pin gpio2 already requested by fe201400.serial; cannot claim for fe804000.i2c
[ 4.952501] pinctrl-bcm2835 fe200000.gpio: pin-2 (fe804000.i2c) status -22
[ 4.952521] pinctrl-bcm2835 fe200000.gpio: could not request pin 2 (gpio2) from group gpio2 on device pinctrl-bcm2711
[ 4.952540] i2c-bcm2835 fe804000.i2c: Error applying setting, reverse things back
解決方式把i2c由GPIO0~GPIO3換到GPIO44, GPIO45如下。看你是啟用i2c0還是i2c1則一填寫。因為換置GPIO44、GPIO45 I2C0和I2C1變成只能擇一使用,所以必須關閉其中一個I2C,至於關閉I2C上面已經提到。
#Enable I2C0
dtoverlay=i2c0,pins_44_45
#Enable I2C1
dtoverlay=i2c1,pins_44_45
結語
硬體驗證就是這麼簡單有趣~
留言