#1 - 2026-5-12 17:36
mcweek (目代杏子的狗)
关于新协议:NSCP
1.由于本人愚钝,实在是搞不定DShot的复杂的外设同步,而且DShot需要计算高电平时间来判断是逻辑0还是逻辑1,STM32F103C8T6又比较慢(反正76Mhz不算快)。此外CAN需要额外硬件配合,USART/I2C又太慢,SPI线太多,USB需要额外接口而没有PH2.0那么简单(就两个针儿),PWM+ADC/DAC本质是对3.3v进行切分后的模电信号,极易受到干扰(不然就不会有DShot数字协议了,我也不用费劲做这个东西)。
综上所述,基本所有通信方案全被PASS了,那就只剩一条路,自研!

2.现在提出一个新的通信协议:NSCP(NutShell Communication Protocol)
3.该协议的使用场景为:一主一从,单向短距离,包为2字节以内的通信协议。
4.协议特点与限制:
(1)只需要两条线:SDA+GND,适合小型下位机作为接受命令接口。(针对SPI线太多)
(2)理论上为400Khz传输速率,高于DShot300,低于DShot600。适合实时通信。(针对USART/I2C太慢)
(3)外设仅需要DMA+TIM即可,基本STM系列全部支持。(针对DShot的复杂的外设同步)
(4)无需其它外部芯片辅助通信,不需要额外设计其它芯片电路,缩减PCB大小。(针对CAN需要额外硬件配合,USB需要额外接口)
(5)与DShot同为数字协议,同具备抗干扰能力。(针对PWM+ADC/DAC本质是对3.3v进行切分后的模电信号,极易受到干扰)
(6)数据搬运全程由硬件负责,CPU仅负责数据解算,而解算逻辑极度简单,仅为与非操作。适合低速单片机。(针对DShot需要计算高电平时间来判断是逻辑0还是逻辑1,STM32F103C8T6又比较慢)

5.协议总览:
(1)协议规定典型通信参数如下:
1.1bit数据长度为2.5μs。
2.逻辑0为20%占空比,逻辑1为80%占空比,全部以高电平为起点,低电平结束。
3.每次数据包为11bit。
4.高位先行
(2)发送方逻辑:
1.发送一个11bit数据,如果是逻辑1,则发送一个(重点!!是发送一个不是多个!!)80%占空比的PWM方波,如果是0则发送一个20%占空比的PWM方波。
(3)接收方逻辑:
1.接收方在每个bit的1μs的位置进行采样,如果检测为高电平,即为逻辑1,否则为逻辑0。

6.关于该协议在STM系列单片机的具体实现:
(1)发送方:即PWM + DMA。
其中,每次一个PWM方波发送完毕触发update事件,让DMA传输下一个方波信号的占空比。此种方式来发送每帧不同占空比的PWM信号。
此外,占空比序列生成,即软件端将数据变成占空比序列不需要复杂计算,原因是PWM频率确定,逻辑0与1的占空比确定,生成序列时可直接查表填入即可。
一共11条数据,搬运完结束DMA与定时器。

(2)接收方:DMA+从模式触发
其中,因为每bit数据都以高电平开始,低电平结束,所以每bit之间必然存在一次上拉。
所以,将接收机的TIM设定为从模式触发上拉触发,自动清零,计时时长为1μs,计时结束触发DMA搬运。
如此一来,当每bit上拉时将触发接收机的定时器定时,此时定时器将在1μs位置结束定时,然后触发DMA搬运。
DMA要搬运的是将对应GPIO口的数据搬运到自己设置的通信缓存中。
11次采样结束后,全部搬运完成,DMA触发完成搬运中断,中断中解算数据。
解算数据的流程很简单,直接说就是将GPIO口的1字节数据与一下,保留需要的那个bit的数据,然后如果是0就向最终结果里加一个0,否则加一个1.
11次解算完成后,合出的数据就是对应传输的值。
一共11条数据,搬运完结束DMA与定时器。
以上,就是NSCP的所有内容。而本次的电调中与上位机飞控之间的通信将使用此协议进行通信,传输油门值。