==上位机(CPU)与下位机(STM32)通讯协议== ====物理层协议==== *通过串口通讯,115200波特率,校验位无,数据位8位,停止位1位 =====帧格式表===== {| class="wikitable sortable" |- ! 起始位 !! 数据位 !! 校验位置 !! 结束位置 |- |0xA5 1个字节长度||见数据位表,变长||数据位CRC16校验,2个字节长度,低位在前||0x5A 1个字节长度 |} =====数据位表===== {| class="wikitable sortable" |- ! 数据来源地址 !! 目的地址 !! 帧序号 !!数据长度 !! 数据命令以及数据内容 |- |0x01表示第一块CPU板,0x02表示第二块CPU板,0x03表示第三块CPU板;
0x81表示第一块STM32板,0x82表示第二块STM32电路板,0x83表示第二块STM32电路板,一个字节||0x01表示第一块CPU板,0x02表示第二块CPU板,0x03表示第三块CPU板;
0x81表示第一块STM32板,0x82表示第二块STM32电路板,0x83表示第二块STM32电路板;
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表示无需返回|| |} =====数据命令以及数据内容表,与产气相关命令===== {| class="wikitable sortable" |- ! 命令序号(两个字节长度) !! 命令内容 !! 是否需要回复!! 备注 |- |129,STM32上报系统状态切换||上一个系统状态(1个字节,'''3,空闲状态;4准备产气状态,5产气状态,6产气2小时补水前15S延时状态,7产气2小时15S后补水状态,8产气暂停状态,9电机找位置状态),当前系统状态(1个字节),切换成功与否(1个字节,0切换成功,1切换失败),当前'''系统状态运行标识码'''(8个字节) ||0表示无需返回,1表示需要返回 || |- |130,CPU应答|| 数据正常应答0x00,错误应答0x01||0表示无需返回|| |- |131,CPU下达开始产气命令|| 产气时间,4个字节,单位秒,低位在前;产气量,1个字节:0,低,1:中,2:高,其他无效;雾化量(1个字节):0 - 6,其他无效;电解电源极性(1个字节):0正常极性,1反转极性; 是否是睡眠模式,1个字节,0不是睡眠,1是睡眠模式;是否检查开始产气湿化杯超高,一个字节,0不检查,1检查||0表示无需返回,1表示需要返回 || |- |132,STM32应答|| 数据正常,且满足产气条件应答0x00,其他应答0x01,一个字节长度。当前'''系统状态运行标识码'''(8个字节)||0表示无需返回|| |- |133,CPU发送停止产气命令|| 无 ||0表示无需返回,1表示需要返回 || |- |134,STM32应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。(在产气准备状态下,非产气状态,产气补水状态下,产气暂停状态下,返回0x00)||0表示无需返回|| |- |135,CPU发送暂停产气命令|| 无 ||0表示无需返回,1表示需要返回 || |- |136,STM32应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。(在非产气准备状态下,非产气状态,非产气补水状态下,返回0x01)||0表示无需返回|| |- |137,CPU发送恢复产气命令|| 产气量,1个字节:0,低,1:中,2:高,其他无效;雾化量,一个字节:0 - 6,其他无效; ||0表示无需返回,1表示需要返回 || |- |138,STM32应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。(在非产气暂停状态下,返回ox01)||0表示无需返回|| |- |139,产气过程中,CPU发送雾化量控制命令|| 1个字节,0 - 6 ||0表示无需返回,1表示需要返回 || |- |140,STM32应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。(在产气准备状态下,非产气状态,产气补水状态下,产气暂停状态下,返回0x01)||0表示无需返回|| |- |141,准备产气状态下,STM32上报|| 产气设置时间(4个字节,低位在前),产气运行时间(4个字节,低位在前),准备产气运行时间(4个字节,低位在前), '''系统状态运行标识码''',8个字节 ||0表示无需返回,1表示需要返回 ||1S定时上报一次 |- |142,CPU应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。||0表示无需返回|| |- |143,准备产气状态下,STM32上报准备产气超时|| 产气设置时间(4个字节,低位在前),产气运行时间(4个字节,低位在前),准备产气运行时间(4个字节,低位在前), '''系统状态运行标识码''',8个字节 ||0表示无需返回,1表示需要返回 || |- |144,CPU应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。||0表示无需返回|| |- |145,产气状态下,STM32上报产气过程|| 产气设置时间(4个字节,低位在前),产气运行时间(4个字节,低位在前),设置产气挡位(1个字节,0,低,1:中,2:高),雾化量(1个字节):0 - 6,其他无效, '''系统状态运行标识码''',8个字节 ||0表示无需返回,1表示需要返回 ||1S定时上报一次 |- |146,CPU应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。||0表示无需返回|| |- |147,产气状态下,STM32上报产气时间到|| 产气设置时间(4个字节,低位在前),产气运行时间(4个字节,低位在前),设置产气挡位(1个字节,0,低,1:中,2:高),雾化量(1个字节):0 - 6,其他无效, '''系统状态运行标识码''',8个字节 ||0表示无需返回,1表示需要返回 ||1S定时上报一次 |- |148,CPU应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。||0表示无需返回|| |- |149,产气中补水15S等待状态下,STM32上报|| 产气设置时间(4个字节,低位在前),产气运行时间(4个字节,低位在前),等待运行时间(4个字节,低位在前), '''系统状态运行标识码''',8个字节 ||0表示无需返回,1表示需要返回 ||1S定时上报一次 |- |150,CPU应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。||0表示无需返回|| |- |151,产气中补水15S等待超时,进入正式补水状态|| 产气设置时间(4个字节,低位在前),产气运行时间(4个字节,低位在前),等待运行时间(4个字节,低位在前), '''系统状态运行标识码''',8个字节 ||0表示无需返回,1表示需要返回 ||1S定时上报一次 |- |152,CPU应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。||0表示无需返回|| |- |153,产气中补水状态下,STM32上报|| 产气设置时间(4个字节,低位在前),产气运行时间(4个字节,低位在前),补水运行时间(4个字节,低位在前), '''系统状态运行标识码''',8个字节 ||0表示无需返回,1表示需要返回 ||1S定时上报一次 |- |154,CPU应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。||0表示无需返回|| |- |155,产气中补水状态下,补水超时|| 产气设置时间(4个字节,低位在前),产气运行时间(4个字节,低位在前),补水运行时间(4个字节,低位在前), '''系统状态运行标识码''',8个字节 ||0表示无需返回,1表示需要返回 || |- |156,CPU应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。||0表示无需返回|| |- |157,准备产气时,水箱水位正常,进入真正产气状态|| '''系统状态运行标识码''',8个字节 ||0表示无需返回,1表示需要返回 || |- |158,CPU应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。||0表示无需返回|| |- |159,2小时加水时,水箱水位正常,进入产气状态|| '''系统状态运行标识码''',8个字节 ||0表示无需返回,1表示需要返回 || |- |160,CPU应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。||0表示无需返回|| |- |161,CPU产气过程睡眠与否设置|| 一个字节,0标识非睡眠模式;1标识睡眠模式;其他数据无效 ||0表示无需返回,1表示需要返回 || |- |162,STM32应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。||0表示无需返回|| |- |255,CPU下发关机命令|| 无 ||1表示需要应当|| |- |256,STM32应答|| 数据正常,0,数据错误,1 || 0表示不需要返回 ||' |- |} =====系统状态运行标识码===== {| class="wikitable sortable" |- ! 状态数据!! bit0 !! bit1 !! bit2 !! bit3 !! bit4 !! bit5 !! bit6 !! bit7 !!说明 !! 备注 |- |数据1,1个字节|| 水箱低于低水位,1||水箱低于高水位1||湿化杯低于低水位1||湿化杯低于中水位1 || 湿化杯低于高水位1 || 湿化杯高于超高水位1 || 氢水杯低于低1 ||氢水杯高于高 || || |- |数据2,1个字节|| 雾化器低于低1 ||雾化器高于高1 || 备用||备用||水箱温度过高于75||水箱平均温度过高于70 || 雾化器温度过高|| 备用 || || |- |数据3,1个字节|| 备用||氢气浓度超标1||风扇1故障1||风扇2故障1 || 电源IIC故障|| 电源未接地 || 电源过温 ||电源过压 || || |- |数据4,1个字节|| 电源欠压||电源过流||减速电机位置出错||氢水杯不在线 ||灯板不在线|| 备用 || 备用 ||备用|| || |- |数据5,1个字节|| 备用||备用||备用 || 备用 || 备用 || 备用 ||备用 || 备用 || || |- |数据6,1个字节|| 备用 ||备用 || 备用||备用||备用||备用 || 备用|| 备用 || || |- |数据7,1个字节|| 备用||备用||备用||备用 || 备用|| 备用 || 备用 ||备用 || || |- |数据8,1个字节|| 备用||备用||备用||备用 || 备用|| 备用 || 备用 ||系统状态出错 || || |} =====数据命令以及数据内容表,非产气相关命令===== {| class="wikitable sortable" |- ! 命令序号(两个字节长度) !! 命令内容 !! 是否需要回复!! 备注 |- |257,STM32上报状态||见'''上报系统状态表''' ||0表示无需返回,1表示需要返回 ||定时上报 |- |258,CPU应答|| 数据正常应答0x00,错误应答0x01,一个字节长度||0表示无需返回|| |- |259,STM32上报触摸按键状态||1,按键按下;2,按键长按;3,按键重发,其他无效 ||0表示无需返回,1表示需要返回 || |- |260,CPU应答|| 数据正常应答0x00,错误应答0x01,一个字节长度||0表示无需返回|| |- |} =====CPU设置参数相关命令===== {| class="wikitable sortable" |- ! 命令序号(两个字节长度) !! 命令内容 !! 是否需要回复!! 备注 |- |385,CPU设置准备产气超时时长||时长(4个字节,低位在前),单位:秒 ||0表示无需返回,1表示需要返回 || |- |386,STM32应答|| 数据正常应答0x00,错误应答0x01,一个字节长度||0表示无需返回|| |- |387,CPU设置准备补水等待延时超时时长||时长(4个字节,低位在前),单位:秒 ||0表示无需返回,1表示需要返回 || |- |388,STM32应答|| 数据正常应答0x00,错误应答0x01,一个字节长度||0表示无需返回|| |- |389,CPU设置补水超时时长||时长(4个字节,低位在前),单位:秒 ||0表示无需返回,1表示需要返回 || |- |390,STM32应答|| 数据正常应答0x00,错误应答0x01,一个字节长度||0表示无需返回|| |- |391,CPU设置最高保护温度阀值||实际温度值+30,一个字节长度 ||0表示无需返回,1表示需要返回 || |- |392,STM32应答|| 数据正常应答0x00,错误应答0x01,一个字节长度||0表示无需返回|| |- |393,CPU设置平均保护温度阀值||实际温度值+30,一个字节长度 ||0表示无需返回,1表示需要返回 || |- |394,STM32应答|| 数据正常应答0x00,错误应答0x01,一个字节长度||0表示无需返回|| |- |395,CPU设置雾化器保护温度阀值||实际温度值+30,一个字节长度 ||0表示无需返回,1表示需要返回 || |- |396,STM32应答|| 数据正常应答0x00,错误应答0x01,一个字节长度||0表示无需返回|| |- |397,CPU设置雾化器极性||一个字节长度,0真极性,其他反极性 ||0表示无需返回,1表示需要返回 || |- |398,STM32应答|| 数据正常应答0x00,错误应答0x01,一个字节长度||0表示无需返回|| |- |} =====软件测试时相关命令===== {| class="wikitable sortable" |- ! 命令序号(两个字节长度) !! 命令内容 !! 是否需要回复!! 备注 |- |513,CPU发送软件控制指令||1个字节。bit0:1,开启软件控制,0,关闭;bit1:1,开启ADC值软件输入,1,关闭;bit2:1,开启温度值,电流值模拟输入,0,关闭;bit3:1,开启IO输入状态模拟,0关闭;bit4:1,开启IO输出状态模拟,0关闭;其他备用 ||0表示无需返回,1表示需要返回 || |- |514,STM32应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。||0表示无需返回|| |- |515,CPU发送软件ADC值|| 见'''软件AD值控制表'''(只有在开启软件控制且开启ADC值软件输入时候,才可以控制) ||0表示无需返回,1表示需要返回 || |- |516,STM32应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。||0表示无需返回|| |- |517,CPU发送温度值,电流值模拟输入|| 见'''温度值,电流值模拟输入控制表''' ||0表示无需返回,1表示需要返回 || |- |518,STM32应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。||0表示无需返回|| |- |519,CPU发送开启IO输入状态模拟|| 见'''IO输入状态模拟控制表''' ||0表示无需返回,1表示需要返回 || |- |520,STM32应答|| 数据正常应答0x00,错误应答0x01,一个字节长度。||0表示无需返回|| |- |} =====STM32上报系统状态表===== {| class="wikitable sortable" |- ! 状态数据!! 说明 !! 备注 |- |数据1,1字节(输入)||bit0:电源DC OK信号,0,DC OK;bit1:浮球水位高信号,0,表示水位到高水位处,1表示水位未到;bit2:浮球水位低信号,1,表示水位到低水位处,0表示水位未到;bit3:湿化杯1水位超高信号,1,表示水位到超高水位处;bit4:湿化杯1水位高信号,1,表示水位到高水位处;bit5:湿化杯1水位中信号,1,表示水位到中水位处;bit6:湿化杯1水位低信号,1,表示水位到低水位处;bit7:湿化杯2水位高信号,1,表示水位到高水位处;|| |- |数据2,1字节(输入)||bit0:湿化杯2水位中信号,1,表示水位到中水位处;bit1:湿化杯2水位低信号,1,表示水位到低水位处;bit2:产气通道不经过阳台;bit3:产气通道经过阳台;bit4:雾化器水位高信号,1,表示水位到高水位处;bit5:雾化器水位低信号,1,表示水位到低水位处,0表示水位未到;bit6:雾化器反馈信号;bit7:CPU输出到STM32 GPIO信号;|| |- |数据3,1字节(输入)||bit0:按键信号,0表示按键按下,其他备用|| |- |数据4,1字节(输入)||备用|| |- |数据5,1字节(输出)||bit0:电源CH1 极性信号。(0正常极性,1极性反转);bit1:电源CH1开关信号,1打开CH1电源;bit2:电源CH2开关信号,1打开CH2电源;bit3:散热器风扇1打开信号,1打开风扇;bit4:散热器风扇2打开信号,1打开风扇;bit5:LED控制信号0,1打开LED灯;bit6:MU420雾化器打开信号,1打开MU420雾化器;bit7:雾化器温度电源信号,1打开电源;|| |- |数据6,1字节(输出)||bit0:循环水泵打开信号,1打开循环水泵;bit1:真空泵打开信号,1打开真空泵;bit2:电磁阀1,1打开电磁阀1;bit3:电磁阀2,1打开电磁阀2;bit4:485GPIO状态;;bit5:LED 绿色GPIO;bit6:输出到CPU的GPIO状态;bit7:CPU电源开启电源信号,1打开电源|| |- |数据7,1字节(输出)||bit0:雾化器风扇控制信号,1打开雾化器风扇;bit1:正压机GPIO输出信号;其他备份|| |- |数据8,1字节(输出)||备用|| |- |数据9,10,2个字节||备用|| |- |数据11,12,2个字节||水温 ADC值,低位在前|| |- |数据13,14,2个字节||雾化器电流采样 ADC值,低位在前|| |- |数据15,16,2个字节||雾化器自带温度传感器 ADC值,低位在前|| |- |数据17,18,2个字节||马达电流采样 ADC值,低位在前|| |- |数据19,20,2个字节||雾化器水位计传感器 ADC值,低位在前|| |- |数据21,22,2个字节||备用|| |- |数据23,24,2个字节||备用|| |- |数据25,26,2个字节||备用|| |- |数据27,28,2个字节||水温温度值。数据为实际温度值+30|| |- |数据29,30,2个字节||备用|| |- |数据31,32,2个字节||雾化器自带温度传感器温度值。数据为实际温度值+30|| |- |数据33,34,2个字节||备用|| |- |数据35,36,2个字节||雾化器水位计传感器温度值。数据为实际温度值+30|| |- |数据37,38,2个字节||备用|| |- |数据39,40,2个字节||备用|| |- |数据41,1个字节||电源是否在线标志,0电源在线,1电源不在线,2电源通讯错误|| |- |数据42,1个字节||电源i2c读取状态,见电源规格书|| |- |数据43,1个字节||bit0:1,ch2 on,0,ch2 off;bit1:1,ch1 on,0,ch1 off;bit2:1,ch1 反向;bit3:0,DC ok;其他备用|| |- |数据44,1个字节||备用|| |- |数据45,46,2个字节||实际电流|| |- |数据47,48,2个字节||设置电流|| |- |数据49,50,2个字节||电源温度|| |- |数据51,52,2个字节||输出电压|| |- |数据53,54,2个字节||风扇1,PWM|| |- |数据55,56,2个字节||风扇1,速度|| |- |数据57,1个字节||风扇1,是否打开,1打开|| |- |数据58,1个字节||风扇1,是否异常,1异常|| |- |数据59,60,2个字节||风扇2,PWM|| |- |数据61,62,2个字节||风扇2,速度|| |- |数据63,1个字节||风扇2,是否打开,1打开|| |- |数据64,1个字节||风扇2,是否异常,1异常|| |- |数据65 -- 72 96,8个字节||系统状态运行标识码|| |- |数据73,74,2个字节,氢气浓度||2个字节,氢气浓度x10,比如101,表示氢气浓度位10.1%|| |- |数据75,76,2个字节,环境温度||2个字节,正常温度值加30,比如数值位28,表示温度位-2摄氏度|| |- |数据77,78,2个字节,环境亮度||2个字节|| |- |数据79,80个字节,LED灯板状态0||2个字节||bit0:LED灯状态,1打开LED灯;bit1:红色LED灯状态,1打开红色LED灯(氢气超标打开);bit2:氢水杯低水位,1到达氢水杯低水位;bit3:氢水杯高水位,1到达氢水杯高水位;bit4:氢水杯是否在线,1,在线;bit6:led灯板是否在线,1在线;其他备用 |- |数据第81个字节||当前系统状态,1个字节,3,空闲状态;4准备产气状态,5产气状态,6产气2小时补水前15S延时状态,7产气2小时15S后补水状态,8产气暂停状态,9电机找位置状态|| |- |数据82 -- 96,15个字节||备用|| |- |} =====IO输入状态模拟控制表===== {| class="wikitable sortable" |- ! 状态数据!! 说明 !! 备注 |- |数据1,1个字节||bit0:电源DC OK信号,0,DC OK;bit1:浮球水位高信号,0,表示水位到高水位处,1表示水位未到;bit2:浮球水位低信号,0,表示水位到低水位处,1表示水位未到;bit3:湿化杯1水位超高信号,1,表示水位到超高水位处;bit4:湿化杯1水位高信号,1,表示水位到高水位处;bit5:湿化杯1水位中信号,1,表示水位到中水位处;bit6:湿化杯1水位中信号,1,表示水位到低水位处;bit7:湿化杯2水位高信号,1,表示水位到高水位处;|| |- |数据2,1个字节||bit0:湿化杯2水位中信号,1,表示水位到中水位处;bit1:湿化杯2水位中低信号,1,表示水位到低水位处;bit2:清水杯在线信号1;bit3:清水杯在线信号2;bit4:雾化器水位高信号,1,表示水位到高水位处;bit5:雾化器水位低信号,1,表示水位到低水位处,0表示水位未到;bit6:雾化器反馈信号;bit7:CPU输出到STM32 GPIO信号;|| |- |数据3,1个字节||bit0:按键信号,0表示按键按下,其他备用|| |- |数据4,1个字节||备用|| |} ====='''温度值,电流值模拟输入控制表'''===== {| class="wikitable sortable" |- ! 状态数据!! 说明 !! 备注 |- |数据1,2,2个字节||备用|| |- |数据3,4,2个字节||水温温度值,低位在前|| |- |数据5,6,2个字节||雾化器电流采样 ADC值,低位在前|| |- |数据7,8,2个字节||雾化器自带温度传感器 温度值,低位在前|| |- |数据9,10,2个字节||电流采样 电流值,低位在前|| |- |数据11,12,2个字节||雾化器水位计传感器 温度值,低位在前|| |- |数据13,14,2个字节||备用|| |- |数据15,16,2个字节||备用|| |} ====='''软件AD值控制表'''===== {| class="wikitable sortable" |- ! 状态数据!! 说明 !! 备注 |- |数据1,2,2个字节||备用|| |- |数据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个字节||备用|| |} =====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; } =====说明===== * * * * * * * * * *