huangdog 发表于 2023-6-13 20:25:00

SDQ单总线协议如何用STM32通过软件模拟实现(或者叫IDBUS协议)

SDQ协议,和1-wire协议类似,也是一个单总线协议,甚至时序上也有类似的地方。

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

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



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


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

https://nyansatan.github.io/lightning/这是另一个帖子,可以参考较为完整的SDQ的协议描述

7073640 发表于 2023-6-13 20:29:31

屏蔽中断,死循环处理都不行?这都不行就要给MCU提速啊

youkebing 发表于 2023-6-14 07:37:52

定时器,比较,捕获,dma,用全应该可以

darthmike 发表于 2023-7-22 11:40:22

请问楼主最后解决了STM32捕获SDQ的问题了嘛

huangdog 发表于 2023-7-22 12:41:30

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

已经搞定了,不过不是很完美

darthmike 发表于 2023-7-24 10:59:54

huangdog 发表于 2023-7-22 12:41
已经搞定了,不过不是很完美
(引用自5楼)

能细说请教下大概的实现思路嘛

darthmike 发表于 2023-7-24 11:01:56

huangdog 发表于 2023-7-22 12:41
已经搞定了,不过不是很完美
(引用自5楼)

我也是类似的问题,来不及处理下一位数据就来了,不知道怎么办好{:sad:}

iamseer 发表于 2023-7-25 21:19:52

这信号才100K,如果不上中断,从收到break开始就阻塞式查询,用定时器计时应该没有问题。我最近研究了一下USB PD的软件实现,40M时钟的51可以用C代码实现300K BMC的解码,如果是用汇编24M时钟也够了。这还是在外设匮乏的情况下纯软件的结果。
如果是32位MCU,那IO变化触发定时器内容用DMA往内存里写,代码检查内存里抓取的计时器数据。这样应该对CPU时钟要求很低,一边DMA抓数据,代码一边解析应该都可以。

darthmike 发表于 2023-7-26 09:19:44

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

主要我试了定时器中断最快进出就得1Us了

darthmike 发表于 2023-7-26 09:24:45

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

比如紧挨着的两个边沿,完全有可能只相隔不到2us,而光是IO口的读取+定时器的读取可能时间都超过了

iamseer 发表于 2023-7-26 16:06:10

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

你是不是用库进行的操作?试试直接读寄存器,没理由超过几个时钟周期。

darthmike 发表于 2023-7-26 18:30:17

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

不是,我直接赋值的IDR和定时器的CNT寄存器给一个数组缓存,就两句。用的STM32G070

tomzbj 发表于 2023-7-27 15:28:31

先看能不能用uart模拟吧, 都是10个us, 低7高3那就是0xc0, 低2高8那就是0xfe. 两条线并联,开漏加上拉, 试试?

duxingkei 发表于 2023-7-30 21:34:19

用树莓派的pico rp2040直接编写此时序的解码器,估计会很爽

huangdog 发表于 2023-7-30 21:37:01

国外确实是用树莓派写的,但是用STM32也是可以干的,我这边已经实现了

smallwood 发表于 2023-7-30 23:33:45

100kbps资料接收用STM32G030卓卓有余了,我用pwm capture + dma功能,就可以解码超过4Mbps的BMC数据

wxws 发表于 2023-7-31 04:00:59

duxingkei 发表于 2023-7-30 21:34
用树莓派的pico rp2040直接编写此时序的解码器,估计会很爽
(引用自14楼)

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

干这种时序非常方便。用stm就是一个个定时器去凑,太累了
页: [1]
查看完整版本: SDQ单总线协议如何用STM32通过软件模拟实现(或者叫IDBUS协议)