外设接口模块开始深入探索

## 🎛️ 外设接口模块探索指南

> 本章节聚焦树莓派的 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 显示屏

🧪 探索任务
  1. 启用 SPI 接口(raspi-config/boot/config.txt

  2. 连接一个 SPI 设备(如 MCP3008)

  3. 安装工具:sudo apt install python3-spidev

  4. 编写测试脚本读取 SPI 数据

  5. 查看模块状态:

    bash

    lsmod | grep spi
    cat /sys/module/spidev/parameters/*
    
✅ 打卡状态:☐ 未完成

💾 模块 3:mmcblk, sdhci

  • 功能:SD 卡控制器与块设备驱动

  • 用途:管理 microSD 卡的读写与挂载

🧪 探索任务
  1. 插拔 microSD 卡,观察 /dev/mmcblk0 是否出现

  2. 查看挂载信息:

    bash

    lsblk
    dmesg | grep mmc
    
  3. 查看模块状态:

    bash

    lsmod | grep sdhci
    cat /sys/module/sdhci/parameters/*
    
✅ 打卡状态:☐ 未完成

📌 小贴士

  • 所有接口都可通过 /boot/config.txt 控制启用:

    ini

    dtparam=i2c_arm=on
    dtparam=spi=on
    
  • 使用 modinfo 模块名 可查看模块描述与参数

  • 可用 echo 模块名 > /sys/module/... 动态加载或卸载模块(需谨慎)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值