==上位机(CPU)与下位机（STM32）通讯协议==

====物理层协议====
*通过串口通讯，115200波特率，校验位无，数据位8位，停止位1位
=====帧格式表=====
{| class="wikitable sortable"
|-
! 起始位   !! 数据位 !! 校验位置 !! 结束位置
|-
|0xA5 1个字节长度||见数据位表，变长||数据位CRC16校验，2个字节长度，低位在前||0x5A 1个字节长度
|}

=====数据位表=====
{| class="wikitable sortable"
|-
! 数据来源地址  !! 目的地址 !! 帧序号 !!数据长度 !! 数据命令以及数据内容
|-
|0x01表示第一块CPU板，0x02表示第二块CPU板，0x03表示第三块CPU板；<br>0x81表示第一块STM32板，0x82表示第二块STM32电路板，0x83表示第二块STM32电路板，一个字节||0x01表示第一块CPU板，0x02表示第二块CPU板，0x03表示第三块CPU板；<br>0x81表示第一块STM32板，0x82表示第二块STM32电路板，0x83表示第二块STM32电路板；<br>0x80表示目的地址是广播给所有的CPU电路板，0xfe表示目的地址是所有的STM32电路板，0xff表示广播给系统中所有设备，其他地址备用，一个字节长度||帧序号，两个字节，低位在前，应答数据的帧序号与收到的帧序号相同||数据命令以及数据内容部分数据长度，两个字节，低位在前||见数据命令以及数据内容表（'''是否需要回复'''是数据内容最后一个字节），变长
|}

=====数据命令以及数据内容表=====
{| class="wikitable sortable"
|-
! 命令序号（两个字节长度）   !! 命令内容 !! 是否需要回复!! 备注
|-
|1，CPU读取STM32硬件版本号||无||0表示无需返回，1表示需要返回||
|-
|2，STM32回复硬件版本号||例如，"HMHD.VT.A1"||0表示无需返回||
|-
|3，CPU读取STM32软件版本号||无||0表示无需返回，1表示需要返回||
|-
|4，STM32回复软件版本号||例如，"VT.A1.1907171",||0表示无需返回||

|-
|5，STM32主动上传硬件版本||例如，"HMHD.VT.A1"||0表示无需返回，1表示需要返回||
|-
|6，CPU应答||数据正常应答0x00,错误应答0x01,一个字节长度||0表示无需返回||
|-
|7，STM32主动上传软件版本||例如，"VT.A1.1907171"||0表示无需返回，1表示需要返回||
|-
|8，CPU应答||数据正常应答0x00,错误应答0x01,一个字节长度||0表示无需返回||
|-

|9，CPU提出升级STM32代码||无||0表示无需返回，1表示需要返回||
|-
|10，STM32回复CPU提出升级STM32代码||数据正常应答0x00（STM32进入升级状态）,错误应答0x01,一个字节长度||0表示无需返回||
|-
|11，CPU发送代码数据长度给STM32||4个字节长度,低位在前，低位在后||0表示无需返回，1表示需要返回||
|-
|12，STM32应答CPUX发送代码数据长度给STM32||数据正常应答0x00,错误应答0x01,一个字节长度||0表示无需返回||
|-
|13，CPU发送代码数据给STM32||见'''CPU发送代码数据给STM32数据内容表'''||0表示无需返回，1表示需要返回||
|-
|14，STM32应答CPU发送代码数据给STM32||'''STM32应答CPU发送代码数据给STM32表'''||0表示无需返回||
|-
|15，CPU发送数据升级完毕||无||0表示无需返回，1表示需要返回||
|-
|16，STM32应答CPU发送数据升级完毕||数据正常应答0x00,错误应答0x01,一个字节长度||0表示无需返回||
|-
|17，CPU发送强行结束升级命令||无 ||0表示无需返回，1表示需要返回||
|-
|18，STM32应答|| 数据正常应答0x00,错误应答0x01,一个字节长度||0表示无需返回||
|-
|19，STM32主动上报升级完成命令||升级是否成功标志,1个字节（0，STM32升级成功，1，STM32升级未成功），例如，"VT.A1.1907172"||1表示需返回||
|-
|20，CPU应答升级||无||0表示无需返回||

|-
|127|| || ||
|-
|128|| || ||'''128之前系统版本号，升级等指令，与系统控制等无关'''
|}
=====数据命令以及数据内容表(续)=====
{| class="wikitable sortable"
|-
! 命令序号（两个字节长度）   !! 命令内容 !! 是否需要回复!! 备注
|-
|129,STM32上报状态||见'''上报系统状态表''' ||0表示无需返回，1表示需要返回 ||
|-
|130，CPU应答|| 数据正常应答0x00,错误应答0x01,一个字节长度||0表示无需返回||
|-
|131,STM32上报触摸按键状态||1，按键按下；2，按键长按；3，按键重发，其他无效 ||0表示无需返回，1表示需要返回 ||
|-
|132，CPU应答|| 数据正常应答0x00,错误应答0x01,一个字节长度||0表示无需返回||
|-
|133,CPU下达开始产气命令|| 产气时间，4个字节，单位秒，低位在前；产气量，1个字节：0，低，1：中，2：高，其他无效；预留一个字节；雾化量：0 - 6，其他无效;'''第8字节，bit0:是否开启氢气浓度检测；bit1:是否开启轻水杯水位检测，bit2：是否开启雾化杯水位检测，bit3：雾化器强度是否反逻辑（1，表示雾化器控制电压低，雾化强度大）''' ||0表示无需返回，1表示需要返回 ||
|-
|134，STM32应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。在数据正常情况下，查看'''开始产气执行错误码'''||0表示无需返回||

|-
|135,CPU下达设置温度命令|| 4个字节，水箱保护温度，1个字节。（'''值为实际温度值+30，比如：20度，发送值为50'''）； 水箱恢复温度，1个字节；雾化器保护温度，1个字节 雾化器恢复温度，1个字节。||0表示无需返回，1表示需要返回 ||
|-
|136，STM32应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。||0表示无需返回||

|-
|137,STM32上报产气过程|| 产气设置时间（4个字节，低位在前），产气运行时间（4个字节，低位在前），设置产气挡位（1个字节，0，低，1：中，2：高），当前电源CH1电流（2个字节，低位在前），当前电源温度（2个字节，低位在前）， 产气中错误码，4个字节（见'''产气中执行错误码'''） ，当前相关GPIO状态（一个字节，bit0：真空泵；bit1：电磁阀；bit2：散热风扇1；bit3：散热风扇2；bit4：散热循环水泵；bit5：电流极性；）， 当前PT100温度，2个字节，当前水箱温度，2个字节，当前雾化器温度2个字节，当前风扇1PWM值,2个字节，当前风扇1速度,2个字节，当前风扇1状态,2个字节（'''具体内容暂定'''），当前风扇2PWM值,2个字节，当前风扇2速度,2个字节，当前风扇2状态,2个字节（'''具体内容暂定'''）||0表示无需返回，1表示需要返回 ||
|-
|138，CPU应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。设置风扇1PWM值（2个字节），设置风扇2PWM值（2个字节）||0表示无需返回||

|-
|139,STM32上报产气时间到，完成产气|| 产气设置时间（4个字节，低位在前），产气运行时间（4个字节，低位在前）  ||0表示无需返回，1表示需要返回 ||
|-
|140，CPU应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。||0表示无需返回||

|-
|141,STM32水箱补水过程|| 设置补水等待总时间（4个字节），当前补水已经花时间（4个字节），当前补水状态1个字节（0，水箱补水中，1，湿化杯补水中）当前相关GPIO状态（一个字节，bit0：真空泵；bit1：电磁阀；bit2：散热风扇1；bit3：散热风扇2；bit4：散热循环水泵；bit5：电流极性；），错误码4个字节（查看'''开始产气执行错误码'''）；  ||0表示无需返回，1表示需要返回 ||
|-
|142，CPU应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。||0表示无需返回||

|-
|143,STM32水箱补水完毕|| 无 ||0表示无需返回，1表示需要返回 ||
|-
|144，CPU应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。||0表示无需返回||

|-
|145,STM32湿化杯补水完毕|| 无 ||0表示无需返回，1表示需要返回 ||
|-
|146，CPU应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。||0表示无需返回||

|-
|147,STM32发送进入水箱补水流程||错误码4个字节（查看'''开始产气执行错误码'''）； ||0表示无需返回，1表示需要返回 ||
|-
|148，CPU应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。||0表示无需返回||

|-
|149,STM32发送进入湿化杯补水流程||错误码4个字节（查看'''开始产气执行错误码'''）； ||0表示无需返回，1表示需要返回 ||
|-
|150，CPU应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。||0表示无需返回||

|-
|151,STM32发送开始产气错误进入待机状态||错误码4个字节（查看'''开始产气执行错误码'''）；（发送完毕后进入待机状态，结束本次产气流程） ||0表示无需返回，1表示需要返回 ||
|-
|152，CPU应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。||0表示无需返回||

|-
|153,STM32发送开始产气，产气计时开始||错误码4个字节（查看'''开始产气执行错误码'''）；（发送完毕后进入产气） ||0表示无需返回，1表示需要返回 ||
|-
|154，CPU应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。||0表示无需返回||

|-
|155,STM32发送加水计时完毕命令，系统进入idle状态||错误码4个字节（查看'''开始产气执行错误码'''）；（发送完毕后进入产气） ||0表示无需返回，1表示需要返回 ||
|-
|156，CPU应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。||0表示无需返回||

|-
|157,CPU发送软件控制指令||1个字节。bit0：1,开启软件控制,0,关闭;bit1：1,开启ADC值软件输入,1,关闭;bit2：1,开启温度值，电流值模拟输入，0，关闭;bit3：1，开启IO输入状态模拟，0关闭;bit4：1，开启IO输出状态模拟，0关闭；其他备用 ||0表示无需返回，1表示需要返回 ||
|-
|158，STM32应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。||0表示无需返回||
|-
|159,CPU发送软件ADC值|| 见'''软件AD值控制表'''（只有在开启软件控制且开启ADC值软件输入时候，才可以控制） ||0表示无需返回，1表示需要返回 ||
|-
|160，STM32应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。||0表示无需返回||

|-
|161,CPU发送温度值，电流值模拟输入|| 见'''温度值，电流值模拟输入控制表''' ||0表示无需返回，1表示需要返回 ||
|-
|162，STM32应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。||0表示无需返回||

|-
|163,CPU发送开启IO输入状态模拟|| 见'''IO输入状态模拟控制表''' ||0表示无需返回，1表示需要返回 ||
|-
|164，STM32应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。||0表示无需返回||

|-
|165,CPU发送停止产气命令|| 无 ||0表示无需返回，1表示需要返回 ||
|-
|166，STM32应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。||0表示无需返回||

|-
|167,CPU发送暂停产气命令|| 无 ||0表示无需返回，1表示需要返回 ||
|-
|168，STM32应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。||0表示无需返回||

|-
|169,CPU发送恢复产气命令|| 产气量，1个字节：0，低，1：中，2：高，其他无效；雾化量,一个字节：0 - 6，其他无效; ||0表示无需返回，1表示需要返回 ||
|-
|170，STM32应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。||0表示无需返回||

|-
|171,CPU发送雾化量控制命令|| 1个字节，0 - 6 ||0表示无需返回，1表示需要返回 ||
|-
|172，STM32应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。||0表示无需返回||

|}

=====STM32上报系统状态表=====
{| class="wikitable sortable"
|-
! 状态数据!! 说明 !! 备注
|-
|数据1,1个字节||bit0：电源DC OK信号，0,DC OK;bit1：雾化器水位高信号，0，表示水位到高水位处，1表示水位未到;bit2：雾化器水位低信号，0，表示水位到低水位处，1表示水位未到;bit3：湿化杯水位超高信号，0，表示水位到超高水位处，1表示水位未到;bit4：湿化杯水位高信号，0，表示水位到高水位处，1表示水位未到;bit5：湿化杯水位中信号，0，表示水位到中水位处，1表示水位未到;bit6：湿化杯水位中低信号，0，表示水位到低水位处，1表示水位未到;bit7：注水口盖到位信号，0，表示注水口盖到位;||只是表示GPIO状态
|-
|数据2,1个字节||bit0：LED灯板输入，备用;bit1：清水杯在线信号，0，表示清水杯在线;bit2：清水杯水位高信号，0，表示水位到高水位处，1表示水位未到;bit3：清水杯水位低信号，0，表示水位到低水位处，1表示水位未到;bit4：水箱浮球水位高信号，0，表示水位到高水位处，1表示水位未到;bit5：水箱浮球水位低信号，0，表示水位到低水位处，1表示水位未到;bit6：按键GPIO状态;bit7：备用;||只是表示GPIO状态
|-
|数据3,1个字节||备用||
|-
|数据4,1个字节||备用||
|-
|数据5,1个字节||数据1 滤波后数据值||外设有效状态
|-
|数据6,1个字节||数据2 滤波后数据值||外设有效状态
|-
|数据7,1个字节||备用||
|-
|数据8,1个字节||备用||
|-
|数据9,1个字节||bit0：电源CH1 极性信号;bit1：电源CH1开关信号，1打开CH1电源;bit2：电源CH2开关信号，1打开CH2电源;bit3：真空泵打开信号，1打开真空泵;bit4：循环水泵打开信号，1打开循环水泵；bit5：集水槽电磁阀打开信号，1打开集水槽电磁阀;bit6：冷凝器风扇打开信号，1打开冷凝器风扇;bit7：散热器风扇2打开信号，1打开风扇;|| 
|-
|数据10,1个字节||bit0：散热器风扇1打开信号，1打开风扇;;bit1：电磁阀3，1打开电磁阀3;bit2：MU420雾化器打开信号，1打开MU420雾化器;bit3：LED控制信号1，备用；bit4：LED控制信号0，1打开LED灯;bit5：漏水检测输出信号;bit6：新增加电磁阀1，1打开;bit7：新增加电磁阀2，1打开|| 
|-
|数据11,1个字节||bit0：红色LED灯，1打开;;bit1：绿色LED灯，1打开；3;bit2：蓝色LED灯，1打开；bit3：雾化器温度电源信号，1打开电源；bit4：CPU电源开启电源信号，1打开电源；其他备份|| 
|-
|数据12,1个字节||备用||
|-
|数据13，14,2个字节||PT100 ADC值，低位在前||
|-
|数据15，16,2个字节||水温 ADC值，低位在前||
|-
|数据17，18,2个字节||备用||
|-
|数据19，20,2个字节||雾化器自带温度传感器 ADC值，低位在前||
|-
|数据21，22,2个字节||电流采样 ADC值，低位在前||
|-
|数据23，24,2个字节||雾化器水位计传感器 ADC值，低位在前||
|-
|数据25，26,2个字节||备用||
|-
|数据27，28,2个字节||备用||
|-
|数据29，1个字节||电源是否在线标志，0电源在线，1电源不在线，2电源通讯错误||
|-
|数据30，1个字节||电源i2c读取状态，见电源规格书||
|-
|数据31，1个字节||bit0：1,ch2 on,0,ch2 off;bit1：1,ch1 on,0,ch1 off;bit2：1,ch1 反向;bit3：0，DC ok；其他备用||
|-
|数据32，1个字节||备用||
|-
|数据23，34,2个字节||电源电流实际值，低位在前||
|-
|数据35，36,2个字节||电源电流设置值，低位在前||
|-
|数据37，38,2个字节||电源温度值，低位在前||
|-
|数据39，40,2个字节||备用||

|-
|数据41，42,2个字节||PT100 温度值，（值为实际温度值+30，比如：20度，发送值为50），低位在前||
|-
|数据43，44,2个字节||水温温度值，低位在前||
|-
|数据45，46,2个字节||备用||
|-
|数据47，48,2个字节||雾化器自带温度传感器 温度值，低位在前||
|-
|数据49，50,2个字节||电流采样 电流值，低位在前||
|-
|数据51，52,2个字节||雾化器水位计传感器 温度值，低位在前||
|-
|数据53，54,2个字节||备用||
|-
|数据55，56,2个字节||备用||
|-
|数据57，58,2个字节||备用||
|-
|数据59，60,2个字节||备用||
|-
|数据61，62,2个字节||备用||
|-
|数据63，64,2个字节||备用||
|}




=====IO输入状态模拟控制表=====
{| class="wikitable sortable"
|-
! 状态数据!! 说明 !! 备注
|-
|数据1,1个字节||bit0：电源DC OK信号，0,DC OK;bit1：雾化器水位高信号，0，表示水位到高水位处，1表示水位未到;bit2：雾化器水位低信号，0，表示水位到低水位处，1表示水位未到;bit3：湿化杯水位超高信号，0，表示水位到超高水位处，1表示水位未到;bit4：湿化杯水位高信号，0，表示水位到高水位处，1表示水位未到;bit5：湿化杯水位中信号，0，表示水位到中水位处，1表示水位未到;bit6：湿化杯水位中低信号，0，表示水位到低水位处，1表示水位未到;bit7：注水口盖到位信号，0，表示注水口盖到位;||只是表示GPIO状态
|-
|数据2,1个字节||bit0：LED灯板输入，备用;bit1：清水杯在线信号，0，表示清水杯在线;bit2：清水杯水位高信号，0，表示水位到高水位处，1表示水位未到;bit3：清水杯水位低信号，0，表示水位到低水位处，1表示水位未到;bit4：水箱浮球水位高信号，0，表示水位到高水位处，1表示水位未到;bit5：水箱浮球水位低信号，0，表示水位到低水位处，1表示水位未到;bit6：按键GPIO状态;bit7：备用;||只是表示GPIO状态
|-
|数据3,1个字节||备用||
|-
|数据4,1个字节||备用||
|}

====='''温度值，电流值模拟输入控制表'''=====
{| class="wikitable sortable"
|-
! 状态数据!! 说明 !! 备注
|-
|数据1，2,2个字节||PT100 温度值，（值为实际温度值+30，比如：20度，发送值为50），低位在前||
|-
|数据3，4,2个字节||水温温度值，低位在前||
|-
|数据5，6,2个字节||备用||
|-
|数据7，8,2个字节||雾化器自带温度传感器 温度值，低位在前||
|-
|数据9，10,2个字节||电流采样 电流值，低位在前||
|-
|数据11，12,2个字节||雾化器水位计传感器 温度值，低位在前||
|-
|数据13，14,2个字节||备用||
|-
|数据15，16,2个字节||备用||
|}

====='''软件AD值控制表'''=====
{| class="wikitable sortable"
|-
! 状态数据!! 说明 !! 备注
|-
|数据1，2,2个字节||PT100 ADC值，低位在前||
|-
|数据3，4,2个字节||水温 ADC值，低位在前||
|-
|数据5，6,2个字节||备用||
|-
|数据7，8,2个字节||雾化器自带温度传感器 ADC值，低位在前||
|-
|数据9，10,2个字节||电流采样 ADC值，低位在前||
|-
|数据11，12,2个字节||雾化器水位计传感器 ADC值，低位在前||
|-
|数据13，14,2个字节||备用||
|-
|数据15，16,2个字节||备用||
|}

=====开始产气执行错误码=====
{| class="wikitable sortable"
|-
! 状态数据!! bit0 !! bit1 !! bit2 !! bit3 !! bit4 !! bit5 !! bit6 !! bit7 !!说明 !! 备注
|-
|数据1,1个字节|| 氢气浓度标识，1 氢气超标||水箱浮球水位低，水位低于低水位，1||水箱浮球水位高，水位低于高水位，1||湿化杯水位低于水位低，1 || 湿化杯水位低于水位中，1 || 湿化杯水位低于高位，1  || 湿化杯水位超高，1 ||氢水杯水位低，1 || ||
|-
|数据2,1个字节|| 氢水杯水位高，1||雾化水槽水位低，1||雾化水槽水位高，1||备用 || 备用|| 备用 || 备用 ||备用 || ||
|-
|数据3,1个字节|| 备用||备用||备用||备用 || 备用|| 备用 || 备用 ||备用 || ||
|-
|数据4,1个字节|| 备用||备用||备用||备用 || 备用|| 备用 || 备用 ||系统在其他状态下，不能执行开始命令 || ||
|}

=====335X控制命令表=====

{| class="wikitable sortable"
|-
! 控制命令 !! 说明
|-
|0xXX,1个字节||bit0：电源DC OK信号，0,DC OK;bit1：雾化器水位高信号，0，表示水位到高水位处，1表示水位未到;bit2：雾化器水位低信号，0，表示水位到低水位处，1表示水位未到;bit3：湿化杯水位超高信号，0，表示水位到超高水位处，1表示水位未到;bit4：湿化杯水位高信号，0，表示水位到高水位处，1表示水位未到;bit5：湿化杯水位中信号，0，表示水位到中水位处，1表示水位未到;bit6：湿化杯水位中低信号，0，表示水位到低水位处，1表示水位未到;bit7：注水口盖到位信号，0，表示注水口盖到位;
|}

=====335X发送代码数据给STM32数据内容表=====
{| class="wikitable sortable"
|-
! 代码包序号 !! 代码数据 !! 校验
|-
|0x0001，两个字节，低位在前，表示第一包数据，依次递增||代码数据，256个字节，不够256字节补充0xff||代码数据位（256个字节）CRC16校验，两个字节长度，低位在前
|}

=====STM32应答335X发送代码数据给STM32表=====
{| class="wikitable sortable"
|-
! 代码包序号 !! 应答码
|-
|0x0001，两个字节，低位在前，表示第一包数据，依次递增||0x00表示数据正常，0x01表示错误
|}
==上位机和测试底板STM32通讯协议==
*在工作状态下，每1秒STM32将采集到的数据发送给上位机，上位机无需应答；
*数据传输格式采用大端模式；
====物理层协议====
*通过串口通讯，9600波特率，校验位无，数据位8位，停止位1位
=====帧格式表=====
{| class="wikitable sortable"
|-
! 起始位   !! 数据位 !! 校验位置 !! 结束位置
|-
|0xA5,一个字节长度||见数据位表，变长||数据位异或校验，一个字节长度||0x5A，一个字节长度
|}
=====数据位表=====
{| class="wikitable sortable"
|-
! 数据来源地址  !! 目的地址 !! 数据长度 !! 数据命令以及数据内容
|-
|0xa0表示上位机，0xb0表示惠美7寸A8版本平板，0xb1表示惠美7寸A8版本测试底板，如测试底板发送给上位机则来源地址为0xb1,目的地址为0xa0||0xa0表示上位机，0xb0表示惠美7寸A8版本平板，0xb1表示惠美7寸A8版本测试底板，其他地址备用，一个字节长度||数据命令以及数据内容部分数据长度，两个字节，低位在前||见数据命令以及数据内容表，变长
|}
{| class="wikitable sortable"
|-
! 命令序号   !! 命令内容 !! 是否需要回复!! 备注
|-
|101，生产测试指令， 上位机->测试底板STM32||见'''生产测试数据命令以及数据内容表'''||0表示无需返回，1表示需要返回||
|-
|102，生产测试指令应答||数据正常应答0x00,错误应答0x01,一个字节长度||0表示无需返回||
|-
|103，测试版主动上报测试版状态||见'''生产测试数据命令以及数据内容表'''||0表示无需返回，1表示需要返回||
|}

=====生产测试数据命令以及数据内容表=====
{| class="wikitable sortable"
|-
! 标示编号   !! 命令字节 !! 测试项数量!! 测试项!!保留字!!测试项附加数据段长度!!数据段
|-
|2个字节，上位机发送，STM32响应和主动上传数据时都需原样复制此编号||1个字节，详见'''命令字列表'''||1个字节||1个字节，详见'''测试项列表'''||1个字节||1个字节||可变长，测试项如只是响应，则0标示OK，1标示执行Fail
|}

=====生产测试命令字列表=====
{| class="wikitable sortable"
|-
! 命令字列表!! 说明
|-
|1||设置指令， 上位机->生产测试底板STM32
|-
|2||设置指令响应， 生产测试底板STM32->上位机
|-
|3||表示测试底板STM32主动上传数据
|}

=====生产测试项列表=====

{| class="wikitable sortable"
|-
! 测试项列表 !! 说明
|-
|0x50|| 设置HIGH状态，全部输出口设置，状态参见设置矩阵
|-
|0x51|| 设置LOW状态，全部输出口设置，状态参见设置矩阵
|}

=====STM32上报接口PIN脚定义=====

{| class="wikitable sortable"
|-
! 接口PIN脚定义 !! 说明
J01_01_NC=1,
J01_02_TXD,
J01_03_RXD,
J01_04_GND,
J02_01_SPK_P,
J02_02_SPK_N,
J08_01_24VP,
J08_02_24VN,
J09_01_POW_P_GPIO1_16_OUT,
J09_02_POW_N,
J09_03_CONT_PA5_DAC_OUT,
J09_04_NC,
J09_05_TMP_PA3_ADC_IN,
J09_06_TMP_POW_P_3V3,
J10_01_POW_3V3,
J10_02_LEVEL_H_PC11_IN,
J10_03_LEVEL_L_PB2_IN,
J10_04_GND,
J10_05_TMP_PC5_ADC_IN,
J10_06_TMP_POW_P_3V3_PB11,
J13_01_24VP_GPIO1_24_OUT,
J13_02_24VN,
J15_01_PC1,
J15_02_NC,
J15_03_PC0_OUT,
J15_04_NC,
J15_05_POW_5V,
J15_06_NC,
J15_07_GND,
J15_08_GPIO1_23_IN,
J15_09_GND,
J15_10_NC,
J15_11_LEVEL_H_PC12_IN,
J15_12_LEVEL_L_PB9_IN,
J16_01_24VP_GPIO1_25_OUT,
J16_02_24VN,
J17_01_24VP_GPIO1_26_OUT,
J17_02_24VN,
J19_01_24VP_GPIO3_18_OUT,
J19_02_24VN,
J20_01_USB_VBUS,
J20_02_DM,
J20_03_DP,
J20_04_GND,
J21_01_GND,
J21_02_GND,
J21_03_5V,
J21_04_5V,
J21_05_GND,
J21_06_GPIO1_19_OUT,
J21_07_GPIO1_20_OUT,
J21_08_PB1_OUT,
J21_09_NC,
J21_10_NC,
J21_11_NC,
J21_12_NC,
J21_13_GPIO2_1_IN,
J21_14_NC,
J21_15_NC,
J21_16_NC,
J21_17_SCL,
J21_18_SDA,
J25_01_24VP_PC10_OUT,
            J25_02_24VN,

            J26_01_MP, PA0_ADC_IN,
            J26_02_MM,
            J26_03_FEEDBACK,

            J34_01_GND,
            J34_02_NC,
            J34_03_AIN_PA2_ADC_IN,
            J34_04_POW_5V,

            J41_01_FAN_N,
            J41_02_24VP_GPIO0_20_OUT,
            J41_03_FAN_FEEDBACK_PB10_PWM_IN,
            J41_04_FAN_CONT_PA8_PWM_OUT,

            J42_01_FAN_N,
            J42_02_24VP_GPIO0_7_OUT,
            J42_03_FAN_FEEDBACK_PC9_PWM_IN,
            J42_04_FAN_CONT_PC8_PWM_OUT,

            J45_01_LEVEL_H_GPIO1_21_IN,
            J45_02_GND,
            J45_03_LEVEL_L_GPIO1_22_IN,
            J45_04_GND,
            J45_05_TMP_PA1_ADC_IN,
            J45_06_POW_3V3,

            J46_01_POW_3V3,
            J46_02_PA6_IN,
            J46_03_SIGNAL,
            J46_04_GND,

            J47_01_POW_5V,
            J47_02_IO_PC4_IN,
            J47_03_GND,

            J49_01_POW_5V,
            J49_02_LEVEL_SH_PC2_IN,
            J49_03_LEVEL_H_PC3_IN,
            J49_04_LEVEL_M_PC6_IN,
            J49_05_LEVEL_L_PC7_IN,
            J49_06_GND,
            UNKOWN,
|}

=======CRC校验算法=======

'''#'''define CRC1(crc,byte) (((crc) >> 8 ) ^ tabel[((crc) ^ (unsigned int) (byte)) & 0XFF]) 

CPU_INT16U const tabel[256]={
  0X0000, 0XC0C1, 0XC181, 0X0140, 0XC301, 0X03C0, 0X0280, 0XC241,  
  0XC601, 0X06C0, 0X0780, 0XC741, 0X0500, 0XC5C1, 0XC481, 0X0440,  
  0XCC01, 0X0CC0, 0X0D80, 0XCD41, 0X0F00, 0XCFC1, 0XCE81, 0X0E40,  
  0X0A00, 0XCAC1, 0XCB81, 0X0B40, 0XC901, 0X09C0, 0X0880, 0XC841,  
  0XD801, 0X18C0, 0X1980, 0XD941, 0X1B00, 0XDBC1, 0XDA81, 0X1A40,  
  0X1E00, 0XDEC1, 0XDF81, 0X1F40, 0XDD01, 0X1DC0, 0X1C80, 0XDC41,  
  0X1400, 0XD4C1, 0XD581, 0X1540, 0XD701, 0X17C0, 0X1680, 0XD641,  
  0XD201, 0X12C0, 0X1380, 0XD341, 0X1100, 0XD1C1, 0XD081, 0X1040,  
  0XF001, 0X30C0, 0X3180, 0XF141, 0X3300, 0XF3C1, 0XF281, 0X3240,  
  0X3600, 0XF6C1, 0XF781, 0X3740, 0XF501, 0X35C0, 0X3480, 0XF441,  
  0X3C00, 0XFCC1, 0XFD81, 0X3D40, 0XFF01, 0X3FC0, 0X3E80, 0XFE41,  
  0XFA01, 0X3AC0, 0X3B80, 0XFB41, 0X3900, 0XF9C1, 0XF881, 0X3840, 
  0X2800, 0XE8C1, 0XE981, 0X2940, 0XEB01, 0X2BC0, 0X2A80, 0XEA41,  
  0XEE01, 0X2EC0, 0X2F80, 0XEF41, 0X2D00, 0XEDC1, 0XEC81, 0X2C40,  
  0XE401, 0X24C0, 0X2580, 0XE541, 0X2700, 0XE7C1, 0XE681, 0X2640,  
  0X2200, 0XE2C1, 0XE381, 0X2340, 0XE101, 0X21C0, 0X2080, 0XE041,  
  0XA001, 0X60C0, 0X6180, 0XA141, 0X6300, 0XA3C1, 0XA281, 0X6240,  
  0X6600, 0XA6C1, 0XA781, 0X6740, 0XA501, 0X65C0, 0X6480, 0XA441,  
  0X6C00, 0XACC1, 0XAD81, 0X6D40, 0XAF01, 0X6FC0, 0X6E80, 0XAE41,  
  0XAA01, 0X6AC0, 0X6B80, 0XAB41, 0X6900, 0XA9C1, 0XA881, 0X6840,  
  0X7800, 0XB8C1, 0XB981, 0X7940, 0XBB01, 0X7BC0, 0X7A80, 0XBA41,  
  0XBE01, 0X7EC0, 0X7F80, 0XBF41, 0X7D00, 0XBDC1, 0XBC81, 0X7C40,  
  0XB401, 0X74C0, 0X7580, 0XB541, 0X7700, 0XB7C1, 0XB681, 0X7640,  
  0X7200, 0XB2C1, 0XB381, 0X7340, 0XB101, 0X71C0, 0X7080, 0XB041,  
  0X5000, 0X90C1, 0X9181, 0X5140, 0X9301, 0X53C0, 0X5280, 0X9241,  
  0X9601, 0X56C0, 0X5780, 0X9741, 0X5500, 0X95C1, 0X9481, 0X5440,  
  0X9C01, 0X5CC0, 0X5D80, 0X9D41, 0X5F00, 0X9FC1, 0X9E81, 0X5E40,  
  0X5A00, 0X9AC1, 0X9B81, 0X5B40, 0X9901, 0X59C0, 0X5880, 0X9841,  
  0X8801, 0X48C0, 0X4980, 0X8941, 0X4B00, 0X8BC1, 0X8A81, 0X4A40,  
  0X4E00, 0X8EC1, 0X8F81, 0X4F40, 0X8D01, 0X4DC0, 0X4C80, 0X8C41,  
  0X4400, 0X84C1, 0X8581, 0X4540, 0X8701, 0X47C0, 0X4680, 0X8641,  
  0X8201, 0X42C0, 0X4380, 0X8341, 0X4100, 0X81C1, 0X8081, 0X4040 
};

static CPU_INT16U CalcCRC(CPU_INT08S *data, CPU_INT32S size)
{
	CPU_INT32S i; 						 
	CPU_INT16U crc = 0; 
 	for (i = 0; i < size; i++) 
	{ 
  		crc = CRC1(crc, data[i]); 
 	} 
 	return crc; 
}

=====说明=====
*
*
*
*
*
*
*
*
*
*