RISCV BLE MCU based Hardware and Software

一个基于RISC-V BLE MCU 的软硬件设计, 最终的形态是Modbus协议(Modbus RTU + Modbus TCP)的输入输出软硬件设计.

在我的设计中,有多个选择因素需要考虑:

  • 支持Modbus RTUModbus TCP
  • License商业友好,即无需开源源代码
  • 被广泛使用,质量有保证
  • 免费
  • C语言实现
  • 无需OS支持

于是在Github上面寻找,发现了多款,包括microModbus,libmodubs. 但是最终还是选用了被广泛使用且满足上述所有FreeModbus

在移植后, 进行调试,发现有一些实现与常规的理解不同,有地方有问题. 有问题的地方是超过8bit的Coil操作. 这个修改对应的函数里面的实现即可.

每次Holding 寄存器读取后address都会自动加一,如果不需要这种操作,将读handler函数里面的自加操作去掉即可. 另外还有其他几个问题,但是可以去看看仓库的github issue即可解决.

Modbus RTU移植注意点 Modbus TCP移植注意点 因为我们使用的不是W500这种SPI接口的以太网模块来做通讯,这种模块内部已经有TCP协议, 我们使用的是MCU自带的, 需要特别注意的是数据收发完成后, 释放数据,否则会因为内存溢出而死机.

对于没有严重问题的程序, 常规的单步调试即可, 而如果没有调试器,也可以用打印log的方式打印异常记录相关的寄存器, 里面会有导致问题的address, 根据这个即可找到,例如:

HardFault_Handler
    mcause:00000004
    mtval:2000ff8e
    mepc:00003036

先了解这些CSR reg的作用table:

RISCV CSR

0100

然后分析mcause

mcause:00000004 mcause[31] = 0: 所有是下面的部分 mcause[30:0] = 4: Load指令访问没有对齐

Hard fault

mtval:2000ff8e

Hard fault mtval

mepc:00003036

Hard fault mpec

然后根据对应的地址查看dissable地址:

Hard fault assemble

这个是因为使用的libc库的问题,需要勾选对应的printf float实现功能才行.

Mac地址可以使用MCU的UUID来处理.

在整体上,硬件上对于EMC/EMI均进行了考研与相关设计,以及器件的处理, 如基本的TVS/PTC等防护.

对于继电器的驱动使用了驱动芯片,需要注意的是整体电流DCDC是否可以支撑. 尤其是一次性全开所有继电器的时候。

需要按照官方给定的参考设计,进行π型设计,具体的R和L需要根据实际来调优.

选用了公版的透明外壳, 效果还可以。 总共设计了三款不同的硬件, 分为带DI/DO, 带AI, 32路继电器,部分包装后如图:

Production Package

使用以前开发的网关作为Modbus Master, 在一个总线上面挂载了10多个节点(多个8路DIDO和多个32路DIDO,以及一个模拟量设备),进行了长时间采集和控制测试,没有出现通讯等异常。结果符合产品设计预期。

可以用来设置参数和控制设备,也可以通过Modbus master 软件来直接配置:

Up SW1

Up SW2

在医疗等行业实际项目中投入使用没有发现问题。

In production shield

In production shield other