在拿到一个全新的硬件设计,SDIO 主从机芯片均未使用过的情况下,测试 SDIO 通信存在问题,可以做如下排查:
1、SDIO 主机无法识别从机
由于 SDIO 识别设备只用到 CLK\CMD 两个,且识别过程时钟频率仅 400KHz,所以对硬件走线基本没有要求。所以硬件上我们通常只要检查确保双方的 CLK\CMD 正确接通即可(当然如果主从机的 IO 上均没有内部上拉使能的情况下,硬件上应当在 CMD 信号上加上外部上拉电阻)。
硬件检查完后,仍无法正确识别到从机,则检查主从机的软件。 SDIO 驱动本身由芯片厂家编写并测试过,所以 SDIO 驱动本身存在问题的可能性比较低。我们主要检查确认 IO 配置是否正确。
2、SDIO 主机识别到从机后,无法正常通信
SDIO 主机识别到从机后,通常会将时钟频率提高。为排除时序影响,我们可以将 SDIO 主机驱动配置的时钟频率降低为几 MHz(甚至与识别过程频率一样 400KHz)进行测试
同样注意 D0-D3 上是否有上拉电阻,检查信号连通性,IO 配置是否正确。如果是使用的 SDIO 单线模式,理论上通常只需要检查 D0\D1 两个信号配置。但最近支持一个客户调试,使用君正的主控,设备树中 IO 只配置了 CLK\CMD\D0\D1,即使驱动配置使用单线模式,仍不能正常通信。这个主控还有另一个奇怪的地方,驱动使用四线模式,在 D2\D3 没有配置 IO 的情况下,无法正常通信也是符合预期的,但在主机识别并正确挂载上设备驱动后(在无法正常通信的情况下,通常设备驱动无法完成挂载,可以修改设备驱动的 SDIO 适配接口,在调用读写超过一字节接口的地方,返回失败的时候,换用 SDIO 读写单字节的接口重试。原理是读写单字节是使用的 CMD52 指令操作,该指令仅使用 CLK/CMD 信号完成读写操作),使从机重新初始化 D1 的 IO,手动使 D1 信号拉低,仍无法触发主机的 SDIO 中断。可能是君正软件或者硬件方面的 BUG 。
3、SDIO 能够正常通信,但通信不太稳定
有的硬件走线较差,CLK 信号可能存在过冲、振铃,导致从机识别到错误的 CLK 信号。可以在 CLK 信号上串联一个几十Ω 的电阻(如 22Ω、33Ω。如果 CLK 时钟最高不超过 50MHz 情况下,甚至可以用 100Ω 都可以)
查看主从机的对 SDIO 时序的说明,确定双方时序是否匹配。可以查看主从机是否有调整时序的配置,调整测试