## 🎛️ 外设接口模块探索指南
> 本章节聚焦树莓派的 I2C、SPI 和 SD 卡接口相关内核模块,帮助你理解它们的用途并进行实际测试。
---
### 🔌 模块 1:`i2c_bcm2835`
- **功能**:树莓派的 I2C 控制器驱动模块
- **用途**:连接 I2C 设备,如温湿度传感器、OLED 屏幕等
#### 🧪 探索任务
1. 启用 I2C 接口(使用 `raspi-config` 或编辑 `/boot/config.txt`)
2. 连接一个 I2C 设备(如 BMP280)
3. 安装工具:`sudo apt install i2c-tools`
4. 执行命令:
```bash
i2cdetect -y 1
pi@raspberrypi:/sys/module/i2c_bcm2835$ i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- UU -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
这意味着在地址 0x1A 出现了 UU,其含义如下:
🔍 什么是 UU?
-
UU表示该地址上的设备已被内核驱动占用,即:-
设备已被某个内核模块或用户空间程序绑定
-
i2cdetect无法探测该地址,因为它不能访问已占用的设备
-
🧩 说明与分析
-
地址
0x1A是常见的音频编解码器(如 WM8960)的 I2C 地址 -
如果你连接了类似的 I2C 音频模块,并启用了相关驱动(如
snd_soc_wm8960),就会出现UU -
你可以确认绑定情况:
bash
ls /sys/bus/i2c/devices/ cat /sys/bus/i2c/devices/1-001a/name
pi@raspberrypi:/sys/module/i2c_bcm2835$ ls /sys/bus/i2c/devices/
1-001a i2c-1
pi@raspberrypi:/sys/module/i2c_bcm2835$ cat /sys/bus/i2c/devices/1-001a/name
wm8960
使用WM8960来播放,最好是通过amixer 来控制
#!/bin/bash
echo "🔍 正在自动检测 WM8960 声卡编号..."
CARD=$(aplay -l | grep -i wm8960 | awk '{print $2}' | tr -d ':')
if [ -z "$CARD" ]; then
echo "❌ 未找到 WM8960 声卡,请确认驱动和 overlay 是否启用"
exit 1
fi
echo "✅ 检测到 WM8960 声卡编号为: $CARD"
echo "🔧 初始化音量与通道设置..."
# 设置耳机与扬声器音量
amixer -c $CARD sset 'Headphone' 100% > /dev/null 2>&1
amixer -c $CARD sset 'Speaker' 100% > /dev/null 2>&1
# 启用左右 PCM 输出
amixer -c $CARD sset 'Left Output Mixer PCM' on > /dev/null 2>&1
amixer -c $CARD sset 'Right Output Mixer PCM' on > /dev/null 2>&1
# 设置主播放音量
amixer -c $CARD sset 'Playback' 100% > /dev/null 2>&1
# 关闭 -6dB 衰减(如支持)
amixer -c $CARD sset 'PCM Playback -6dB' off > /dev/null 2>&1
echo "🔎 正在搜索 Kalimba.wav 文件..."
WAV_FILE=$(find . -type f -name "Kalimba.wav" | head -n 1)
if [ -z "$WAV_FILE" ]; then
echo "⚠️ 未找到 Kalimba.wav,请确认文件是否存在于当前目录及子目录中"
exit 1
fi
echo "🎼 播放音频文件: $WAV_FILE"
aplay -D plughw:$CARD,0 "$WAV_FILE"
echo "✅ 播放完成"
✅ 下一步建议
-
如果你只是测试 I2C 接口是否工作,出现
UU是好事,说明设备已识别并被驱动 -
如果你想手动访问该设备(比如用 Python 脚本),需要确保没有冲突的驱动占用
lsmod | grep i2c_bcm2835
cat /sys/module/i2c_bcm2835/parameters/*
模块 2:spi_bcm2835, spidev
-
功能:SPI 控制器驱动与用户空间接口
-
用途:连接 SPI 设备,如 MCP3008 ADC、TFT 显示屏
🧪 探索任务
-
启用 SPI 接口(
raspi-config或/boot/config.txt) -
连接一个 SPI 设备(如 MCP3008)
-
安装工具:
sudo apt install python3-spidev -
编写测试脚本读取 SPI 数据
-
查看模块状态:
bash
lsmod | grep spi cat /sys/module/spidev/parameters/*
✅ 打卡状态:☐ 未完成
💾 模块 3:mmcblk, sdhci
-
功能:SD 卡控制器与块设备驱动
-
用途:管理 microSD 卡的读写与挂载
🧪 探索任务
-
插拔 microSD 卡,观察
/dev/mmcblk0是否出现 -
查看挂载信息:
bash
lsblk dmesg | grep mmc -
查看模块状态:
bash
lsmod | grep sdhci cat /sys/module/sdhci/parameters/*
✅ 打卡状态:☐ 未完成
📌 小贴士
-
所有接口都可通过
/boot/config.txt控制启用:ini
dtparam=i2c_arm=on dtparam=spi=on -
使用
modinfo 模块名可查看模块描述与参数 -
可用
echo 模块名 > /sys/module/...动态加载或卸载模块(需谨慎)
982

被折叠的 条评论
为什么被折叠?



