S3(Master)《=SDIO=》C6 (Slave)example 用例 timeout

sjhuang
Posts: 9
Joined: Fri Sep 20, 2024 8:30 am

S3(Master)《=SDIO=》C6 (Slave)example 用例 timeout

Postby sjhuang » Fri Sep 20, 2024 9:24 am

如题,这个问题刚刚在别人的帖子发了,结果自己都找不到,这里单独发一个出来,万一有好心人回答呢。。。

环境:如题:S3(Master)《=SDIO=》C6 (Slave) 使用 V5.3.1 的 examples/peripherals/sdio
物理连接,按照官网描述
S3 || C6
IO15 CMD 18
IO14 CLK 19
IO2 D0 20
IO4 D1 21
IO12 D2 22
IO13 D3 23

pullup 处理
外接 10K pullup;
或者使用 IC 内置的 pullup: 打开其配置flag:.flags = SDIO_SLAVE_FLAG_INTERNAL_PULLUP,

现象:
S3 可以发出 CLK + CMD,但 C6 总是不响应 S3 的CMD(C6 不回 Response)

目前还没有看其 SDIO 的 reg,初步dump 其中断相关的 reg,看起来是有反应的:
slc->slc0int_raw 在 Master 发 cmd 后,会变为:210000 =》2210000
但其 bit25 又是 reserved 的 !!!

Code: Select all

        /** cmd_dtc_int_st : RO; bitpos: [25]; default: 0;
         *  reserved
         */
        uint32_t cmd_dtc_int_st:1;
目前就不好继续往下看了,再下一步需要研究其 SDIO 所有 reg。
dump了部分reg,只有 slc0int_raw有变化。

Code: Select all

[color=#FF00BF]raw:2210000[/color] st:0 st1:0 ena:240ff ena1:0
slc0_done_dscr_addr:4080c248 slc0_push_dscr_addr:4080c248 slc0_dscr_cnt:0 slc0_dscr_rec_conf:3ff
slc0_len_conf:10000000 slc0_len_lim_conf:5400 slc0_rxlink_dscr:0 slc0_rxlink_dscr_bf0:0
slc0_rxpkt_e_dscr:0 slc0_rxpkt_h_dscr:0 slc0_txlink_dscr:40811eac slc0_txlink_dscr_bf0:40811e98
slc0_txpkt_e_dscr:0 slc0_txpkt_h_dscr:0

sjhuang
Posts: 9
Joined: Fri Sep 20, 2024 8:30 am

Re: S3(Master)《=SDIO=》C6 (Slave)example 用例 timeout

Postby sjhuang » Thu Sep 26, 2024 10:37 am

今天又来debug,更新一些实验信息:
【HW 】
1. 示波器观察波形
波形的level,没有问题
2. 逻辑分析仪
Master 有输出: CLK 和 CMD , Slave 没有回 CMD8 的 Response —— 一切看起来都是 SDIO slave 没有对
3. 重新购买 ESP32
ESP32 与 ESP32C6 现象一致
基本排除了芯片问题
【SW】
1. 看是不是reg 有指偏—— 结果排除
SDIO_SLCCONF0_REG = ff3cbf40 ,发现和其 spec 对得起来。。。
2. pinmux 是否设置正确—— 没有问题
确定其C6 sdio fuc = 0 即为 SDIO slave 配置,dump reg:IO_MUX_GPIOn_REG = 0xE02
Bit1 =1 IO_MUX_GPIOn_SLP_SEL 配置是否使能 GPIOn 进入睡眠模式。
Bit9=1 使能 GPIOn 的输入
Bit[11:10] 驱动强度 设置为最大
重要的 Func [14:12] = 000 , SDIO slave
3. 打开 debug level 为 Verbose
可以看到有 assert 异常,结果是临界区内有打印,暂时关闭临界区,或者把打印拿掉
4. 切换为 5.1.4 版本
没有改善
5. SDIO 1bit 模式
没有改善
6. REG polling 状况

Code: Select all

    slcconf0:ff3cbf40                 slc0token1:100000 
    slc0tx_link:0                       
    slc0_txlink_dscr:408121ec         slc0tx_link_addr:408121c4 
    slc0txfifo_pop:400                slc0_txlink_dscr_bf0:408121d8 
    slc0_txlink_dscr_bf1:c080ba80 
    slc0_rxlink_dscr:0                slc0rxfifo_push:0 
    slc0_rxlink_dscr_bf0:0            slc0_rxlink_dscr_bf1:bffbbbbb 
    slc0int_raw:2210000               slc0int_st:0 
    slc0int_st1:0                     slc0int_ena:240ff 
    slc0int_ena1:0                    slcdate:21082700
====== 目前先告一段落,暂时没有方向,后面找其他人试试,再来对问题。

sjhuang
Posts: 9
Joined: Fri Sep 20, 2024 8:30 am

Re: S3(Master)《=SDIO=》C6 (Slave)example 用例 timeout

Postby sjhuang » Fri Sep 27, 2024 12:56 am

网页太慢了,昨天发的回复还没有看到,再补一张环境图。
总结来看,应该是 C6 SDIO Controller 没有正常动起来,具体原因就暂时不花时间了。
网上看很多是提到 Pullup 电阻,与信号问题,那是基于identify 之后,切换到 DS 或者 HS 才会出现的,目前 400KHz 都不过,实在诡异。
Attachments
ESP32_S3(Master)==SDIO==C6(Slave)--CMD8_Timeout.png
ESP32_S3(Master)==SDIO==C6(Slave)--CMD8_Timeout.png (2.64 MiB) Viewed 2768 times

sjhuang
Posts: 9
Joined: Fri Sep 20, 2024 8:30 am

Re: S3(Master)《=SDIO=》C6 (Slave)example 用例 timeout

Postby sjhuang » Sun Sep 29, 2024 12:45 am

周末刷了几集【边水往事】,有一句话很应景:
念念相续,无有间断 身语意业,无有疲厌

程序员也得坚持,所以后面再挤点时间,看 SDIO Slave Controller 的使用和目前Driver 实现。
有进展再更新到这里了。

sjhuang
Posts: 9
Joined: Fri Sep 20, 2024 8:30 am

Re: S3(Master)《=SDIO=》C6 (Slave)example 用例 timeout

Postby sjhuang » Sun Sep 29, 2024 10:06 am

尽力了,今天大概理了Driver 和 TRM 描述:比较绕的逻辑是传输,是通过内存描述符与 HW 进行交互的

目前 Slave SDIO Driver大致过程
sdio_slave_driver.png
sdio_slave_driver.png (145.97 KiB) Viewed 2558 times
========= 分割线 =======================================================
目前代码主要关注 TX 就是 slave 收数据(recv)这边的状况:
前看不异常:反正debug DMA recv 描述符没有变化:owner 一直是1,就是SW 提交给 HW 后,HW 没有回写
slc0tx_link =0,强制 restart,HW 可以继续置 start。

Code: Select all

SDIO_HAL: desc:40811ec0 buf:4080b7d4( 0  0) size:80 length:0 sosf:0 eof:0 owner:1
SDIO_HAL: slc0_txlink_addr:40811ec0 slc0tx_link:40000000 slc0host_token_rdata:0
没有看到的点:
对应Master 的 CMD8 给到 Slave 预期会发生什么?
CMD8 怎么和 Slave 的 Controller 交互,这个目前没有从代码和TRM里面看到。
Controller 是通过哪个 reg 自动 回复 Master 的?
因为没有在数据阶段,所以 DMA recv 描述符即使已经给 HW 了,但是 HW 没有处理。

sjhuang
Posts: 9
Joined: Fri Sep 20, 2024 8:30 am

Re: S3(Master)《=SDIO=》C6 (Slave)example 用例 timeout

Postby sjhuang » Wed Oct 09, 2024 1:17 am

先结贴了。
目前的问题原因是两颗 IC 共地不彻底(官网说地要对接,但是没有说哪些地要对接)
  • 目前发现芯片外壳的地很重要,但单独拉线对接,可能导线有一点点电阻,导致也没有明显效果
  • 当然可能和选择的线与焊接技术的原因。。。。。
先按图短接共地,能够用
  • 正确的方式应该找到 PCB 的原理图,将同类的地对接。
  • 后续有精力的人可以分析 PCB ,找到共地的根本对策。
Image
Attachments
共地.png
共地.png (834.17 KiB) Viewed 2006 times

sjhuang
Posts: 9
Joined: Fri Sep 20, 2024 8:30 am

Re: S3(Master)《=SDIO=》C6 (Slave)example 用例 timeout

Postby sjhuang » Mon Oct 21, 2024 8:41 am

又回来更新了,这个责任心强吧,以后失业了到 ESP 取做 FAE。。。

再把一些信息补充到这里:


将 S3 更换了一个 SOC 的 Master,Response 还是不对。这个和 S3 与 C6 又有点区别。
这个就怀疑是 timing 问题了。

example 的 slave 默认 timing 为 HS 的 timing:

Code: Select all

 SDIO_SLAVE_TIMING_PSEND_PSAMPLE = 0,/**< Send at posedge, and sample at posedge. Default value for HS mode.
                                         *   If :c:macro:`SDIO_SLAVE_FLAG_HIGH_SPEED` is specified in
                                         *   :cpp:class:`sdio_slave_config_t`, this should be selected.
                                         *   Normally there's no problem using this to work in DS mode.
修改为如下,识别可以过。

Code: Select all

 SDIO_SLAVE_TIMING_NSEND_PSAMPLE,    /**< Send at negedge, and sample at posedge. Default value for DS mode and
                                         *   below. If :c:macro:`SDIO_SLAVE_FLAG_DEFAULT_SPEED` is specified in
                                         *   :cpp:class:`sdio_slave_config_t`, this should be selected.

sjhuang
Posts: 9
Joined: Fri Sep 20, 2024 8:30 am

Re: S3(Master)《=SDIO=》C6 (Slave)example 用例 timeout

Postby sjhuang » Fri Nov 01, 2024 10:58 am

近期1bit基本调试完成了,再总结一下:
常见问题:
1、普通 cmd 都没有 Response
==> C6 没有采到正确的 CMD,需要修改 C6 的 timing ,目前测试 timing 3 (NSendNSample)还不错
可能不同环境不一样,但是就4种配置,试吧;
都不行,那么考虑外接 Pullup 电阻(内置config 的pullup 也可以先配置上.flags = SDIO_SLAVE_FLAG_INTERNAL_PULLUP)

2、初始化几个 CMD 有异常
==> 让 Master 切换到 1 bit

3、初始化 CMD 都过(CMD0,5,3,7, 包括获取 CIS 的 CMD52 ),CMD53 不过
这种就是后期遇到的问题,原因是没有外接 3.3V 的 Pullup 电阻

============================== 再多写一些过程,后面肯定有人踩坑,可以参考的。。。
就这么多了,其中最耗时的就是 timing 与上拉电阻
Slave 的timing设置,因为NSendNSampe是真的 NSend,但是其 Sample 看起来不是,非常奇怪,。。。
另外多提一点:一般 Master 在默认速度(识别阶段)是下降沿发数据与采样,这样如果 C6 也改成下降沿采数据,理论有风险,但目前的确要设置为 Nsample。
一般 Master 在跑 HS 会切换到 上升沿进行采样数据与发送数据,但 C6 example 还是写死的。。。看其 SPEC 有在切换到 HS ,自动改变时序的功能,这个参考代码没有做,我也不调了。

上拉电阻话题就更长了,用 C6 搭配 S3 ,把他们内置的Pullup 设置好,就可以传输了。
但搭配另外一个 Master,打死 CMD53 不吐数据到 D0,Master 发送正确的数据到 D0,Slave 也看不到。。。
但是其 CMD53 的 Response 返回得明明白白——这说明啥,说明 CMD 是收到了的,但是 HW 就是没有表示(就像这个论坛,可能有人知道问题,但是就是没有输出。。。)
憋到最后去看 C6 Slave 代码
debug就是其 CMD53 没有中断触发,所以就是没有经验,这下有经验了,这种情况就是物理无法驱动,需要 Pullup 电阻。

就写这么多吧,什么 HS4 bit 还没有通?
最近没有时间搞这个了,真的准备做其它项目了,要将精力投给 unisoc 的芯片了。

Who is online

Users browsing this forum: No registered users and 53 guests