amobbs.com 阿莫电子技术论坛

标题: SDQ单总线协议如何用STM32通过软件模拟实现(或者叫IDBUS协议) [打印本页]

作者: huangdog    时间: 2023-6-13 20:25
标题: SDQ单总线协议如何用STM32通过软件模拟实现(或者叫IDBUS协议)
SDQ协议,和1-wire协议类似,也是一个单总线协议,甚至时序上也有类似的地方。

但是现在LA抓取的波形分析,SDQ协议通信速率比较高,每个数据比特10us时间,低7高3逻辑0,低2高8逻辑1,外加一些break/stop等控制信号。

现在用STM32的定时器捕捉或者外部中断,都存在来不及处理数据的情况,想看看各位有啥办法可以软件模拟的方式来完成通信。

[attach]620648[/attach]

最后一个字节高电平时间比较长,是有一个stop信号。


SDQ主要用在苹果lightning接口通信上,也有一个使用SDQ的EEPROM可以参考,BQ2026,具体可以看TI的官网,但是协议和这个有有一点区别,速率也没有苹果的SDQ速度高。

https://nyansatan.github.io/lightning/  这是另一个帖子,可以参考较为完整的SDQ的协议描述
作者: 7073640    时间: 2023-6-13 20:29
屏蔽中断,死循环处理都不行?这都不行就要给MCU提速啊
作者: youkebing    时间: 2023-6-14 07:37
定时器,比较,捕获,dma,用全应该可以
作者: darthmike    时间: 2023-7-22 11:40
请问楼主最后解决了STM32捕获SDQ的问题了嘛

作者: huangdog    时间: 2023-7-22 12:41
darthmike 发表于 2023-7-22 11:40
请问楼主最后解决了STM32捕获SDQ的问题了嘛
(引用自4楼)

已经搞定了,不过不是很完美
作者: darthmike    时间: 2023-7-24 10:59
huangdog 发表于 2023-7-22 12:41
已经搞定了,不过不是很完美
(引用自5楼)

能细说请教下大概的实现思路嘛
作者: darthmike    时间: 2023-7-24 11:01
huangdog 发表于 2023-7-22 12:41
已经搞定了,不过不是很完美
(引用自5楼)

我也是类似的问题,来不及处理下一位数据就来了,不知道怎么办好
作者: iamseer    时间: 2023-7-25 21:19
这信号才100K,如果不上中断,从收到break开始就阻塞式查询,用定时器计时应该没有问题。我最近研究了一下USB PD的软件实现,40M时钟的51可以用C代码实现300K BMC的解码,如果是用汇编24M时钟也够了。这还是在外设匮乏的情况下纯软件的结果。
如果是32位MCU,那IO变化触发定时器内容用DMA往内存里写,代码检查内存里抓取的计时器数据。这样应该对CPU时钟要求很低,一边DMA抓数据,代码一边解析应该都可以。
作者: darthmike    时间: 2023-7-26 09:19
iamseer 发表于 2023-7-25 21:19
这信号才100K,如果不上中断,从收到break开始就阻塞式查询,用定时器计时应该没有问题。我最近研究了一下U ...
(引用自8楼)

主要我试了定时器中断最快进出就得1Us了
作者: darthmike    时间: 2023-7-26 09:24
iamseer 发表于 2023-7-25 21:19
这信号才100K,如果不上中断,从收到break开始就阻塞式查询,用定时器计时应该没有问题。我最近研究了一下U ...
(引用自8楼)

比如紧挨着的两个边沿,完全有可能只相隔不到2us,而光是IO口的读取+定时器的读取可能时间都超过了
作者: iamseer    时间: 2023-7-26 16:06
darthmike 发表于 2023-7-26 09:24
比如紧挨着的两个边沿,完全有可能只相隔不到2us,而光是IO口的读取+定时器的读取可能时间都超过了 ...
(引用自10楼)

你是不是用库进行的操作?试试直接读寄存器,没理由超过几个时钟周期。
作者: darthmike    时间: 2023-7-26 18:30
iamseer 发表于 2023-7-26 16:06
你是不是用库进行的操作?试试直接读寄存器,没理由超过几个时钟周期。 ...
(引用自11楼)

不是,我直接赋值的IDR和定时器的CNT寄存器给一个数组缓存,就两句。用的STM32G070
作者: tomzbj    时间: 2023-7-27 15:28
先看能不能用uart模拟吧, 都是10个us, 低7高3那就是0xc0, 低2高8那就是0xfe. 两条线并联,开漏加上拉, 试试?
作者: duxingkei    时间: 2023-7-30 21:34
用树莓派的pico rp2040直接编写此时序的解码器,估计会很爽
作者: huangdog    时间: 2023-7-30 21:37
国外确实是用树莓派写的,但是用STM32也是可以干的,我这边已经实现了
作者: smallwood    时间: 2023-7-30 23:33
100kbps资料接收用STM32G030卓卓有余了,我用pwm capture + dma功能,就可以解码超过4Mbps的BMC数据
作者: wxws    时间: 2023-7-31 04:00
duxingkei 发表于 2023-7-30 21:34
用树莓派的pico rp2040直接编写此时序的解码器,估计会很爽
(引用自14楼)

2040确实好用。我今年项目上基本都用这款了。

干这种时序非常方便。用stm就是一个个定时器去凑,太累了




欢迎光临 amobbs.com 阿莫电子技术论坛 (https://www.amobbs.com/) Powered by Discuz! X3.4