DSSS信号特征提取方法

前言:
  这篇文章从通讯接收方角度来说明接收DSSS信号过程中,若产生了干扰信号我们该如何去识别干扰并分辨出正确的信号。如果你苦于DSSS信号中的干扰太多,接收方不知该如何提取出正确信号,那么请阅读这篇文章。

1 什么是DSSS信号?

  DSSS(Direct Sequence Spread Spectrum)就是直接序列扩频。系统将要发送的信号用PN码扩频到一个很宽的频带上去,而接收方用相同的PN码接扩回原始数据。简单来说就是你要发送数据0b(二进制),那么实际发送的可能为一串二进制比如001100111110b,如果要发送数据1b,那么实际发送的可能是010011000001b。反过来接收方接收到001100111110b就知道是数据0b,接收到010011000001b就知道是数1b。
  数据0b对应的发送数据是001100111110b,这串数据在传输过程中的波形是什么样的?DSSS码是按照二进制进行传输,单位时间一般是1us,00b就表示持续2us的低电平,11b就表示持续2us的高电平。数据0b和1b对应的波形就为:

DSSS信号特征提取方法

前言:
  这篇文章从通讯接收方角度来说明接收DSSS信号过程中,若产生了干扰信号我们该如何去识别干扰并分辨出正确的信号。如果你苦于DSSS信号中的干扰太多,接收方不知该如何提取出正确信号,那么请阅读这篇文章。

1 什么是DSSS信号?

  DSSS(Direct Sequence Spread Spectrum)就是直接序列扩频。系统将要发送的信号用PN码扩频到一个很宽的频带上去,而接收方用相同的PN码接扩回原始数据。简单来说就是你要发送数据0b(二进制),那么实际发送的可能为一串二进制比如001100111110b,如果要发送数据1b,那么实际发送的可能是010011000001b。反过来接收方接收到001100111110b就知道是数据0b,接收到010011000001b就知道是数1b。
  数据0b对应的发送数据是001100111110b,这串数据在传输过程中的波形是什么样的?DSSS码是按照二进制进行传输,单位时间一般是1us,00b就表示持续2us的低电平,11b就表示持续2us的高电平。数据0b和1b对应的波形就为:

0b 1b waveform.png

2 单片机如何去识别DSSS信号?

  DSSS信号理论上也属于数字信号(实际通讯传输是模拟信号),由高低电平以及高低电平之间的边沿变化组成。要去捕获到这种信号的波形有两个方向,一种是使用高速的ADC去密集采样,一种是通过单片机的PWM捕获去捕获上升下降沿。

2.1 使用高速ADC采样

  根据采样定律(奈奎斯特),在对模拟信号转数字信号的过程中,当采样频率大于信号中最高频率的2倍以上时(实际运用一般是2.56~4倍),采样后的数字信号能完整的保留原始信号中的信息。

0b waveform ADC.png

  我们假设上图中虚线部分的一个线段表示一次ADC对信号的采样,只要采样速率足够,就可以完整保留出信号的特征。但是这种方式会带来两个弊端。

2.1.1 对ADC采样速率要求高

  假设我们的DSSS码信号的传输时间单位是1us,那么信号的最高频率就是1MHz,根据采样定律ADC的采样速率要达到2MHz才能不失真原信号的内容,实际2.5MHz以上才会有较好的效果。这对单片机ADC性能提出较高的要求,基本上低功耗的M0内核单片机是没指望了。即便使用了带高速ADC的单片机,这么高频率的ADC采样,单片机功耗后期会是头疼的问题。

2.1.2 对单片机CPU运算性能提出较高的要求

  即使使用了ADC采样速率2.5MHz的单片机,每1us将产生2.5个数据,采样每1ms信号将产生2500个数据。要对这些数据进行判断是杂波还是DSSS信号,如果是DSSS信号还需要提取出里面的数据内容,这对单片机CPU的运算速度要求非常高,搞不好会出现数据处理速度还没有采样新增数据快。即便使用了高速运算性能的单片机,这么高的运算速度对功耗消耗将会非常大。

2.2 使用PWM捕获去抓取信号的边沿跳变

2.2.1 关注点是边沿的时间间隔

  使用PWM捕获去抓取信号的边沿跳变。如下图:

0b 1b waveform_edge.png

  DSSS理论上是方波形式,但是不同于传统的PWM,它没有固定的频率,频率是根据发送的数据内容在变化的。根据这些特性我们关注的数据不再是DSSS码直接相关的几个0或几个1,而是相邻两个上升沿时间的时间间隔。比如当我们采集到信号的上升沿时间间隔是46时,对应数据应该是0b,时间间隔数据是37时,对应数据是1b。同样的,也可以使用信号的下降沿时间间隔。
  这样既避免了高速ADC的使用,又使得数据量大大减少节省了CPU运算时间。

2.2.2 单片机具体实现方法

2.2.2.1 使用单片机的电压比较器

  由于DSSS码理论上是数字信号,但是实际传输中往往是数字信号形式,比如在主动笔和屏之间的无线传输,随着距离远近信号的幅值有高低变化。传输过程中也往往伴随着一些噪声干扰。另外不同的样品之间也存在差异,可能100支笔当中有一部分接收能力略强,信号幅值比其余样品大。所以我们使用比较器的原因是设置动态的阈值来划分高低电平,以此来找到信号的上升下降沿。因为阈值需要动态适应,所以需要一些自适应阈值算法,但不会太复杂。

2.2.2.2 使用单片机的定时器去记录间隔时间

  通过比较器我们已经能抓到信号的边沿了,比如上升沿,在上升沿时触发(可以是中断方式也可以用事件触发,建议用事件去触发,这样节省cpu)读取定时器的计数值然后清零定时器。这样既能记录下每次间隔时间,实现循环计时。

2.2.2.3 如何知道DSSS信号的起始位置和结束

  将比较器使能,第一次触发上升沿之后连续接收一定数据,比如5个上升沿间隔时间,判断这五个是否符合DSSS信号特征,如果不符合那就认为是其他杂波,将其忽略。如果符合那就说明找到了DSSS信号,需要继续铺货其余的时间间隔。从第一上升沿开始,将Timer1和Timer2定时器开启计时功能。Timer1用于计时间隔时间,Timer2用于计时并设置一个超时中断,当Timer2计时溢出并中断时,认为DSSS信号已经结束。

  具体的流程图如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{% mermaid %}
flowchart TB
St([开始]) --> OpStartCmp[启动比较器]
OpStartCmp --> IsFirstUpEdge{捕获到第一个上升沿?}
IsFirstUpEdge --yes--> OpFirstUpEdge[开启Timer1和Timer2开始计时]
IsFirstUpEdge --no--> IsFirstUpEdge
OpFirstUpEdge --> IsOthertUpEdge{捕获到上升沿?}
IsOthertUpEdge --yes--> OpOtherUpEdege[通过DMA获取Timer1的计数值, 然后清零Timer1和Timer2]
IsOthertUpEdge --no--> IsTimer2Over{Timer2超时?}
IsTimer2Over --no--> IsOthertUpEdge
IsTimer2Over --yes--> OpReCap[清零并停止Timer1和Timer2]
OpReCap(right) --> IsFirstUpEdge
OpOtherUpEdege --> IsCapNum{捕获到一定数量并分析是否符合DSSS码?}
IsCapNum --yes--> IsOthertUpEdge
IsCapNum --no--> OpReCap
OpReCap(bottom) --> OpGetData[提取出数据]
OpGetData --> IsContinue{继续下一轮接收?}
IsContinue --yes--> IsFirstUpEdge
IsContinue --no--> E([结束])
{% endmermaid %}

2 单片机如何去识别DSSS信号?

  DSSS信号理论上也属于数字信号(实际通讯传输是模拟信号),由高低电平以及高低电平之间的边沿变化组成。要去捕获到这种信号的波形有两个方向,一种是使用高速的ADC去密集采样,一种是通过单片机的PWM捕获去捕获上升下降沿。

2.1 使用高速ADC采样

  根据采样定律(奈奎斯特),在对模拟信号转数字信号的过程中,当采样频率大于信号中最高频率的2倍以上时(实际运用一般是2.56~4倍),采样后的数字信号能完整的保留原始信号中的信息。

DSSS信号特征提取方法

前言:
  这篇文章从通讯接收方角度来说明接收DSSS信号过程中,若产生了干扰信号我们该如何去识别干扰并分辨出正确的信号。如果你苦于DSSS信号中的干扰太多,接收方不知该如何提取出正确信号,那么请阅读这篇文章。

1 什么是DSSS信号?

  DSSS(Direct Sequence Spread Spectrum)就是直接序列扩频。系统将要发送的信号用PN码扩频到一个很宽的频带上去,而接收方用相同的PN码接扩回原始数据。简单来说就是你要发送数据0b(二进制),那么实际发送的可能为一串二进制比如001100111110b,如果要发送数据1b,那么实际发送的可能是010011000001b。反过来接收方接收到001100111110b就知道是数据0b,接收到010011000001b就知道是数1b。
  数据0b对应的发送数据是001100111110b,这串数据在传输过程中的波形是什么样的?DSSS码是按照二进制进行传输,单位时间一般是1us,00b就表示持续2us的低电平,11b就表示持续2us的高电平。数据0b和1b对应的波形就为:

0b 1b waveform.png

2 单片机如何去识别DSSS信号?

  DSSS信号理论上也属于数字信号(实际通讯传输是模拟信号),由高低电平以及高低电平之间的边沿变化组成。要去捕获到这种信号的波形有两个方向,一种是使用高速的ADC去密集采样,一种是通过单片机的PWM捕获去捕获上升下降沿。

2.1 使用高速ADC采样

  根据采样定律(奈奎斯特),在对模拟信号转数字信号的过程中,当采样频率大于信号中最高频率的2倍以上时(实际运用一般是2.56~4倍),采样后的数字信号能完整的保留原始信号中的信息。

0b waveform ADC.png

  我们假设上图中虚线部分的一个线段表示一次ADC对信号的采样,只要采样速率足够,就可以完整保留出信号的特征。但是这种方式会带来两个弊端。

2.1.1 对ADC采样速率要求高

  假设我们的DSSS码信号的传输时间单位是1us,那么信号的最高频率就是1MHz,根据采样定律ADC的采样速率要达到2MHz才能不失真原信号的内容,实际2.5MHz以上才会有较好的效果。这对单片机ADC性能提出较高的要求,基本上低功耗的M0内核单片机是没指望了。即便使用了带高速ADC的单片机,这么高频率的ADC采样,单片机功耗后期会是头疼的问题。

2.1.2 对单片机CPU运算性能提出较高的要求

  即使使用了ADC采样速率2.5MHz的单片机,每1us将产生2.5个数据,采样每1ms信号将产生2500个数据。要对这些数据进行判断是杂波还是DSSS信号,如果是DSSS信号还需要提取出里面的数据内容,这对单片机CPU的运算速度要求非常高,搞不好会出现数据处理速度还没有采样新增数据快。即便使用了高速运算性能的单片机,这么高的运算速度对功耗消耗将会非常大。

2.2 使用PWM捕获去抓取信号的边沿跳变

2.2.1 关注点是边沿的时间间隔

  使用PWM捕获去抓取信号的边沿跳变。如下图:

0b 1b waveform_edge.png

  DSSS理论上是方波形式,但是不同于传统的PWM,它没有固定的频率,频率是根据发送的数据内容在变化的。根据这些特性我们关注的数据不再是DSSS码直接相关的几个0或几个1,而是相邻两个上升沿时间的时间间隔。比如当我们采集到信号的上升沿时间间隔是46时,对应数据应该是0b,时间间隔数据是37时,对应数据是1b。同样的,也可以使用信号的下降沿时间间隔。
  这样既避免了高速ADC的使用,又使得数据量大大减少节省了CPU运算时间。

2.2.2 单片机具体实现方法

2.2.2.1 使用单片机的电压比较器

  由于DSSS码理论上是数字信号,但是实际传输中往往是数字信号形式,比如在主动笔和屏之间的无线传输,随着距离远近信号的幅值有高低变化。传输过程中也往往伴随着一些噪声干扰。另外不同的样品之间也存在差异,可能100支笔当中有一部分接收能力略强,信号幅值比其余样品大。所以我们使用比较器的原因是设置动态的阈值来划分高低电平,以此来找到信号的上升下降沿。因为阈值需要动态适应,所以需要一些自适应阈值算法,但不会太复杂。

2.2.2.2 使用单片机的定时器去记录间隔时间

  通过比较器我们已经能抓到信号的边沿了,比如上升沿,在上升沿时触发(可以是中断方式也可以用事件触发,建议用事件去触发,这样节省cpu)读取定时器的计数值然后清零定时器。这样既能记录下每次间隔时间,实现循环计时。

2.2.2.3 如何知道DSSS信号的起始位置和结束

  将比较器使能,第一次触发上升沿之后连续接收一定数据,比如5个上升沿间隔时间,判断这五个是否符合DSSS信号特征,如果不符合那就认为是其他杂波,将其忽略。如果符合那就说明找到了DSSS信号,需要继续铺货其余的时间间隔。从第一上升沿开始,将Timer1和Timer2定时器开启计时功能。Timer1用于计时间隔时间,Timer2用于计时并设置一个超时中断,当Timer2计时溢出并中断时,认为DSSS信号已经结束。

  具体的流程图如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{% mermaid %}
flowchart TB
St([开始]) --> OpStartCmp[启动比较器]
OpStartCmp --> IsFirstUpEdge{捕获到第一个上升沿?}
IsFirstUpEdge --yes--> OpFirstUpEdge[开启Timer1和Timer2开始计时]
IsFirstUpEdge --no--> IsFirstUpEdge
OpFirstUpEdge --> IsOthertUpEdge{捕获到上升沿?}
IsOthertUpEdge --yes--> OpOtherUpEdege[通过DMA获取Timer1的计数值, 然后清零Timer1和Timer2]
IsOthertUpEdge --no--> IsTimer2Over{Timer2超时?}
IsTimer2Over --no--> IsOthertUpEdge
IsTimer2Over --yes--> OpReCap[清零并停止Timer1和Timer2]
OpReCap(right) --> IsFirstUpEdge
OpOtherUpEdege --> IsCapNum{捕获到一定数量并分析是否符合DSSS码?}
IsCapNum --yes--> IsOthertUpEdge
IsCapNum --no--> OpReCap
OpReCap(bottom) --> OpGetData[提取出数据]
OpGetData --> IsContinue{继续下一轮接收?}
IsContinue --yes--> IsFirstUpEdge
IsContinue --no--> E([结束])
{% endmermaid %}

  我们假设上图中虚线部分的一个线段表示一次ADC对信号的采样,只要采样速率足够,就可以完整保留出信号的特征。但是这种方式会带来两个弊端。

2.1.1 对ADC采样速率要求高

  假设我们的DSSS码信号的传输时间单位是1us,那么信号的最高频率就是1MHz,根据采样定律ADC的采样速率要达到2MHz才能不失真原信号的内容,实际2.5MHz以上才会有较好的效果。这对单片机ADC性能提出较高的要求,基本上低功耗的M0内核单片机是没指望了。即便使用了带高速ADC的单片机,这么高频率的ADC采样,单片机功耗后期会是头疼的问题。

2.1.2 对单片机CPU运算性能提出较高的要求

  即使使用了ADC采样速率2.5MHz的单片机,每1us将产生2.5个数据,采样每1ms信号将产生2500个数据。要对这些数据进行判断是杂波还是DSSS信号,如果是DSSS信号还需要提取出里面的数据内容,这对单片机CPU的运算速度要求非常高,搞不好会出现数据处理速度还没有采样新增数据快。即便使用了高速运算性能的单片机,这么高的运算速度对功耗消耗将会非常大。

2.2 使用PWM捕获去抓取信号的边沿跳变

2.2.1 关注点是边沿的时间间隔

  使用PWM捕获去抓取信号的边沿跳变。如下图:

DSSS信号特征提取方法

前言:
  这篇文章从通讯接收方角度来说明接收DSSS信号过程中,若产生了干扰信号我们该如何去识别干扰并分辨出正确的信号。如果你苦于DSSS信号中的干扰太多,接收方不知该如何提取出正确信号,那么请阅读这篇文章。

1 什么是DSSS信号?

  DSSS(Direct Sequence Spread Spectrum)就是直接序列扩频。系统将要发送的信号用PN码扩频到一个很宽的频带上去,而接收方用相同的PN码接扩回原始数据。简单来说就是你要发送数据0b(二进制),那么实际发送的可能为一串二进制比如001100111110b,如果要发送数据1b,那么实际发送的可能是010011000001b。反过来接收方接收到001100111110b就知道是数据0b,接收到010011000001b就知道是数1b。
  数据0b对应的发送数据是001100111110b,这串数据在传输过程中的波形是什么样的?DSSS码是按照二进制进行传输,单位时间一般是1us,00b就表示持续2us的低电平,11b就表示持续2us的高电平。数据0b和1b对应的波形就为:

0b 1b waveform.png

2 单片机如何去识别DSSS信号?

  DSSS信号理论上也属于数字信号(实际通讯传输是模拟信号),由高低电平以及高低电平之间的边沿变化组成。要去捕获到这种信号的波形有两个方向,一种是使用高速的ADC去密集采样,一种是通过单片机的PWM捕获去捕获上升下降沿。

2.1 使用高速ADC采样

  根据采样定律(奈奎斯特),在对模拟信号转数字信号的过程中,当采样频率大于信号中最高频率的2倍以上时(实际运用一般是2.56~4倍),采样后的数字信号能完整的保留原始信号中的信息。

0b waveform ADC.png

  我们假设上图中虚线部分的一个线段表示一次ADC对信号的采样,只要采样速率足够,就可以完整保留出信号的特征。但是这种方式会带来两个弊端。

2.1.1 对ADC采样速率要求高

  假设我们的DSSS码信号的传输时间单位是1us,那么信号的最高频率就是1MHz,根据采样定律ADC的采样速率要达到2MHz才能不失真原信号的内容,实际2.5MHz以上才会有较好的效果。这对单片机ADC性能提出较高的要求,基本上低功耗的M0内核单片机是没指望了。即便使用了带高速ADC的单片机,这么高频率的ADC采样,单片机功耗后期会是头疼的问题。

2.1.2 对单片机CPU运算性能提出较高的要求

  即使使用了ADC采样速率2.5MHz的单片机,每1us将产生2.5个数据,采样每1ms信号将产生2500个数据。要对这些数据进行判断是杂波还是DSSS信号,如果是DSSS信号还需要提取出里面的数据内容,这对单片机CPU的运算速度要求非常高,搞不好会出现数据处理速度还没有采样新增数据快。即便使用了高速运算性能的单片机,这么高的运算速度对功耗消耗将会非常大。

2.2 使用PWM捕获去抓取信号的边沿跳变

2.2.1 关注点是边沿的时间间隔

  使用PWM捕获去抓取信号的边沿跳变。如下图:

0b 1b waveform_edge.png

  DSSS理论上是方波形式,但是不同于传统的PWM,它没有固定的频率,频率是根据发送的数据内容在变化的。根据这些特性我们关注的数据不再是DSSS码直接相关的几个0或几个1,而是相邻两个上升沿时间的时间间隔。比如当我们采集到信号的上升沿时间间隔是46时,对应数据应该是0b,时间间隔数据是37时,对应数据是1b。同样的,也可以使用信号的下降沿时间间隔。
  这样既避免了高速ADC的使用,又使得数据量大大减少节省了CPU运算时间。

2.2.2 单片机具体实现方法

2.2.2.1 使用单片机的电压比较器

  由于DSSS码理论上是数字信号,但是实际传输中往往是数字信号形式,比如在主动笔和屏之间的无线传输,随着距离远近信号的幅值有高低变化。传输过程中也往往伴随着一些噪声干扰。另外不同的样品之间也存在差异,可能100支笔当中有一部分接收能力略强,信号幅值比其余样品大。所以我们使用比较器的原因是设置动态的阈值来划分高低电平,以此来找到信号的上升下降沿。因为阈值需要动态适应,所以需要一些自适应阈值算法,但不会太复杂。

2.2.2.2 使用单片机的定时器去记录间隔时间

  通过比较器我们已经能抓到信号的边沿了,比如上升沿,在上升沿时触发(可以是中断方式也可以用事件触发,建议用事件去触发,这样节省cpu)读取定时器的计数值然后清零定时器。这样既能记录下每次间隔时间,实现循环计时。

2.2.2.3 如何知道DSSS信号的起始位置和结束

  将比较器使能,第一次触发上升沿之后连续接收一定数据,比如5个上升沿间隔时间,判断这五个是否符合DSSS信号特征,如果不符合那就认为是其他杂波,将其忽略。如果符合那就说明找到了DSSS信号,需要继续铺货其余的时间间隔。从第一上升沿开始,将Timer1和Timer2定时器开启计时功能。Timer1用于计时间隔时间,Timer2用于计时并设置一个超时中断,当Timer2计时溢出并中断时,认为DSSS信号已经结束。

  具体的流程图如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{% mermaid %}
flowchart TB
St([开始]) --> OpStartCmp[启动比较器]
OpStartCmp --> IsFirstUpEdge{捕获到第一个上升沿?}
IsFirstUpEdge --yes--> OpFirstUpEdge[开启Timer1和Timer2开始计时]
IsFirstUpEdge --no--> IsFirstUpEdge
OpFirstUpEdge --> IsOthertUpEdge{捕获到上升沿?}
IsOthertUpEdge --yes--> OpOtherUpEdege[通过DMA获取Timer1的计数值, 然后清零Timer1和Timer2]
IsOthertUpEdge --no--> IsTimer2Over{Timer2超时?}
IsTimer2Over --no--> IsOthertUpEdge
IsTimer2Over --yes--> OpReCap[清零并停止Timer1和Timer2]
OpReCap(right) --> IsFirstUpEdge
OpOtherUpEdege --> IsCapNum{捕获到一定数量并分析是否符合DSSS码?}
IsCapNum --yes--> IsOthertUpEdge
IsCapNum --no--> OpReCap
OpReCap(bottom) --> OpGetData[提取出数据]
OpGetData --> IsContinue{继续下一轮接收?}
IsContinue --yes--> IsFirstUpEdge
IsContinue --no--> E([结束])
{% endmermaid %}

  DSSS理论上是方波形式,但是不同于传统的PWM,它没有固定的频率,频率是根据发送的数据内容在变化的。根据这些特性我们关注的数据不再是DSSS码直接相关的几个0或几个1,而是相邻两个上升沿时间的时间间隔。比如当我们采集到信号的上升沿时间间隔是46时,对应数据应该是0b,时间间隔数据是37时,对应数据是1b。同样的,也可以使用信号的下降沿时间间隔。
  这样既避免了高速ADC的使用,又使得数据量大大减少节省了CPU运算时间。

2.2.2 单片机具体实现方法

2.2.2.1 使用单片机的电压比较器

  由于DSSS码理论上是数字信号,但是实际传输中往往是数字信号形式,比如在主动笔和屏之间的无线传输,随着距离远近信号的幅值有高低变化。传输过程中也往往伴随着一些噪声干扰。另外不同的样品之间也存在差异,可能100支笔当中有一部分接收能力略强,信号幅值比其余样品大。所以我们使用比较器的原因是设置动态的阈值来划分高低电平,以此来找到信号的上升下降沿。因为阈值需要动态适应,所以需要一些自适应阈值算法,但不会太复杂。

2.2.2.2 使用单片机的定时器去记录间隔时间

  通过比较器我们已经能抓到信号的边沿了,比如上升沿,在上升沿时触发(可以是中断方式也可以用事件触发,建议用事件去触发,这样节省cpu)读取定时器的计数值然后清零定时器。这样既能记录下每次间隔时间,实现循环计时。

2.2.2.3 如何知道DSSS信号的起始位置和结束

  将比较器使能,第一次触发上升沿之后连续接收一定数据,比如5个上升沿间隔时间,判断这五个是否符合DSSS信号特征,如果不符合那就认为是其他杂波,将其忽略。如果符合那就说明找到了DSSS信号,需要继续铺货其余的时间间隔。从第一上升沿开始,将Timer1和Timer2定时器开启计时功能。Timer1用于计时间隔时间,Timer2用于计时并设置一个超时中断,当Timer2计时溢出并中断时,认为DSSS信号已经结束。

  具体的流程图如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{% mermaid %}
flowchart TB
St([开始]) --> OpStartCmp[启动比较器]
OpStartCmp --> IsFirstUpEdge{捕获到第一个上升沿?}
IsFirstUpEdge --yes--> OpFirstUpEdge[开启Timer1和Timer2开始计时]
IsFirstUpEdge --no--> IsFirstUpEdge
OpFirstUpEdge --> IsOthertUpEdge{捕获到上升沿?}
IsOthertUpEdge --yes--> OpOtherUpEdege[通过DMA获取Timer1的计数值, 然后清零Timer1和Timer2]
IsOthertUpEdge --no--> IsTimer2Over{Timer2超时?}
IsTimer2Over --no--> IsOthertUpEdge
IsTimer2Over --yes--> OpReCap[清零并停止Timer1和Timer2]
OpReCap(right) --> IsFirstUpEdge
OpOtherUpEdege --> IsCapNum{捕获到一定数量并分析是否符合DSSS码?}
IsCapNum --yes--> IsOthertUpEdge
IsCapNum --no--> OpReCap
OpReCap(bottom) --> OpGetData[提取出数据]
OpGetData --> IsContinue{继续下一轮接收?}
IsContinue --yes--> IsFirstUpEdge
IsContinue --no--> E([结束])
{% endmermaid %}