背景
工作中涉及与不同接口的模块通讯,比如QSFP-DD光模块是i2c接口的,相干OCM模块是SPI接口的,ITLA模块又是串口接口的。在做开发过程中,总是需要usb转这些通讯接口,多了不易收纳。而且外购的一些模块一次性通讯容量较小,比如相干OCM模块的SPI接口需要最大为128KByte的一次性通讯能力;还需要有线链接,搬着笔记本过去调试。于是,萌发了自己设计一个wifi转各种接口的模块工具,后续想想不如更进一步,让接口之间互相转换,自由选择组合和搭配。
功能
当前阶段,以USART、WIFI、SPI、IIC这几个外设之间的互相转换为目标,USB作为后续的开发考虑,工作上的需求不迫切;其他的外设,后续有想法了再添加
设计
首先,我们思考最顶层如何设计:
上位机需要执行哪些动作?
思考这个问题,我们首先想想上位机知晓哪些信息。
(1) 发送数据大小 (2) 通讯接口 (3) 开始发送数据的起始时刻 (4) 有的场景可能知道需要接受的数据大小
然后,思考上位机想要的信息
(1) 返回数据的大小 (2) 返回的数据
那上位机的大概动作就是:
(1) 发送数据 (2) 指定通讯接口 (3) 给出触发信号 (4) 轮询等待结束 (5) 读取数据大小 (6) 读取数据
上位机和单片机的数据应该是什么样子的?
由于usart、wifi是没有同步时钟信号的,如果没有额外的信息,不能知道一次通讯数据的具体开始和结束。spi、i2c是有同步时钟信号,这两组之间的转化,不能直接数据搬移。所以需要进行两件事,(1)开辟一个空间足够大比如我们需要的128K空间 (2) 设计帧格式,用来知道数据什么时候开始、结束、大小、传输的正确性。
可占时拟定为: 开始帧+数据长度+命令标识+数据+校验和+结束帧。
单片机的任务设计应该是什么样子?
接下来,我们思考一下,单片机内部应该进行哪些事件,如何划分任务。
根据上面说的,(1) 需要有个消息处理的功能 (2) 需要有各个模块的监听功能,比如网络通讯、串口通讯、iic和spi如果是从机模块也需要有监控,主机模块式不需要 (3) 内部状态的监控功能,监控内部温度空间、等到超时等状态,这个不是特别重要,但是一般预留一个;也可以把这个任务当做告警管理器,所有的告警向这个任务对应的队列中发送,这个任务去取数据,然后汇总
消息命令的设计需要有哪些功能?
上面可以看到,里面最重要的功能就是消息命令的处理。这里可以对应上位机的动作,一一进行盘点:(1) 数据下发的功能 (2) 数据触发的功能 (3) 状态轮询 (4) 数据读取 (5) 其他告警辅助功能
那到此为止,基本框架就设计完毕,下面就是进行功能实现和验证。
开发安排
功能这么多,总是轻重缓急之分。一般而言是分以下步骤:
硬件驱动的验证
编写基本的驱动单元,比如ii2、spi、usart、wifi的最小单元代码,验证一下硬件是否ok、代码的初始化配置是否正确
任务框架
按设计,先把线程和内存分配占住,然后把基本驱动和任务关联起来,这样就能够和上位机进行通讯了
消息功能接口实现
上述任务中,最核心的消息处理的机制编写一下,当前简要设计就用表驱动的形式。
上位机的配套开发
消息功能的开发中离不开上位机的调试支撑,所以这一步其实和上一步是交替进行的
告警功能的开发
在线升级的功能开发
硬件选型
这里就不进行具体选型对比了,手头刚好有esp32s3的开发板,就拿这个用了。
开发环境选择
esp32的开发方式也有3种选择:idf、arduino、micropython 。验证功能的话,其实后面两个更方面,有开发经验的话就推荐idf开发方式。
我们就选择idf的方式,配合VSCODE就够了。
代码待开发、验证完毕后,再给链接。
本章就到此OVER