Share on:

2 分鐘閱讀

前言

本篇內容主要介紹如何同時關閉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。如下圖。

CM4_i2c_label_name

有此可知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同時啟用發生衝突

CM4_Alternative_function_assignments 從上圖我們可以知道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

結語

硬體驗證就是這麼簡單有趣~

留言