今天先把题目先给出来, 在近两天会把源码 (含详细注释 )及部署、测试结果给出来, 希望能给大家帮助。(原来这个程序在CSDN中,有小伙伴已经写了一些,但是发现里面埋了很多坑,例如:
坑1:传输数据只能传输200个Uint16-无符号16位整数,
坑2:3,4区数据寄存器只能放置<=400(dec)的数据,不能传输65535(DEC)最大数,
坑3:传输数据时一般要加CRC16校验码 2个字节, 源代码中故意少发两个字节,导致测试软件接收不到。
为了不让后面的小伙伴在这里在花费时间研究,我把已知的坑给填了,并源码放在这里,全免费,我有点缺德,断了别人的一个财路)。
嗨,我去,先给出2个截图,用来吹嘘一下这个程序真的可以用。
第一部分:截图看结果,真的可以用。
1、输入寄存器截图
2、保持寄存器截图
先给出两张图 每张图左边图是 AVP28335 系统的Slave 端数据,右边是Modscan32测试软件数据。
第一张图是3区输入寄存器数据;第二张图是4区 保持寄存器数据。
地址:=1 显示数据 长度 100
下面将给出部署方法,有点困了,明天再说吧。:)
第二部分、此程序部署前提条件:
1、使用芯片德州仪器或湖南进芯28335的SCIC-串口;(SCIA SCIB 基本相同)
2、使用了收发控制管脚 GPIO61;(其实不使用更好处理)
3、外围电路采用 Max485芯片;(电气原理图省略,典型应用图纸图纸,算了,还是给一张图吧)
4、编译环境CCS15 芯片28335 编译器6.0.1
第三部分、编程,主要文件及部署方法:
1、创建头文件,该文件是Modbus 485 Slave 数据结构体文件:
文件名:MODBUS.h
文件内容:
#ifndef INCLUDE_MODBUS_H_
#define INCLUDE_MODBUS_H_//SCIC-MODBUS 485 应用数据结构体//MODBUS数据结构
typedef enum {MB_FUNC_READ_COIL = 1,MB_FUNC_READ_INPUT,MB_FUNC_READ_HOLDINGREGISTERS,MB_FUNC_READ_INPUTREGISTERS,MB_FUNC_FORCE_COIL,MB_FUNC_WRITE_HOLDINGREGISTER,MB_FUNC_FORCE_NCOILS = 15,MB_FUNC_WRITE_NREGISTERS = 16
} ModbusFunctionCode;//MODBUS错误数据结构
typedef enum {MB_ERROR_ILLEGALFUNC = 1,MB_ERROR_ILLEGALADDR,MB_ERROR_ILLEGALDATA,MB_ERROR_SLVFAILURE,MB_ERROR_ACKNOWLEDGE,MB_ERROR_SLVBUSY,MB_ERROR_NEGACKNOWLEDGE,MB_ERROR_MEMPARITY,MB_ERROR_GATEWAYPATHUN
} ModbusError;//状态机常数
typedef enum {MB_CREATE,MB_START,MB_TIMER_T35_WAIT,MB_IDLE,MB_RECEIVE,MB_PROCESS,MB_TRANSMIT,MB_DESTROY
} ModbusState;//MODBUS数据结构
typedef struct ModbusData ModbusData;
struct ModbusData {Uint16 slaveAddress;Uint16 functionCode;Uint32 contentIdx;Uint32 numofregisters;Uint16 content[125];//20Uint16 size;Uint16 crc;
};//P3方式互联网找的程序(modbus.c)
extern void SCIC_Modbus_Init(void);//CoilsMap 数据结构
typedef struct ModbusCoilsMap ModbusCoilsMap;
struct ModbusCoilsMap{Uint16 dummy1;
// Uint16 dummy2;
// Uint16 dummy3;
// Uint16 dummy4;
// Uint16 dummy5;
// Uint16 dummy6;
// Uint16 dummy7;
// Uint16 dummy8;
// Uint16 dummy9;
// Uint16 dummy10;
// Uint16 dummy11;
// Uint16 dummy12;
// Uint16 dummy13;
// Uint16 dummy14;
// Uint16 dummy15;
// Uint16 dummy16;
// Uint16 dummy17;
// Uint16 dummy18;
// Uint16 dummy19;
// Uint16 dummy20;
// Uint16 dummy21;
// Uint16 dummy22;
// Uint16 dummy23;
// Uint16 dummy24;
// Uint16 dummy25;
// Uint16 dummy26;
// Uint16 dummy27;
// Uint16 dummy28;
// Uint16 dummy29;
// Uint16 dummy30;
// Uint16 dummy31;
// Uint16 dummy32;
// Uint16 dummy33;
// Uint16 dummy34;
// Uint16 dummy35;
// Uint16 dummy36;
// Uint16 dummy37;
// Uint16 dummy38;
// Uint16 dummy39;
// Uint16 dummy40;
// Uint16 dummy41;
// Uint16 dummy42;
// Uint16 dummy43;
// Uint16 dummy44;
// Uint16 dummy45;
// Uint16 dummy46;
// Uint16 dummy47;
// Uint16 dummy48;
// Uint16 dummy49;
// Uint16 dummy50;
// Uint16 dummy51;
// Uint16 dummy52;
// Uint16 dummy53;
// Uint16 dummy54;
// Uint16 dummy55;
// Uint16 dummy56;
// Uint16 dummy57;
// Uint16 dummy58;
// Uint16 dummy59;
// Uint16 dummy60;
// Uint16 dummy61;
// Uint16 dummy62;
// Uint16 dummy63;
// Uint16 dummy64;
// Uint16 dummy65;
// Uint16 dummy66;
// Uint16 dummy67;
// Uint16 dummy68;
// Uint16 dummy69;
// Uint16 dummy70;
// Uint16 dummy71;
// Uint16 dummy72;
// Uint16 dummy73;
// Uint16 dummy74;
// Uint16 dummy75;
// Uint16 dummy76;
// Uint16 dummy77;
// Uint16 dummy78;
// Uint16 dummy79;
// Uint16 dummy80;
// Uint16 dummy81;
// Uint16 dummy82;
// Uint16 dummy83;
// Uint16 dummy84;
// Uint16 dummy85;
// Uint16 dummy86;
// Uint16 dummy87;
// Uint16 dummy88;
// Uint16 dummy89;
// Uint16 dummy90;
// Uint16 dummy91;
// Uint16 dummy92;
// Uint16 dummy93;
// Uint16 dummy94;
// Uint16 dummy95;
// Uint16 dummy96;
// Uint16 dummy97;
// Uint16 dummy98;
// Uint16 dummy99;
// Uint16 dummy100;
};//InputsMap 数据结构
typedef struct ModbusInputsMap ModbusInputsMap;
struct ModbusInputsMap{Uint16 dummy1;
// Uint16 dummy2;
// Uint16 dummy3;
// Uint16 dummy4;
// Uint16 dummy5;
// Uint16 dummy6;
// Uint16 dummy7;
// Uint16 dummy8;
// Uint16 dummy9;
// Uint16 dummy10;
// Uint16 dummy11;
// Uint16 dummy12;
// Uint16 dummy13;
// Uint16 dummy14;
// Uint16 dummy15;
// Uint16 dummy16;
// Uint16 dummy17;
// Uint16 dummy18;
// Uint16 dummy19;
// Uint16 dummy20;
// Uint16 dummy21;
// Uint16 dummy22;
// Uint16 dummy23;
// Uint16 dummy24;
// Uint16 dummy25;
// Uint16 dummy26;
// Uint16 dummy27;
// Uint16 dummy28;
// Uint16 dummy29;
// Uint16 dummy30;
// Uint16 dummy31;
// Uint16 dummy32;
// Uint16 dummy33;
// Uint16 dummy34;
// Uint16 dummy35;
// Uint16 dummy36;
// Uint16 dummy37;
// Uint16 dummy38;
// Uint16 dummy39;
// Uint16 dummy40;
// Uint16 dummy41;
// Uint16 dummy42;
// Uint16 dummy43;
// Uint16 dummy44;
// Uint16 dummy45;
// Uint16 dummy46;
// Uint16 dummy47;
// Uint16 dummy48;
// Uint16 dummy49;
// Uint16 dummy50;
// Uint16 dummy51;
// Uint16 dummy52;
// Uint16 dummy53;
// Uint16 dummy54;
// Uint16 dummy55;
// Uint16 dummy56;
// Uint16 dummy57;
// Uint16 dummy58;
// Uint16 dummy59;
// Uint16 dummy60;
// Uint16 dummy61;
// Uint16 dummy62;
// Uint16 dummy63;
// Uint16 dummy64;
// Uint16 dummy65;
// Uint16 dummy66;
// Uint16 dummy67;
// Uint16 dummy68;
// Uint16 dummy69;
// Uint16 dummy70;
// Uint16 dummy71;
// Uint16 dummy72;
// Uint16 dummy73;
// Uint16 dummy74;
// Uint16 dummy75;
// Uint16 dummy76;
// Uint16 dummy77;
// Uint16 dummy78;
// Uint16 dummy79;
// Uint16 dummy80;
// Uint16 dummy81;
// Uint16 dummy82;
// Uint16 dummy83;
// Uint16 dummy84;
// Uint16 dummy85;
// Uint16 dummy86;
// Uint16 dummy87;
// Uint16 dummy88;
// Uint16 dummy89;
// Uint16 dummy90;
// Uint16 dummy91;
// Uint16 dummy92;
// Uint16 dummy93;
// Uint16 dummy94;
// Uint16 dummy95;
// Uint16 dummy96;
// Uint16 dummy97;
// Uint16 dummy98;
// Uint16 dummy99;
// Uint16 dummy100;
};//HoldingRegistersMap数据结构
typedef struct ModbusHoldingRegistersMap ModbusHoldingRegistersMap;
struct ModbusHoldingRegistersMap {Uint16 dummy1;Uint16 dummy2;Uint16 dummy3;Uint16 dummy4;Uint16 dummy5;Uint16 dummy6;Uint16 dummy7;Uint16 dummy8;Uint16 dummy9;Uint16 dummy10;Uint16 dummy11;Uint16 dummy12;Uint16 dummy13;Uint16 dummy14;Uint16 dummy15;Uint16 dummy16;Uint16 dummy17;Uint16 dummy18;Uint16 dummy19;Uint16 dummy20;Uint16 dummy21;Uint16 dummy22;Uint16 dummy23;Uint16 dummy24;Uint16 dummy25;Uint16 dummy26;Uint16 dummy27;Uint16 dummy28;Uint16 dummy29;Uint16 dummy30;Uint16 dummy31;Uint16 dummy32;Uint16 dummy33;Uint16 dummy34;Uint16 dummy35;Uint16 dummy36;Uint16 dummy37;Uint16 dummy38;Uint16 dummy39;Uint16 dummy40;Uint16 dummy41;Uint16 dummy42;Uint16 dummy43;Uint16 dummy44;Uint16 dummy45;Uint16 dummy46;Uint16 dummy47;Uint16 dummy48;Uint16 dummy49;Uint16 dummy50;
// Uint16 dummy51;
// Uint16 dummy52;
// Uint16 dummy53;
// Uint16 dummy54;
// Uint16 dummy55;
// Uint16 dummy56;
// Uint16 dummy57;
// Uint16 dummy58;
// Uint16 dummy59;
// Uint16 dummy60;
// Uint16 dummy61;
// Uint16 dummy62;
// Uint16 dummy63;
// Uint16 dummy64;
// Uint16 dummy65;
// Uint16 dummy66;
// Uint16 dummy67;
// Uint16 dummy68;
// Uint16 dummy69;
// Uint16 dummy70;
// Uint16 dummy71;
// Uint16 dummy72;
// Uint16 dummy73;
// Uint16 dummy74;
// Uint16 dummy75;
// Uint16 dummy76;
// Uint16 dummy77;
// Uint16 dummy78;
// Uint16 dummy79;
// Uint16 dummy80;
// Uint16 dummy81;
// Uint16 dummy82;
// Uint16 dummy83;
// Uint16 dummy84;
// Uint16 dummy85;
// Uint16 dummy86;
// Uint16 dummy87;
// Uint16 dummy88;
// Uint16 dummy89;
// Uint16 dummy90;
// Uint16 dummy91;
// Uint16 dummy92;
// Uint16 dummy93;
// Uint16 dummy94;
// Uint16 dummy95;
// Uint16 dummy96;
// Uint16 dummy97;
// Uint16 dummy98;
// Uint16 dummy99;
// Uint16 dummy100;
};//InputRegistersMap数据结构
typedef struct ModbusInputRegistersMap ModbusInputRegistersMap;
struct ModbusInputRegistersMap {Uint16 dummy1;Uint16 dummy2;Uint16 dummy3;Uint16 dummy4;Uint16 dummy5;Uint16 dummy6;Uint16 dummy7;Uint16 dummy8;Uint16 dummy9;Uint16 dummy10;Uint16 dummy11;Uint16 dummy12;Uint16 dummy13;Uint16 dummy14;Uint16 dummy15;Uint16 dummy16;Uint16 dummy17;Uint16 dummy18;Uint16 dummy19;Uint16 dummy20;Uint16 dummy21;Uint16 dummy22;Uint16 dummy23;Uint16 dummy24;Uint16 dummy25;Uint16 dummy26;Uint16 dummy27;Uint16 dummy28;Uint16 dummy29;Uint16 dummy30;Uint16 dummy31;Uint16 dummy32;Uint16 dummy33;Uint16 dummy34;Uint16 dummy35;Uint16 dummy36;Uint16 dummy37;Uint16 dummy38;Uint16 dummy39;Uint16 dummy40;Uint16 dummy41;Uint16 dummy42;Uint16 dummy43;Uint16 dummy44;Uint16 dummy45;Uint16 dummy46;Uint16 dummy47;Uint16 dummy48;Uint16 dummy49;Uint16 dummy50;Uint16 dummy51;Uint16 dummy52;Uint16 dummy53;Uint16 dummy54;Uint16 dummy55;Uint16 dummy56;Uint16 dummy57;Uint16 dummy58;Uint16 dummy59;Uint16 dummy60;Uint16 dummy61;Uint16 dummy62;Uint16 dummy63;Uint16 dummy64;Uint16 dummy65;Uint16 dummy66;Uint16 dummy67;Uint16 dummy68;Uint16 dummy69;Uint16 dummy70;Uint16 dummy71;Uint16 dummy72;Uint16 dummy73;Uint16 dummy74;Uint16 dummy75;Uint16 dummy76;Uint16 dummy77;Uint16 dummy78;Uint16 dummy79;Uint16 dummy80;Uint16 dummy81;Uint16 dummy82;Uint16 dummy83;Uint16 dummy84;Uint16 dummy85;Uint16 dummy86;Uint16 dummy87;Uint16 dummy88;Uint16 dummy89;Uint16 dummy90;Uint16 dummy91;Uint16 dummy92;Uint16 dummy93;Uint16 dummy94;Uint16 dummy95;Uint16 dummy96;Uint16 dummy97;Uint16 dummy98;Uint16 dummy99;Uint16 dummy100;Uint16 dummy101;Uint16 dummy102;Uint16 dummy103;Uint16 dummy104;Uint16 dummy105;Uint16 dummy106;Uint16 dummy107;Uint16 dummy108;Uint16 dummy109;Uint16 dummy110;Uint16 dummy111;Uint16 dummy112;Uint16 dummy113;Uint16 dummy114;Uint16 dummy115;Uint16 dummy116;Uint16 dummy117;Uint16 dummy118;Uint16 dummy119;Uint16 dummy120;Uint16 dummy121;Uint16 dummy122;Uint16 dummy123;Uint16 dummy124;Uint16 dummy125;Uint16 dummy126;Uint16 dummy127;Uint16 dummy128;Uint16 dummy129;Uint16 dummy130;Uint16 dummy131;Uint16 dummy132;Uint16 dummy133;Uint16 dummy134;Uint16 dummy135;Uint16 dummy136;Uint16 dummy137;Uint16 dummy138;Uint16 dummy139;Uint16 dummy140;Uint16 dummy141;Uint16 dummy142;Uint16 dummy143;Uint16 dummy144;Uint16 dummy145;Uint16 dummy146;Uint16 dummy147;Uint16 dummy148;Uint16 dumm1y49;Uint16 dummy150;Uint16 dummy151;Uint16 dummy152;Uint16 dummy153;Uint16 dummy154;Uint16 dummy155;Uint16 dummy156;Uint16 dummy157;Uint16 dummy158;Uint16 dummy159;Uint16 dummy160;Uint16 dummy161;Uint16 dummy162;Uint16 dummy163;Uint16 dummy164;Uint16 dummy165;Uint16 dummy166;Uint16 dummy167;Uint16 dummy168;Uint16 dummy169;Uint16 dummy170;Uint16 dummy171;Uint16 dummy172;Uint16 dummy173;Uint16 dummy174;Uint16 dummy175;Uint16 dummy176;Uint16 dummy177;Uint16 dummy178;Uint16 dummy179;Uint16 dummy180;Uint16 dummy181;Uint16 dummy182;Uint16 dummy183;Uint16 dummy184;Uint16 dummy185;Uint16 dummy186;Uint16 dummy187;Uint16 dummy188;Uint16 dummy189;Uint16 dummy190;Uint16 dummy191;Uint16 dummy192;Uint16 dummy193;Uint16 dummy194;Uint16 dummy195;Uint16 dummy196;Uint16 dummy197;Uint16 dummy198;Uint16 dummy199;Uint16 dummy200;Uint16 dummy201;Uint16 dummy202;Uint16 dummy203;Uint16 dummy204;Uint16 dummy205;Uint16 dummy206;Uint16 dummy207;Uint16 dummy208;Uint16 dummy209;Uint16 dummy210;Uint16 dummy211;Uint16 dummy212;Uint16 dummy213;Uint16 dummy214;Uint16 dummy215;Uint16 dummy216;Uint16 dummy217;Uint16 dummy218;Uint16 dummy219;Uint16 dummy220;Uint16 dummy221;Uint16 dummy222;Uint16 dummy223;Uint16 dummy224;Uint16 dummy225;Uint16 dummy226;Uint16 dummy227;Uint16 dummy228;Uint16 dummy229;Uint16 dummy230;Uint16 dummy231;Uint16 dummy232;Uint16 dummy233;Uint16 dummy234;Uint16 dummy235;Uint16 dummy236;Uint16 dummy237;Uint16 dummy238;Uint16 dummy239;Uint16 dummy240;Uint16 dummy241;Uint16 dummy242;Uint16 dummy243;Uint16 dummy244;Uint16 dummy245;Uint16 dummy246;Uint16 dummy247;Uint16 dummy248;Uint16 dummy249;Uint16 dummy250;
};//MODBUS Slave数据结构
typedef struct ModbusSlaveStruc{ModbusState state;Uint16 rdata[51]; //30Uint16 sdata[251]; //100 //250Uint16 recvlen;Uint16 sendlen;ModbusCoilsMap coils,*pcoils;ModbusInputsMap inputs,*pinputs;ModbusHoldingRegistersMap holdingRegisters,*pholdingRegisters;ModbusInputRegistersMap inputRegisters,*pinputRegisters;
}MBSLSTRU;#endif /* INCLUDE_MODBUS_H_ */
该文件定义了3个枚举数据,5个结构数据。 主要完成 MODBUS SLAVE 的帧结构,功能码01,02 ,03,04 数据结构,错误码帧,状态机数据结构。 一般情况创建项目后放在头文件目录中,便于引用。
2,创建Modbus Slave RTU 源文件
MODBUS_COM.c
#include <DSP2833x_Device.h>
#include <DSP2833x_Examples.h>
#include <MODBUS.h> //MODBUS SLAVE 数据结构体头文件
#include <string.h> //用于清零数组extern void receieve_handler(MBSLSTRU *pModbusSlave); //数据接收处理
extern Uint16 CRC16 (Uint16 *nData, Uint16 wLength); //CRC16校验函数
extern uint32_t floatToIEEE754_H(float value); //32位浮点数处理函数高16位
extern uint32_t floatToIEEE754_L(float value); //32位浮点数处理函数低16位
//extern float ieee754ToFloat(uint32_t ieee);//SCIC通信用
//#define ModbusSlaveAddress 1 //地址,本程序段用MOD_CODE替换,便于更改地址 //MODBUS SLAVE RTU 地址
#define bufferdepth 0x10 //10 //20 //BUFFER 发送起始深度 (0x10 = 16 字节)//CycleQueue ScicRecvMsgQueue;
//struct ScicRecvMsgQueueStruc ScicRecvMsgBox[ScicRecvMsgLen], *pScicRecvMsgQueueStruc;MBSLSTRU public_struc_modbus; //MODBUS SLAVE 数据结构体变量Uint16 *pcoils_sub;
Uint16 *pinputs_sub;
Uint16 *pholdingRegisters_sub;
Uint16 *pinputRegisters_sub;__interrupt void SCICTX_MODBUS_ISR(void) //发送中断(不考虑校验,校验字节已经被计算)
{Uint16 i, Temp;if((public_struc_modbus.sendlen&0xff)>bufferdepth) //判断发送字节长度>{Temp = bufferdepth; //发送字节长度 本程序 0-16 0x00-0x10ScicRegs.SCIFFTX.bit.TXFFIENA = 1; //FIFO 发送中断使能ScicRegs.SCIFFTX.bit.TXFFIL = 0; //发送中断级别=0
// ScicRegs.SCIFFTX.bit.TXFFST = 0; //FIFO状态
// SCIC_TX_485; //允许发送标志(硬件接口 GPIO61 拉低)for(i=0; i< Temp+2; i++){
// ScicRegs.SCITXBUF = public_struc_modbus.sdata[i + bufferdepth*(public_struc_modbus.sendlen>>12)]; //发送缓存区数据scic_xmit(public_struc_modbus.sdata[i + bufferdepth*(public_struc_modbus.sendlen>>12)]); //发送缓存区数据
// scic_xmit(public_struc_modbus.sdata[i]); //发送缓存区数据}
// SCIC_RX_485; //发送完毕后允许接收(硬件接口 GPIO61 拉高)DELAY_US(20000); //25000 //发送完0.02秒后接收 20000 原 10000public_struc_modbus.sendlen = public_struc_modbus.sendlen - bufferdepth + 0x1000; //?}else //判断发送字节长度<{Temp = (public_struc_modbus.sendlen&0xff);if((public_struc_modbus.sendlen&0xff)>0){ScicRegs.SCIFFTX.bit.TXFFIENA = 1; //FIFO 发送中断使能ScicRegs.SCIFFTX.bit.TXFFIL = 0; //发送中断级别=0
// ScicRegs.SCIFFTX.bit.TXFFST = 0; //FIFO状态
// SCIC_TX_485;for(i=0; i< Temp+2; i++){
// ScicRegs.SCITXBUF = public_struc_modbus.sdata[i + bufferdepth*(public_struc_modbus.sendlen>>12)]; //发送缓存区数据scic_xmit(public_struc_modbus.sdata[i + bufferdepth*(public_struc_modbus.sendlen>>12)]); //发送缓存区数据
// scic_xmit(public_struc_modbus.sdata[i]); //发送缓存区数据}
// SCIC_RX_485;DELAY_US(20000);//25000public_struc_modbus.sendlen = 0; //一帧完毕,清除发送长度}else{if(public_struc_modbus.sendlen==0) //发送长度置 0 (无){ScicRegs.SCIFFTX.bit.TXFFIENA = 0; //发送关闭(为接收做准备)}}}ScicRegs.SCIFFTX.bit.TXFFINTCLR=1; //完整一帧结束,清除发送中断标志,(为接收做准备) Clear Interrupt flagPieCtrlRegs.PIEACK.all|=0x0080; //Issue PIE ACK
// PieCtrlRegs.PIEACK.bit.ACK8=1;
}__interrupt void SCICRX_MODBUS_ISR(void) //MODBUS接收中断函数
{Uint16 i;if(ScicRegs.SCIFFRX.bit.RXFFIL != 1) //接收状态字 非 1{if(public_struc_modbus.rdata[1]==0){for(i=1;i<8;i++){public_struc_modbus.rdata[i]=ScicRegs.SCIRXBUF.all; //读数据并保存(8个字节)}}if((public_struc_modbus.rdata[1]==15)||(public_struc_modbus.rdata[1]==16)) //rdata[1]=存放功能吗 15 16{if(public_struc_modbus.recvlen == 0) //长度=0{public_struc_modbus.recvlen = public_struc_modbus.rdata[6] + 9 + 0x1000; //计算功能码 15/16 的接收长度 = rdata[6] + 9 + 0x1000ScicRegs.SCIFFRX.bit.RXFFIL = 8; //FIFO深度为8i = public_struc_modbus.recvlen&0xff - ((public_struc_modbus.recvlen>>12)*8); //设置中断级别if(i>8){ScicRegs.SCIFFRX.bit.RXFFIL = 8;} //FIFO深度为8,那当接收到8个Word后,即RXFFST>=RXFFIL时,就会触发接受中断else{ScicRegs.SCIFFRX.bit.RXFFIL = i;} //FIFO深度为 0-7}else //长度不为0{if((public_struc_modbus.recvlen>>12)<((public_struc_modbus.recvlen&0xFF)/8)){for(i=0;i<8;i++){public_struc_modbus.rdata[i+(public_struc_modbus.recvlen>>12)*8]=ScicRegs.SCIRXBUF.all; // Read data r[0+x]-r[7+x]}public_struc_modbus.recvlen = public_struc_modbus.recvlen + 0x1000;i = public_struc_modbus.recvlen&0xff - ((public_struc_modbus.recvlen>>12)*8);if(i>8){ScicRegs.SCIFFRX.bit.RXFFIL = 8;}else{ScicRegs.SCIFFRX.bit.RXFFIL = i;}}else{for(i=0;i<((public_struc_modbus.recvlen&0xFF)%8);i++){public_struc_modbus.rdata[i+(public_struc_modbus.recvlen>>12)*8]=ScicRegs.SCIRXBUF.all; // Read data}if((public_struc_modbus.recvlen&0xFF) <= (i+(public_struc_modbus.recvlen>>12)*8)){receieve_handler(&public_struc_modbus);public_struc_modbus.rdata[1] = 0;ScicRegs.SCIFFRX.bit.RXFFIL = 1;public_struc_modbus.recvlen = 0;}}}}else //如果功能码 其他{public_struc_modbus.recvlen = 8;if((public_struc_modbus.rdata[1]>=1)&&(public_struc_modbus.rdata[1]<=6)) //功能码 1-6{receieve_handler(&public_struc_modbus);public_struc_modbus.rdata[1] = 0;public_struc_modbus.recvlen = 0;ScicRegs.SCIFFRX.bit.RXFFIL = 1;}else{receieve_handler(&public_struc_modbus);public_struc_modbus.rdata[1] = 0;ScicRegs.SCIFFRX.bit.RXFFIL = 1;}}}else //接收状态字 1{public_struc_modbus.rdata[0]=ScicRegs.SCIRXBUF.all; //读数据if(public_struc_modbus.rdata[0] == MOD_CODE) //字节0 - 补全MODBUS RTU 地址 ModbusSlaveAddress{ScicRegs.SCIFFRX.bit.RXFFIL = 7;} //接收状态字 置 7else{ScicRegs.SCIFFRX.bit.RXFFIL = 1;} //接收状态字 置 1}// ScicRegs.SCIFFTX.bit.TXFFINTCLR=1; // FIFO 清除ScicRegs.SCIFFRX.bit.RXFFOVRCLR=1; // Clear Overflow flagScicRegs.SCIFFRX.bit.RXFFINTCLR=1; // Clear Interrupt flagPieCtrlRegs.PIEACK.all|=0x0080; // Issue PIE ack
}
//#ifdef FLASH
//#pragma CODE_SECTION(SCIC_Modbus_Init,"ramfuncs")
//#endif
void SCIC_Modbus_Init(void)
{InitScicGpio(); //初始化收发管脚InitSCICDIR(); //初始化收发控制管脚scic_fifo_init(); // Initialize the SCIC FIFO Initial send data. After each transmission this datascic_echoback_init(); // Initialize the SCIC echo_backEALLOW;PieVectTable.SCIRXINTC = &SCICRX_MODBUS_ISR; //配置SCIC接收中断PieVectTable.SCITXINTC = &SCICTX_MODBUS_ISR; //配置SCIC发送中断EDIS;// PieCtrlRegs.PIECTRL.bit.ENPIE = 1; //主程序中已定义 此处删除PieCtrlRegs.PIEIER8.bit.INTx5=1; // PIE Group 8, int5PieCtrlRegs.PIEIER8.bit.INTx6=1; // PIE Group 8, INT6IER|=M_INT8; // Enable CPU INT //使能SCIC GROUP 8public_struc_modbus.recvlen = 0; //初始化接收长度public_struc_modbus.sendlen = 0; //初始化发送长度Uint16 i;public_struc_modbus.pcoils = &public_struc_modbus.coils;public_struc_modbus.pinputs = &public_struc_modbus.inputs;public_struc_modbus.pholdingRegisters = &public_struc_modbus.holdingRegisters;public_struc_modbus.pinputRegisters = &public_struc_modbus.inputRegisters;pcoils_sub =(Uint16 *) public_struc_modbus.pcoils;pinputs_sub =(Uint16 *) public_struc_modbus.pinputs;pholdingRegisters_sub =(Uint16 *) public_struc_modbus.pholdingRegisters;pinputRegisters_sub =(Uint16 *) public_struc_modbus.pinputRegisters;for(i=0;i<sizeof(public_struc_modbus.coils);i++){(i%2==1)?(*(pcoils_sub+i)=1):(*(pcoils_sub+i)=0);}for(i=0;i<sizeof(public_struc_modbus.inputs);i++){(i%2==0)?(*(pinputs_sub+i)=1):(*(pinputs_sub+i)=0);}for(i=0;i<sizeof(public_struc_modbus.holdingRegisters);i++) //3区保持寄存器初始化{*(pholdingRegisters_sub+i)=i+1;}for(i=0;i<sizeof(public_struc_modbus.inputRegisters);i++) //4区输入寄存器初始化{*(pinputRegisters_sub+i)=i+1;}memset(public_struc_modbus.rdata,0,sizeof(public_struc_modbus.rdata)); //初始化寄存器并分配空间
}//#ifdef FLASH
//#pragma CODE_SECTION(receieve_handler,"ramfuncs")
//#endif
void receieve_handler(MBSLSTRU *pModbusSlave) //接收到字符串后处理
{Uint16 i, lentemp = public_struc_modbus.recvlen & 0xff;Uint16 *pcoils_sub, *pinputs_sub, *pholdingRegisters_sub, *pinputRegisters_sub; //ModbusData pTempData; //临时保存数据// struct ScicRecvMsgQueueStruc KD_ScicRecvMsg;pcoils_sub =(Uint16 *) pModbusSlave->pcoils; //线圈pinputs_sub =(Uint16 *) pModbusSlave->pinputs; //输入态pholdingRegisters_sub =(Uint16 *) pModbusSlave->pholdingRegisters; //保持寄存器pinputRegisters_sub =(Uint16 *) pModbusSlave->pinputRegisters; //输入寄存器memset(pModbusSlave->sdata,0,sizeof(pModbusSlave->sdata)); //初始化寄存器并分配空间pTempData.crc = ((pModbusSlave->rdata[lentemp-2])<<8)+pModbusSlave->rdata[lentemp-1]; //接收总字节校验码pModbusSlave->sdata[0] = pModbusSlave->rdata[0]; //0字节 为 RTU 地址, 发送时考虑返回if(pModbusSlave->rdata[0]==MOD_CODE) //数据地址与本客户端一致 ModbusSlaveAddress{//从地址检查pModbusSlave->sdata[1] = pModbusSlave->rdata[1]; //第1字节 为 RTU 功能码 ,发送时考虑返回if(CRC16(pModbusSlave->rdata, lentemp-2) == pTempData.crc) //如果校验CRC准确,接收正确{pTempData.contentIdx = (pModbusSlave->rdata[2]<<8)+pModbusSlave->rdata[3]; //2字节 3字节 内容索引pTempData.numofregisters = (pModbusSlave->rdata[4]<<8)+pModbusSlave->rdata[5]; //4字节 5字节 这里不表示寄存器数目,表示线圈的状态if((pTempData.contentIdx+pTempData.numofregisters)>65535) //数值超限判定 > 65535{pModbusSlave->sdata[1]|= 0x80; //发送1字节 赋值 0x80pModbusSlave->sdata[2]|= 0x03; //发送2字节 赋值 0x03i=CRC16(pModbusSlave->sdata, 3); //前三字节做CRC16校验pModbusSlave->sdata[3]= (i>>8)&0xff; //3字节 CRC16 高位 赋值 赋值 (i>>8)&0xffpModbusSlave->sdata[4]= i&0xff; //4字节 CRC16 地位 赋值 i&0xffpModbusSlave->sendlen=5; //发送长度 5字节ScicRegs.SCIFFTX.bit.TXFFIL = pModbusSlave->sendlen; //填写发送长度ScicRegs.SCIFFTX.bit.TXFFIENA = 1; //发送使能}else //数值超限判定 <=40{switch(pModbusSlave->rdata[1]) //功能码字 第一字节{case MB_FUNC_READ_COIL: //功能码字=1--表示线圈pModbusSlave->sdata[2] = (pTempData.numofregisters+7)/8; //向上取整for(i=0;i<pTempData.numofregisters;i++){pModbusSlave->sdata[3+(i/8)] |= (*(pcoils_sub+i+pTempData.contentIdx) << (i%8));}i=CRC16(pModbusSlave->sdata, pModbusSlave->sdata[2]+3);pModbusSlave->sdata[2+pModbusSlave->sdata[2]+1]=(i>>8)&0xff;pModbusSlave->sdata[2+pModbusSlave->sdata[2]+2]=i&0xff;pModbusSlave->sendlen= pModbusSlave->sendlen + 5 + pModbusSlave->sdata[2];if(pModbusSlave->sendlen > bufferdepth){ScicRegs.SCIFFTX.bit.TXFFIL = bufferdepth;}else{ScicRegs.SCIFFTX.bit.TXFFIL = pModbusSlave->sendlen;}ScicRegs.SCIFFTX.bit.TXFFIENA = 1;break;case MB_FUNC_READ_INPUT: //功能码字=2--表示输入态pModbusSlave->sdata[2] = (pTempData.numofregisters+7)/8; //向上取整for(i=0;i<pTempData.numofregisters;i++){pModbusSlave->sdata[3+(i/8)]|=*(pinputs_sub+i+pTempData.contentIdx) << (i%8);}i=CRC16(pModbusSlave->sdata, pModbusSlave->sdata[2]+3);pModbusSlave->sdata[2+pModbusSlave->sdata[2]+1]=(i>>8)&0xff;pModbusSlave->sdata[2+pModbusSlave->sdata[2]+2]=i&0xff;pModbusSlave->sendlen= pModbusSlave->sendlen + 5 + pModbusSlave->sdata[2];if(pModbusSlave->sendlen > bufferdepth){ScicRegs.SCIFFTX.bit.TXFFIL = bufferdepth;}else{ScicRegs.SCIFFTX.bit.TXFFIL = pModbusSlave->sendlen;}ScicRegs.SCIFFTX.bit.TXFFIENA = 1;break;case MB_FUNC_READ_HOLDINGREGISTERS: //功能码字=3--表示保持寄存器pModbusSlave->sdata[2] = pTempData.numofregisters*2; //向上取整for(i=0;i<(pTempData.numofregisters);i++){pModbusSlave->sdata[3+i*2+1]=*(pholdingRegisters_sub+i+pTempData.contentIdx) ; //发送高16位pModbusSlave->sdata[3+i*2+1] = (pModbusSlave->sdata[3+i*2+1]) & 0xff;pModbusSlave->sdata[3+i*2]=*(pholdingRegisters_sub+i+pTempData.contentIdx) ; //发送低16位pModbusSlave->sdata[3+i*2]=(pModbusSlave->sdata[3+i*2])>>8;}i=CRC16(pModbusSlave->sdata, pModbusSlave->sdata[2]+3);pModbusSlave->sdata[2+pModbusSlave->sdata[2]+1]=(i>>8)&0xff;pModbusSlave->sdata[2+pModbusSlave->sdata[2]+2]=i&0xff;pModbusSlave->sendlen= pModbusSlave->sendlen + 5 + pModbusSlave->sdata[2];if(pModbusSlave->sendlen > bufferdepth){ScicRegs.SCIFFTX.bit.TXFFIL = bufferdepth;}else{ScicRegs.SCIFFTX.bit.TXFFIL = pModbusSlave->sendlen;}ScicRegs.SCIFFTX.bit.TXFFIENA = 1;break;case MB_FUNC_READ_INPUTREGISTERS: //功能码字=4--表示输入寄存器pModbusSlave->sdata[2] = pTempData.numofregisters*2; //向上取整for(i=0;i<(pTempData.numofregisters);i++){pModbusSlave->sdata[3+i*2+1]=*(pinputRegisters_sub+i+pTempData.contentIdx) ;pModbusSlave->sdata[3+i*2+1] = (pModbusSlave->sdata[3+i*2+1]) & 0xff;pModbusSlave->sdata[3+i*2]=*(pinputRegisters_sub+i+pTempData.contentIdx) ;pModbusSlave->sdata[3+i*2]=(pModbusSlave->sdata[3+i*2])>>8;}i=CRC16(pModbusSlave->sdata, pModbusSlave->sdata[2]+3);pModbusSlave->sdata[2+pModbusSlave->sdata[2]+1]=(i>>8)&0xff;pModbusSlave->sdata[2+pModbusSlave->sdata[2]+2]=i&0xff;pModbusSlave->sendlen= pModbusSlave->sendlen + 5 + pModbusSlave->sdata[2];if(pModbusSlave->sendlen > bufferdepth){ScicRegs.SCIFFTX.bit.TXFFIL = bufferdepth;}else{ScicRegs.SCIFFTX.bit.TXFFIL = pModbusSlave->sendlen;}ScicRegs.SCIFFTX.bit.TXFFIENA = 1;break;case MB_FUNC_FORCE_COIL: //功能码字=5--表示for(i=2;i<8;i++){pModbusSlave->sdata[i] = pModbusSlave->rdata[i];}if(pTempData.numofregisters==0xFF00){*(pcoils_sub+pTempData.contentIdx)=1;pModbusSlave->sendlen=8;}else{if(pTempData.numofregisters==0x0000){*(pcoils_sub+pTempData.contentIdx)=0;pModbusSlave->sendlen=8;}else//命令错误{pModbusSlave->sdata[1]= 0x85;pModbusSlave->sdata[2]= 0x03;i=CRC16(pModbusSlave->sdata, 3);pModbusSlave->sdata[3]= (i>>8)&0xff;pModbusSlave->sdata[4]= i&0xff;pModbusSlave->sendlen=5;}}ScicRegs.SCIFFTX.bit.TXFFIL = pModbusSlave->sendlen;ScicRegs.SCIFFTX.bit.TXFFIENA = 1;break;case MB_FUNC_WRITE_HOLDINGREGISTER: //功能码字=6--表示for(i=2;i<8;i++){pModbusSlave->sdata[i] = pModbusSlave->rdata[i];}*(pholdingRegisters_sub+pTempData.contentIdx)=pTempData.numofregisters;pModbusSlave->sendlen=8;ScicRegs.SCIFFTX.bit.TXFFIL = pModbusSlave->sendlen;ScicRegs.SCIFFTX.bit.TXFFIENA = 1;break;case MB_FUNC_FORCE_NCOILS: //功能码字=15--表示for(i=0;i<pTempData.numofregisters;i++){*(pcoils_sub+i+pTempData.contentIdx) = ((pModbusSlave->rdata[i/8+7])>>(i%8))&0x01;}for(i=2;i<7;i++){pModbusSlave->sdata[i] = pModbusSlave->rdata[i];}i=CRC16(pModbusSlave->sdata, 7);pModbusSlave->sdata[7]=(i>>8)&0xff;pModbusSlave->sdata[8]=i&0xff;pModbusSlave->sendlen=9;ScicRegs.SCIFFTX.bit.TXFFIL = pModbusSlave->sendlen;ScicRegs.SCIFFTX.bit.TXFFIENA = 1;break;case MB_FUNC_WRITE_NREGISTERS: //功能码字=16--表示for(i=0;i<pTempData.numofregisters;i++){*(pholdingRegisters_sub+i+pTempData.contentIdx) =(Uint16)(pModbusSlave->rdata[i*2+7]<<8) + (pModbusSlave->rdata[i*2+8]&0xFF);}for(i=2;i<6;i++){pModbusSlave->sdata[i] = pModbusSlave->rdata[i];}i=CRC16(pModbusSlave->sdata, 6);pModbusSlave->sdata[6]=(i>>8)&0xff;pModbusSlave->sdata[7]=i&0xff;pModbusSlave->sendlen=8;ScicRegs.SCIFFTX.bit.TXFFIL = pModbusSlave->sendlen;ScicRegs.SCIFFTX.bit.TXFFIENA = 1;break;default: //功能码字=其他--表示pModbusSlave->sdata[2]= 0x03;i=CRC16(pModbusSlave->sdata, 3);pModbusSlave->sdata[3]= (i>>8)&0xff;pModbusSlave->sdata[4]= i&0xff;pModbusSlave->sendlen=5;ScicRegs.SCIFFTX.bit.TXFFIL = pModbusSlave->sendlen;ScicRegs.SCIFFTX.bit.TXFFIENA = 1;break;}}}else //如果校验CRC校验码错误{pModbusSlave->sdata[1]|= 0x80; //返回错误功能码 01 80 03 CRC1-H CRC2-LpModbusSlave->sdata[2]|= 0x03; //i=CRC16(pModbusSlave->sdata, 3);pModbusSlave->sdata[3]= (i>>8)&0xff; //CRC16-HpModbusSlave->sdata[4]= i&0xff; //CRC16-LpModbusSlave->sendlen=5; //5个字节ScicRegs.SCIFFTX.bit.TXFFIL = pModbusSlave->sendlen;ScicRegs.SCIFFTX.bit.TXFFIENA = 1;}}else //RTU地址错误不处理{ }
}
//#ifdef FLASH
//#pragma CODE_SECTION(CRC16,"ramfuncs")
//#endif
Uint16 CRC16 (Uint16 *nData, Uint16 wLength) //CRC16校验函数
{static const Uint16 wCRCTable[] ={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
// 0x00000,0x0C0C1,0x0C181,0x00140,0x0C301,0x003C0,0x00280,0x0C241,
// 0x0C601,0x006C0,0x00780,0x0C741,0x00500,0x0C5C1,0x0C481,0x00440,
// 0x0CC01,0x00CC0,0x00D80,0x0CD41,0x00F00,0x0CFC1,0x0CE81,0x00E40,
// 0x00A00,0x0CAC1,0x0CB81,0x00B40,0x0C901,0x009C0,0x00880,0x0C841,
// 0x0D801,0x018C0,0x01980,0x0D941,0x01B00,0x0DBC1,0x0DA81,0x01A40,
// 0x01E00,0x0DEC1,0x0DF81,0x01F40,0x0DD01,0x01DC0,0x01C80,0x0DC41,
// 0x01400,0x0D4C1,0x0D581,0x01540,0x0D701,0x017C0,0x01680,0x0D641,
// 0x0D201,0x012C0,0x01380,0x0D341,0x01100,0x0D1C1,0x0D081,0x01040,
// 0x0F001,0x030C0,0x03180,0x0F141,0x03300,0x0F3C1,0x0F281,0x03240,
// 0x03600,0x0F6C1,0x0F781,0x03740,0x0F501,0x035C0,0x03480,0x0F441,
// 0x03C00,0x0FCC1,0x0FD81,0x03D40,0x0FF01,0x03FC0,0x03E80,0x0FE41,
// 0x0FA01,0x03AC0,0x03B80,0x0FB41,0x03900,0x0F9C1,0x0F881,0x03840,
// 0x02800,0x0E8C1,0x0E981,0x02940,0x0EB01,0x02BC0,0x02A80,0x0EA41,
// 0x0EE01,0x02EC0,0x02F80,0x0EF41,0x02D00,0x0EDC1,0x0EC81,0x02C40,
// 0x0E401,0x024C0,0x02580,0x0E541,0x02700,0x0E7C1,0x0E681,0x02640,
// 0x02200,0x0E2C1,0x0E381,0x02340,0x0E101,0x021C0,0x02080,0x0E041,
// 0x0A001,0x060C0,0x06180,0x0A141,0x06300,0x0A3C1,0x0A281,0x06240,
// 0x06600,0x0A6C1,0x0A781,0x06740,0x0A501,0x065C0,0x06480,0x0A441,
// 0x06C00,0x0ACC1,0x0AD81,0x06D40,0x0AF01,0x06FC0,0x06E80,0x0AE41,
// 0x0AA01,0x06AC0,0x06B80,0x0AB41,0x06900,0x0A9C1,0x0A881,0x06840,
// 0x07800,0x0B8C1,0x0B981,0x07940,0x0BB01,0x07BC0,0x07A80,0x0BA41,
// 0x0BE01,0x07EC0,0x07F80,0x0BF41,0x07D00,0x0BDC1,0x0BC81,0x07C40,
// 0x0B401,0x074C0,0x07580,0x0B541,0x07700,0x0B7C1,0x0B681,0x07640,
// 0x07200,0x0B2C1,0x0B381,0x07340,0x0B101,0x071C0,0x07080,0x0B041,
// 0x05000,0x090C1,0x09181,0x05140,0x09301,0x053C0,0x05280,0x09241,
// 0x09601,0x056C0,0x05780,0x09741,0x05500,0x095C1,0x09481,0x05440,
// 0x09C01,0x05CC0,0x05D80,0x09D41,0x05F00,0x09FC1,0x09E81,0x05E40,
// 0x05A00,0x09AC1,0x09B81,0x05B40,0x09901,0x059C0,0x05880,0x09841,
// 0x08801,0x048C0,0x04980,0x08941,0x04B00,0x08BC1,0x08A81,0x04A40,
// 0x04E00,0x08EC1,0x08F81,0x04F40,0x08D01,0x04DC0,0x04C80,0x08C41,
// 0x04400,0x084C1,0x08581,0x04540,0x08701,0x047C0,0x04680,0x08641,
// 0x08201,0x042C0,0x04380,0x08341,0x04100,0x081C1,0x08081,0x04040};Uint16 nTemp;Uint16 wCRCWord = 0xFFFF;while (wLength--){nTemp = (*nData++ ^ wCRCWord)&0xff;wCRCWord >>= 8;wCRCWord ^= wCRCTable[nTemp];}wCRCWord = (Uint16) ((wCRCWord<<8)+(wCRCWord>>8));return wCRCWord;
}void scic_rx_test()
{if(SCIC_TXRX_485_ST==1) //发送状态正确{scicsendmsg = "\r\nEnter a character:\0"; //发送语句 \r-13 \n-10scic_msg(scicsendmsg); //发送函数}if((ScicRegs.SCIFFRX.bit.RXFFST == 1)&&(SCIC_TXRX_485_ST==0)) //接收状态正确并且状态字接收{scicReceivedChar = ScicRegs.SCIRXBUF.all; //把接收BUF里的数据赋值给ReceivedCharscic_xmit(scicReceivedChar); //发送ReceivedCharSCIC_TX_485; //高电平scicsendmsg = "be send!\0"; //发送语句scic_msg(scicsendmsg); //发送函数}
}void scic_xmit(int Schar) // SCIC发送一个字符函数
{SCIC_TX_485;while (ScicRegs.SCIFFTX.bit.TXFFST != 0) { } //表示未发送完毕时等待ScicRegs.SCITXBUF=Schar;SCIC_RX_485; //拉低
}void scic_msg(char *scisendcmsg) //发送整个数组的函数
{int i;i = 0;while(scicsendmsg[i] != '\0') //发送一个字符串 并且 以 \0 字符结束{scic_xmit(scicsendmsg[i]);i++;}
}void scic_fifo_init()
{ScicRegs.SCICTL2.bit.TXINTENA =1;ScicRegs.SCICTL2.bit.RXBKINTENA =1;ScicRegs.SCIHBAUD =0x0001;ScicRegs.SCILBAUD =0x00E7;ScicRegs.SCIFFCT.all =0x00; //为默认值 效果为 禁用自动波特率调整 fifo传送延时为0ScicRegs.SCIFFTX.bit.SCIFFENA = 1; //使能sci fifo功能ScicRegs.SCIFFTX.bit.TXFIFOXRESET=1; //重新使能发送fifo操作ScicRegs.SCIFFTX.bit.TXFFIENA = 1; //fifo 发送中断使能ScicRegs.SCIFFTX.bit.TXFFIL = 0; //发送中断级别,此时为上电默认值0ScicRegs.SCIFFRX.bit.RXFFOVRCLR = 1; //清接收fifo溢出标志ScicRegs.SCIFFRX.bit.RXFFINTCLR = 1; //清接收fifo中断标志位ScicRegs.SCIFFRX.bit.RXFFIENA = 1; //使能fifo接收中断ScicRegs.SCIFFRX.bit.RXFFIL = 1; //fifo接收中断级别为8ScicRegs.SCIFFRX.bit.RXFIFORESET=1; //重新使能接收fifo操作
}void scic_echoback_init(void)
{
// Note: Clocks were turned on to the SCIC peripheral in the InitSysCtrl() functionScicRegs.SCICCR.all =0x0007; // 1 stop bit, No loopback, No parity,8 char bits,async mode, idle-line protocol
// ScicRegs.SCICTL1.all =0x0003; // enable TX, RX, internal SCICLK, Disable RX ERR, SLEEP, TXWAKEScicRegs.SCICTL1.all =0x0023; // Relinquish SCI from ResetScicRegs.SCICTL1.bit.RXERRINTENA=1;
}void DATA_TRANSFER_DSP_HMI(void)
{//系统运行参数赋值sys_mod_quantity=*(pholdingRegisters_sub+0);sys_DC_VOLTAGE_set=*(pholdingRegisters_sub+1);sys_wired_mode=*(pholdingRegisters_sub+2);sys_LO_V=*(pholdingRegisters_sub+3);sys_OL_V=*(pholdingRegisters_sub+4);sys_OV_V=*(pholdingRegisters_sub+5);sys_OV_HZ=*(pholdingRegisters_sub+6);sys_OL_HZ=*(pholdingRegisters_sub+7);sys_mini_current=*(pholdingRegisters_sub+8);sys_maxi_current=*(pholdingRegisters_sub+9);sys_IGBT_over_temperature=*(pholdingRegisters_sub+10);sys_VH_O=*(pholdingRegisters_sub+11);sys_CH_O=*(pholdingRegisters_sub+12);sys_COMPENSATION_mode=*(pholdingRegisters_sub+13);sys_HLCOMPENSATION_transf=*(pholdingRegisters_sub+14);sys_HL_COMPENSATIONA_direction=(*(pholdingRegisters_sub+15)&0x0001);sys_HL_COMPENSATIONB_direction=((*(pholdingRegisters_sub+15))&0x0002)>>1;sys_HL_COMPENSATIONC_direction=((*(pholdingRegisters_sub+15))&0x0004)>>2;sys_HLGRID_transf=*(pholdingRegisters_sub+16);sys_HL_GRIDA_direction=(*(pholdingRegisters_sub+17)&0x0001);sys_HL_GRIDB_direction=((*(pholdingRegisters_sub+17))&0x0002)>>1;sys_HL_GRIDC_direction=((*(pholdingRegisters_sub+17))&0x0004)>>2;sys_HL_GRID_position=((*(pholdingRegisters_sub+17))&0x0008)>>3;sys_HLDEVICE_transf=*(pholdingRegisters_sub+18);sys_HL_DEVICEA_direction=*(pholdingRegisters_sub+19);sys_HL_DEVICEB_direction=((*(pholdingRegisters_sub+19))&0x0002)>>1;sys_HL_DEVICEC_direction=((*(pholdingRegisters_sub+19))&0x0004)>>2;sys_odd_sel_1=*(pholdingRegisters_sub+20);sys_odd_sel_2=*(pholdingRegisters_sub+21);sys_even_sel_1=*(pholdingRegisters_sub+22);sys_even_sel_2=*(pholdingRegisters_sub+23);sys_mod_start_mode=*(pholdingRegisters_sub+24);sys_limit_current=*(pholdingRegisters_sub+25);sys_mod_power_on_off=*(pholdingRegisters_sub+26);sys_meter_mode=*(pholdingRegisters_sub+27);sys_cap_on_off_logic_mode=*(pholdingRegisters_sub+28);sys_cap_relay_total=*(pholdingRegisters_sub+29);sys_cap_capacity=*(pholdingRegisters_sub+30);sys_cap_on_off_delay_time=*(pholdingRegisters_sub+31);sys_cap_live_time_max=*(pholdingRegisters_sub+32);sys_cap_rest_time_min=*(pholdingRegisters_sub+33);sys_extinguish_pf=*(pholdingRegisters_sub+34);sys_extinguish_pf_Tan=*(pholdingRegisters_sub+35);sys_generate_pf=*(pholdingRegisters_sub+36);sys_generate_pf_tan=*(pholdingRegisters_sub+37);sys_mod_cap_unit=*(pholdingRegisters_sub+38);sys_device_comp_max=*(pholdingRegisters_sub+39);sys_mod_DA1=*(pholdingRegisters_sub+40);sys_mod_DA2=*(pholdingRegisters_sub+41);sys_test_cur_max=*(pholdingRegisters_sub+42);sys_test_Q_instruction=*(pholdingRegisters_sub+43);sys_test_3_instruction=*(pholdingRegisters_sub+44);sys_test_5_instruction=*(pholdingRegisters_sub+45);sys_test_7_instruction=*(pholdingRegisters_sub+46);sys_LC_on_num=*(pholdingRegisters_sub+47);LC_Relay_ON(sys_LC_on_num);sys_LC_off_num=*(pholdingRegisters_sub+48);LC_Relay_OFF(sys_LC_off_num);//系统信息上传//电网三相电压有效值*(pinputRegisters_sub+0)=cal_ua_rms*10; //floatToIEEE754_H(cal_ua_rms);*(pinputRegisters_sub+1)=cal_ub_rms*10; //cal_ub_rms*10;*(pinputRegisters_sub+2)=cal_uc_rms*10;//电源侧三相电流有效值*(pinputRegisters_sub+3)=cal_ias_rms*10;*(pinputRegisters_sub+4)=cal_ibs_rms*10;*(pinputRegisters_sub+5)=cal_ics_rms*10;//负载侧三相电流有效值*(pinputRegisters_sub+6)=cal_ial_rms*10;*(pinputRegisters_sub+7)=cal_ibl_rms*10;*(pinputRegisters_sub+8)=cal_icl_rms*10;//装置侧三相补偿电流有效值*(pinputRegisters_sub+9)=cal_iad_rms*10;*(pinputRegisters_sub+10)=cal_ibd_rms*10;*(pinputRegisters_sub+11)=cal_icd_rms*10;//本模块三相补偿电流有效值*(pinputRegisters_sub+12)=cal_iac_rms*10;*(pinputRegisters_sub+13)=cal_ibc_rms*10;*(pinputRegisters_sub+14)=cal_icc_rms*10;//电网频率*(pinputRegisters_sub+15)=cal_Grid_frequency*10;//直流母线上下电压*(pinputRegisters_sub+16)=cal_DC_U_rms*10;*(pinputRegisters_sub+17)=cal_DC_D_rms*10;//IGBT温度*(pinputRegisters_sub+18)=cal_TEMP_IGBTA_rms*10;*(pinputRegisters_sub+19)=cal_TEMP_IGBTB_rms*10;*(pinputRegisters_sub+20)=0;//电网相序*(pinputRegisters_sub+21)=cal_Phase_seq;//电源侧功率及功率因数*(pinputRegisters_sub+22)=cal_aPs*10;*(pinputRegisters_sub+23)=cal_bPs*10;*(pinputRegisters_sub+24)=cal_cPs*10;*(pinputRegisters_sub+25)=cal_aQs*10;*(pinputRegisters_sub+26)=cal_bQs*10;*(pinputRegisters_sub+27)=cal_cQs*10;*(pinputRegisters_sub+28)=cal_aSs*10;*(pinputRegisters_sub+29)=cal_bSs*10;*(pinputRegisters_sub+30)=cal_cSs*10;*(pinputRegisters_sub+31)=cal_flag_apfs;*(pinputRegisters_sub+32)=cal_flag_bpfs;*(pinputRegisters_sub+33)=cal_flag_bpfs;*(pinputRegisters_sub+34)=cal_aPFs*1000;*(pinputRegisters_sub+35)=cal_bPFs*1000;*(pinputRegisters_sub+36)=cal_cPFs*1000;*(pinputRegisters_sub+37)=cal_Har_aPFs*1000;*(pinputRegisters_sub+38)=cal_Har_bPFs*1000;*(pinputRegisters_sub+39)=cal_Har_cPFs*1000;*(pinputRegisters_sub+40)=cal_ind_caps_flag;*(pinputRegisters_sub+41)=cal_pfs_average*1000;*(pinputRegisters_sub+42)=cal_har_pfs_average*1000;//负载侧功率及功率因数*(pinputRegisters_sub+43)=cal_aPl*10;*(pinputRegisters_sub+44)=cal_bPl*10;*(pinputRegisters_sub+45)=cal_cPl*10;*(pinputRegisters_sub+46)=cal_aQl*10;*(pinputRegisters_sub+47)=cal_bQl*10;*(pinputRegisters_sub+48)=cal_bQl*10;*(pinputRegisters_sub+49)=cal_aSl*10;*(pinputRegisters_sub+50)=cal_bSl*10;*(pinputRegisters_sub+51)=cal_cSl*10;*(pinputRegisters_sub+52)=cal_flag_apfl;*(pinputRegisters_sub+53)=cal_flag_bpfl;*(pinputRegisters_sub+54)=cal_flag_bpfl;*(pinputRegisters_sub+55)=cal_aPFl*1000;*(pinputRegisters_sub+56)=cal_bPFl*1000;*(pinputRegisters_sub+57)=cal_cPFl*1000;*(pinputRegisters_sub+58)=cal_Har_aPFl*1000;*(pinputRegisters_sub+59)=cal_Har_bPFl*1000;*(pinputRegisters_sub+60)=cal_Har_cPFl*1000;*(pinputRegisters_sub+61)=cal_ind_capl_flag;*(pinputRegisters_sub+62)=cal_pfl_average*1000;*(pinputRegisters_sub+63)=cal_har_pfl_average*1000;//电网电压、电源侧电流、负载侧电流谐波总含量*(pinputRegisters_sub+64)=cal_THDu_a_total*10;*(pinputRegisters_sub+65)=cal_THDu_b_total*10;*(pinputRegisters_sub+66)=cal_THDu_c_total*10;*(pinputRegisters_sub+67)=cal_THDi_as_total*10;*(pinputRegisters_sub+68)=cal_THDi_bs_total*10;*(pinputRegisters_sub+69)=cal_THDi_cs_total*10;*(pinputRegisters_sub+70)=cal_THDi_al_total*10;*(pinputRegisters_sub+71)=cal_THDi_bl_total*10;*(pinputRegisters_sub+72)=cal_THDi_cl_total*10;//告警码*(pinputRegisters_sub+73)=err_err_byte[0];*(pinputRegisters_sub+74)=err_err_byte[1];*(pinputRegisters_sub+75)=err_err_byte[2];//LC继电器状态*(pinputRegisters_sub+76)=cap_relay_status_top;*(pinputRegisters_sub+76)=((*(pinputRegisters_sub+76))<<8)|(cap_relay_status_bottom);// *(pinputRegisters_sub+77)=(cap_relay_status_bottom<<16);//投入LC电流测试*(pinputRegisters_sub+78)=cal_diff_cur[0];*(pinputRegisters_sub+79)=cal_diff_cur[1];*(pinputRegisters_sub+80)=cal_diff_cur[2];*(pinputRegisters_sub+81)=cal_diff_cur[3];*(pinputRegisters_sub+82)=cal_diff_cur[4];*(pinputRegisters_sub+83)=cal_diff_cur[5];*(pinputRegisters_sub+84)=cal_diff_cur[6];*(pinputRegisters_sub+85)=cal_diff_cur[7];*(pinputRegisters_sub+86)=cal_diff_cur[8];*(pinputRegisters_sub+87)=cal_diff_cur[9];*(pinputRegisters_sub+88)=cal_diff_cur[10];*(pinputRegisters_sub+89)=cal_diff_cur[11];*(pinputRegisters_sub+90)=cal_diff_cur[12];*(pinputRegisters_sub+91)=cal_diff_cur[13];*(pinputRegisters_sub+92)=cal_diff_cur[14];*(pinputRegisters_sub+93)=cal_diff_cur[15];//A相电源侧各次谐波含量*(pinputRegisters_sub+94)=cal_thdi_as[1];*(pinputRegisters_sub+94)=((*(pinputRegisters_sub+94))<<8)|((int)cal_thdi_as[2]);*(pinputRegisters_sub+95)=cal_thdi_as[3];*(pinputRegisters_sub+95)=((*(pinputRegisters_sub+95))<<8)|((int)cal_thdi_as[4]);*(pinputRegisters_sub+96)=cal_thdi_as[5];*(pinputRegisters_sub+96)=((*(pinputRegisters_sub+96))<<8)|((int)cal_thdi_as[6]);*(pinputRegisters_sub+97)=cal_thdi_as[7];*(pinputRegisters_sub+97)=((*(pinputRegisters_sub+97))<<8)|((int)cal_thdi_as[8]);*(pinputRegisters_sub+98)=cal_thdi_as[9];*(pinputRegisters_sub+98)=((*(pinputRegisters_sub+98))<<8)|((int)cal_thdi_as[10]);*(pinputRegisters_sub+99)=cal_thdi_as[11];*(pinputRegisters_sub+99)=((*(pinputRegisters_sub+99))<<8)|((int)cal_thdi_as[12]);*(pinputRegisters_sub+100)=cal_thdi_as[13];*(pinputRegisters_sub+100)=((*(pinputRegisters_sub+100))<<8)|((int)cal_thdi_as[14]);*(pinputRegisters_sub+101)=cal_thdi_as[15];*(pinputRegisters_sub+101)=((*(pinputRegisters_sub+101))<<8)|((int)cal_thdi_as[16]);*(pinputRegisters_sub+102)=cal_thdi_as[17];*(pinputRegisters_sub+102)=((*(pinputRegisters_sub+102))<<8)|((int)cal_thdi_as[18]);*(pinputRegisters_sub+103)=cal_thdi_as[19];*(pinputRegisters_sub+103)=((*(pinputRegisters_sub+103))<<8)|((int)cal_thdi_as[21]);*(pinputRegisters_sub+104)=cal_thdi_as[23];*(pinputRegisters_sub+104)=((*(pinputRegisters_sub+104))<<8)|((int)cal_thdi_as[25]);*(pinputRegisters_sub+105)=cal_thdi_as[27];*(pinputRegisters_sub+105)=((*(pinputRegisters_sub+105))<<8)|((int)cal_thdi_as[29]);*(pinputRegisters_sub+106)=cal_thdi_as[31];*(pinputRegisters_sub+106)=((*(pinputRegisters_sub+106))<<8)|((int)cal_thdi_as[33]);*(pinputRegisters_sub+107)=cal_thdi_as[35];*(pinputRegisters_sub+107)=((*(pinputRegisters_sub+107))<<8)|((int)cal_thdi_as[37]);*(pinputRegisters_sub+108)=cal_thdi_as[39];*(pinputRegisters_sub+108)=((*(pinputRegisters_sub+108))<<8)|((int)cal_thdi_as[41]);*(pinputRegisters_sub+109)=cal_thdi_as[43];*(pinputRegisters_sub+109)=((*(pinputRegisters_sub+109))<<8)|((int)cal_thdi_as[45]);*(pinputRegisters_sub+110)=cal_thdi_as[47];*(pinputRegisters_sub+110)=((*(pinputRegisters_sub+110))<<8)|((int)cal_thdi_as[49]);//B相电源侧各次谐波含量*(pinputRegisters_sub+111)=cal_thdi_bs[1];*(pinputRegisters_sub+111)=((*(pinputRegisters_sub+111))<<8)|((int)cal_thdi_bs[2]);*(pinputRegisters_sub+112)=cal_thdi_bs[3];*(pinputRegisters_sub+112)=((*(pinputRegisters_sub+112))<<8)|((int)cal_thdi_bs[4]);*(pinputRegisters_sub+113)=cal_thdi_bs[5];*(pinputRegisters_sub+113)=((*(pinputRegisters_sub+113))<<8)|((int)cal_thdi_bs[6]);*(pinputRegisters_sub+114)=cal_thdi_bs[7];*(pinputRegisters_sub+114)=((*(pinputRegisters_sub+114))<<8)|((int)cal_thdi_bs[8]);*(pinputRegisters_sub+115)=cal_thdi_bs[9];*(pinputRegisters_sub+115)=((*(pinputRegisters_sub+115))<<8)|((int)cal_thdi_bs[10]);*(pinputRegisters_sub+116)=cal_thdi_bs[11];*(pinputRegisters_sub+116)=((*(pinputRegisters_sub+116))<<8)|((int)cal_thdi_bs[12]);*(pinputRegisters_sub+117)=cal_thdi_bs[13];*(pinputRegisters_sub+117)=((*(pinputRegisters_sub+117))<<8)|((int)cal_thdi_bs[14]);*(pinputRegisters_sub+118)=cal_thdi_bs[15];*(pinputRegisters_sub+118)=((*(pinputRegisters_sub+118))<<8)|((int)cal_thdi_bs[16]);*(pinputRegisters_sub+119)=cal_thdi_bs[17];*(pinputRegisters_sub+119)=((*(pinputRegisters_sub+119))<<8)|((int)cal_thdi_bs[18]);*(pinputRegisters_sub+120)=cal_thdi_bs[19];*(pinputRegisters_sub+120)=((*(pinputRegisters_sub+120))<<8)|((int)cal_thdi_bs[21]);*(pinputRegisters_sub+121)=cal_thdi_bs[23];*(pinputRegisters_sub+121)=((*(pinputRegisters_sub+121))<<8)|((int)cal_thdi_bs[25]);*(pinputRegisters_sub+122)=cal_thdi_bs[27];*(pinputRegisters_sub+122)=((*(pinputRegisters_sub+122))<<8)|((int)cal_thdi_bs[29]);*(pinputRegisters_sub+123)=cal_thdi_bs[31];*(pinputRegisters_sub+123)=((*(pinputRegisters_sub+123))<<8)|((int)cal_thdi_bs[33]);*(pinputRegisters_sub+124)=cal_thdi_bs[35];*(pinputRegisters_sub+124)=((*(pinputRegisters_sub+124))<<8)|((int)cal_thdi_bs[37]);*(pinputRegisters_sub+125)=cal_thdi_bs[39];*(pinputRegisters_sub+125)=((*(pinputRegisters_sub+125))<<8)|((int)cal_thdi_bs[41]);*(pinputRegisters_sub+126)=cal_thdi_bs[43];*(pinputRegisters_sub+126)=((*(pinputRegisters_sub+126))<<8)|((int)cal_thdi_bs[45]);*(pinputRegisters_sub+127)=cal_thdi_bs[47];*(pinputRegisters_sub+127)=((*(pinputRegisters_sub+127))<<8)|((int)cal_thdi_bs[49]);//C相电源侧各次谐波含量*(pinputRegisters_sub+128)=cal_thdi_cs[1];*(pinputRegisters_sub+128)=((*(pinputRegisters_sub+128))<<8)|((int)cal_thdi_cs[2]);*(pinputRegisters_sub+129)=cal_thdi_cs[3];*(pinputRegisters_sub+129)=((*(pinputRegisters_sub+129))<<8)|((int)cal_thdi_cs[4]);*(pinputRegisters_sub+130)=cal_thdi_cs[5];*(pinputRegisters_sub+130)=((*(pinputRegisters_sub+130))<<8)|((int)cal_thdi_cs[6]);*(pinputRegisters_sub+131)=cal_thdi_cs[7];*(pinputRegisters_sub+131)=((*(pinputRegisters_sub+131))<<8)|((int)cal_thdi_cs[8]);*(pinputRegisters_sub+132)=cal_thdi_cs[9];*(pinputRegisters_sub+132)=((*(pinputRegisters_sub+132))<<8)|((int)cal_thdi_cs[10]);*(pinputRegisters_sub+133)=cal_thdi_cs[11];*(pinputRegisters_sub+133)=((*(pinputRegisters_sub+133))<<8)|((int)cal_thdi_cs[12]);*(pinputRegisters_sub+134)=cal_thdi_cs[13];*(pinputRegisters_sub+134)=((*(pinputRegisters_sub+134))<<8)|((int)cal_thdi_cs[14]);*(pinputRegisters_sub+135)=cal_thdi_cs[15];*(pinputRegisters_sub+135)=((*(pinputRegisters_sub+135))<<8)|((int)cal_thdi_cs[16]);*(pinputRegisters_sub+136)=cal_thdi_cs[17];*(pinputRegisters_sub+136)=((*(pinputRegisters_sub+136))<<8)|((int)cal_thdi_cs[18]);*(pinputRegisters_sub+137)=cal_thdi_cs[19];*(pinputRegisters_sub+137)=((*(pinputRegisters_sub+137))<<8)|((int)cal_thdi_cs[21]);*(pinputRegisters_sub+138)=cal_thdi_cs[23];*(pinputRegisters_sub+138)=((*(pinputRegisters_sub+138))<<8)|((int)cal_thdi_cs[25]);*(pinputRegisters_sub+139)=cal_thdi_cs[27];*(pinputRegisters_sub+139)=((*(pinputRegisters_sub+139))<<8)|((int)cal_thdi_cs[29]);*(pinputRegisters_sub+140)=cal_thdi_cs[31];*(pinputRegisters_sub+140)=((*(pinputRegisters_sub+140))<<8)|((int)cal_thdi_cs[33]);*(pinputRegisters_sub+141)=cal_thdi_cs[35];*(pinputRegisters_sub+141)=((*(pinputRegisters_sub+141))<<8)|((int)cal_thdi_cs[37]);*(pinputRegisters_sub+142)=cal_thdi_cs[39];*(pinputRegisters_sub+142)=((*(pinputRegisters_sub+142))<<8)|((int)cal_thdi_cs[41]);*(pinputRegisters_sub+143)=cal_thdi_cs[43];*(pinputRegisters_sub+143)=((*(pinputRegisters_sub+143))<<8)|((int)cal_thdi_cs[45]);*(pinputRegisters_sub+144)=cal_thdi_cs[47];*(pinputRegisters_sub+144)=((*(pinputRegisters_sub+144))<<8)|((int)cal_thdi_cs[49]);//A相负载侧各次谐波含量*(pinputRegisters_sub+145)=cal_thdi_al[1];*(pinputRegisters_sub+145)=((*(pinputRegisters_sub+145))<<8)|((int)cal_thdi_al[2]);*(pinputRegisters_sub+146)=cal_thdi_al[3];*(pinputRegisters_sub+146)=((*(pinputRegisters_sub+146))<<8)|((int)cal_thdi_al[4]);*(pinputRegisters_sub+147)=cal_thdi_al[5];*(pinputRegisters_sub+147)=((*(pinputRegisters_sub+147))<<8)|((int)cal_thdi_al[6]);*(pinputRegisters_sub+148)=cal_thdi_al[7];*(pinputRegisters_sub+148)=((*(pinputRegisters_sub+148))<<8)|((int)cal_thdi_al[8]);*(pinputRegisters_sub+149)=cal_thdi_al[9];*(pinputRegisters_sub+149)=((*(pinputRegisters_sub+149))<<8)|((int)cal_thdi_al[10]);*(pinputRegisters_sub+150)=cal_thdi_al[11];*(pinputRegisters_sub+150)=((*(pinputRegisters_sub+150))<<8)|((int)cal_thdi_al[12]);*(pinputRegisters_sub+151)=cal_thdi_al[13];*(pinputRegisters_sub+151)=((*(pinputRegisters_sub+151))<<8)|((int)cal_thdi_al[14]);*(pinputRegisters_sub+152)=cal_thdi_al[15];*(pinputRegisters_sub+152)=((*(pinputRegisters_sub+152))<<8)|((int)cal_thdi_al[16]);*(pinputRegisters_sub+153)=cal_thdi_al[17];*(pinputRegisters_sub+153)=((*(pinputRegisters_sub+153))<<8)|((int)cal_thdi_al[18]);*(pinputRegisters_sub+154)=cal_thdi_al[19];*(pinputRegisters_sub+154)=((*(pinputRegisters_sub+154))<<8)|((int)cal_thdi_al[21]);*(pinputRegisters_sub+155)=cal_thdi_al[23];*(pinputRegisters_sub+155)=((*(pinputRegisters_sub+155))<<8)|((int)cal_thdi_al[25]);*(pinputRegisters_sub+156)=cal_thdi_al[27];*(pinputRegisters_sub+156)=((*(pinputRegisters_sub+156))<<8)|((int)cal_thdi_al[29]);*(pinputRegisters_sub+157)=cal_thdi_al[31];*(pinputRegisters_sub+157)=((*(pinputRegisters_sub+157))<<8)|((int)cal_thdi_al[33]);*(pinputRegisters_sub+158)=cal_thdi_al[35];*(pinputRegisters_sub+158)=((*(pinputRegisters_sub+158))<<8)|((int)cal_thdi_al[37]);*(pinputRegisters_sub+159)=cal_thdi_al[39];*(pinputRegisters_sub+159)=((*(pinputRegisters_sub+159))<<8)|((int)cal_thdi_al[41]);*(pinputRegisters_sub+160)=cal_thdi_al[43];*(pinputRegisters_sub+160)=((*(pinputRegisters_sub+160))<<8)|((int)cal_thdi_al[45]);*(pinputRegisters_sub+161)=cal_thdi_al[47];*(pinputRegisters_sub+161)=((*(pinputRegisters_sub+161))<<8)|((int)cal_thdi_al[49]);//B相负载侧各次谐波含量*(pinputRegisters_sub+162)=cal_thdi_bl[1];*(pinputRegisters_sub+162)=((*(pinputRegisters_sub+162))<<8)|((int)cal_thdi_bl[2]);*(pinputRegisters_sub+163)=cal_thdi_bl[3];*(pinputRegisters_sub+163)=((*(pinputRegisters_sub+163))<<8)|((int)cal_thdi_bl[4]);*(pinputRegisters_sub+164)=cal_thdi_bl[5];*(pinputRegisters_sub+164)=((*(pinputRegisters_sub+164))<<8)|((int)cal_thdi_bl[6]);*(pinputRegisters_sub+165)=cal_thdi_bl[7];*(pinputRegisters_sub+165)=((*(pinputRegisters_sub+165))<<8)|((int)cal_thdi_bl[8]);*(pinputRegisters_sub+166)=cal_thdi_bl[9];*(pinputRegisters_sub+166)=((*(pinputRegisters_sub+166))<<8)|((int)cal_thdi_bl[10]);*(pinputRegisters_sub+167)=cal_thdi_bl[11];*(pinputRegisters_sub+167)=((*(pinputRegisters_sub+167))<<8)|((int)cal_thdi_bl[12]);*(pinputRegisters_sub+168)=cal_thdi_bl[13];*(pinputRegisters_sub+168)=((*(pinputRegisters_sub+168))<<8)|((int)cal_thdi_bl[14]);*(pinputRegisters_sub+169)=cal_thdi_bl[15];*(pinputRegisters_sub+169)=((*(pinputRegisters_sub+169))<<8)|((int)cal_thdi_bl[16]);*(pinputRegisters_sub+170)=cal_thdi_bl[17];*(pinputRegisters_sub+170)=((*(pinputRegisters_sub+170))<<8)|((int)cal_thdi_bl[18]);*(pinputRegisters_sub+171)=cal_thdi_bl[19];*(pinputRegisters_sub+171)=((*(pinputRegisters_sub+171))<<8)|((int)cal_thdi_bl[21]);*(pinputRegisters_sub+172)=cal_thdi_bl[23];*(pinputRegisters_sub+172)=((*(pinputRegisters_sub+172))<<8)|((int)cal_thdi_bl[25]);*(pinputRegisters_sub+173)=cal_thdi_bl[27];*(pinputRegisters_sub+173)=((*(pinputRegisters_sub+173))<<8)|((int)cal_thdi_bl[29]);*(pinputRegisters_sub+174)=cal_thdi_bl[31];*(pinputRegisters_sub+174)=((*(pinputRegisters_sub+174))<<8)|((int)cal_thdi_bl[33]);*(pinputRegisters_sub+175)=cal_thdi_bl[35];*(pinputRegisters_sub+175)=((*(pinputRegisters_sub+175))<<8)|((int)cal_thdi_bl[37]);*(pinputRegisters_sub+176)=cal_thdi_bl[39];*(pinputRegisters_sub+176)=((*(pinputRegisters_sub+176))<<8)|((int)cal_thdi_bl[41]);*(pinputRegisters_sub+177)=cal_thdi_bl[43];*(pinputRegisters_sub+177)=((*(pinputRegisters_sub+177))<<8)|((int)cal_thdi_bl[45]);*(pinputRegisters_sub+178)=cal_thdi_bl[47];*(pinputRegisters_sub+178)=((*(pinputRegisters_sub+178))<<8)|((int)cal_thdi_bl[49]);//C相负载侧各次谐波含量*(pinputRegisters_sub+179)=cal_thdi_cl[1];*(pinputRegisters_sub+179)=((*(pinputRegisters_sub+179))<<8)|((int)cal_thdi_cl[2]);*(pinputRegisters_sub+180)=cal_thdi_cl[3];*(pinputRegisters_sub+180)=((*(pinputRegisters_sub+180))<<8)|((int)cal_thdi_cl[4]);*(pinputRegisters_sub+181)=cal_thdi_cl[5];*(pinputRegisters_sub+181)=((*(pinputRegisters_sub+181))<<8)|((int)cal_thdi_cl[6]);*(pinputRegisters_sub+182)=cal_thdi_cl[7];*(pinputRegisters_sub+182)=((*(pinputRegisters_sub+182))<<8)|((int)cal_thdi_cl[8]);*(pinputRegisters_sub+183)=cal_thdi_cl[9];*(pinputRegisters_sub+183)=((*(pinputRegisters_sub+183))<<8)|((int)cal_thdi_cl[10]);*(pinputRegisters_sub+184)=cal_thdi_cl[11];*(pinputRegisters_sub+184)=((*(pinputRegisters_sub+184))<<8)|((int)cal_thdi_cl[12]);*(pinputRegisters_sub+185)=cal_thdi_cl[13];*(pinputRegisters_sub+185)=((*(pinputRegisters_sub+185))<<8)|((int)cal_thdi_cl[14]);*(pinputRegisters_sub+186)=cal_thdi_cl[15];*(pinputRegisters_sub+186)=((*(pinputRegisters_sub+186))<<8)|((int)cal_thdi_cl[16]);*(pinputRegisters_sub+187)=cal_thdi_cl[17];*(pinputRegisters_sub+187)=((*(pinputRegisters_sub+187))<<8)|((int)cal_thdi_cl[18]);*(pinputRegisters_sub+188)=cal_thdi_cl[19];*(pinputRegisters_sub+188)=((*(pinputRegisters_sub+188))<<8)|((int)cal_thdi_cl[21]);*(pinputRegisters_sub+189)=cal_thdi_cl[23];*(pinputRegisters_sub+189)=((*(pinputRegisters_sub+189))<<8)|((int)cal_thdi_cl[25]);*(pinputRegisters_sub+190)=cal_thdi_cl[27];*(pinputRegisters_sub+190)=((*(pinputRegisters_sub+190))<<8)|((int)cal_thdi_cl[29]);*(pinputRegisters_sub+191)=cal_thdi_cl[31];*(pinputRegisters_sub+191)=((*(pinputRegisters_sub+191))<<8)|((int)cal_thdi_cl[33]);*(pinputRegisters_sub+192)=cal_thdi_cl[35];*(pinputRegisters_sub+192)=((*(pinputRegisters_sub+192))<<8)|((int)cal_thdi_cl[37]);*(pinputRegisters_sub+193)=cal_thdi_cl[39];*(pinputRegisters_sub+193)=((*(pinputRegisters_sub+193))<<8)|((int)cal_thdi_cl[41]);*(pinputRegisters_sub+194)=cal_thdi_cl[43];*(pinputRegisters_sub+194)=((*(pinputRegisters_sub+194))<<8)|((int)cal_thdi_cl[45]);*(pinputRegisters_sub+195)=cal_thdi_cl[47];*(pinputRegisters_sub+195)=((*(pinputRegisters_sub+195))<<8)|((int)cal_thdi_cl[49]);//A相电压各次谐波含量*(pinputRegisters_sub+196)=cal_thdu_a[1];*(pinputRegisters_sub+196)=((*(pinputRegisters_sub+196))<<8)|((int)cal_thdu_a[2]);*(pinputRegisters_sub+197)=cal_thdu_a[3];*(pinputRegisters_sub+197)=((*(pinputRegisters_sub+197))<<8)|((int)cal_thdu_a[4]);*(pinputRegisters_sub+198)=cal_thdu_a[5];*(pinputRegisters_sub+198)=((*(pinputRegisters_sub+198))<<8)|((int)cal_thdu_a[6]);*(pinputRegisters_sub+199)=cal_thdu_a[7];*(pinputRegisters_sub+199)=((*(pinputRegisters_sub+199))<<8)|((int)cal_thdu_a[8]);*(pinputRegisters_sub+200)=cal_thdu_a[9];*(pinputRegisters_sub+200)=((*(pinputRegisters_sub+200))<<8)|((int)cal_thdu_a[10]);*(pinputRegisters_sub+201)=cal_thdu_a[11];*(pinputRegisters_sub+201)=((*(pinputRegisters_sub+201))<<8)|((int)cal_thdu_a[12]);*(pinputRegisters_sub+202)=cal_thdu_a[13];*(pinputRegisters_sub+202)=((*(pinputRegisters_sub+202))<<8)|((int)cal_thdu_a[14]);*(pinputRegisters_sub+203)=cal_thdu_a[15];*(pinputRegisters_sub+203)=((*(pinputRegisters_sub+203))<<8)|((int)cal_thdu_a[16]);*(pinputRegisters_sub+204)=cal_thdu_a[17];*(pinputRegisters_sub+204)=((*(pinputRegisters_sub+204))<<8)|((int)cal_thdu_a[18]);*(pinputRegisters_sub+205)=cal_thdu_a[19];*(pinputRegisters_sub+205)=((*(pinputRegisters_sub+205))<<8)|((int)cal_thdu_a[21]);*(pinputRegisters_sub+206)=cal_thdu_a[23];*(pinputRegisters_sub+206)=((*(pinputRegisters_sub+206))<<8)|((int)cal_thdu_a[25]);*(pinputRegisters_sub+207)=cal_thdu_a[27];*(pinputRegisters_sub+207)=((*(pinputRegisters_sub+207))<<8)|((int)cal_thdu_a[29]);*(pinputRegisters_sub+208)=cal_thdu_a[31];*(pinputRegisters_sub+208)=((*(pinputRegisters_sub+208))<<8)|((int)cal_thdu_a[33]);*(pinputRegisters_sub+209)=cal_thdu_a[35];*(pinputRegisters_sub+209)=((*(pinputRegisters_sub+209))<<8)|((int)cal_thdu_a[37]);*(pinputRegisters_sub+210)=cal_thdu_a[39];*(pinputRegisters_sub+210)=((*(pinputRegisters_sub+210))<<8)|((int)cal_thdu_a[41]);*(pinputRegisters_sub+211)=cal_thdu_a[43];*(pinputRegisters_sub+211)=((*(pinputRegisters_sub+211))<<8)|((int)cal_thdu_a[45]);*(pinputRegisters_sub+212)=cal_thdu_a[47];*(pinputRegisters_sub+212)=((*(pinputRegisters_sub+212))<<8)|((int)cal_thdu_a[49]);//B相电压各次谐波含量*(pinputRegisters_sub+213)=cal_thdu_b[1];*(pinputRegisters_sub+213)=((*(pinputRegisters_sub+213))<<8)|((int)cal_thdu_b[2]);*(pinputRegisters_sub+214)=cal_thdu_b[3];*(pinputRegisters_sub+214)=((*(pinputRegisters_sub+214))<<8)|((int)cal_thdu_b[4]);*(pinputRegisters_sub+215)=cal_thdu_b[5];*(pinputRegisters_sub+215)=((*(pinputRegisters_sub+215))<<8)|((int)cal_thdu_b[6]);*(pinputRegisters_sub+216)=cal_thdu_b[7];*(pinputRegisters_sub+216)=((*(pinputRegisters_sub+216))<<8)|((int)cal_thdu_b[8]);*(pinputRegisters_sub+217)=cal_thdu_b[9];*(pinputRegisters_sub+217)=((*(pinputRegisters_sub+217))<<8)|((int)cal_thdu_b[10]);*(pinputRegisters_sub+218)=cal_thdu_b[11];*(pinputRegisters_sub+218)=((*(pinputRegisters_sub+218))<<8)|((int)cal_thdu_b[12]);*(pinputRegisters_sub+219)=cal_thdu_b[13];*(pinputRegisters_sub+219)=((*(pinputRegisters_sub+219))<<8)|((int)cal_thdu_b[14]);*(pinputRegisters_sub+220)=cal_thdu_b[15];*(pinputRegisters_sub+220)=((*(pinputRegisters_sub+220))<<8)|((int)cal_thdu_b[16]);*(pinputRegisters_sub+221)=cal_thdu_b[17];*(pinputRegisters_sub+221)=((*(pinputRegisters_sub+221))<<8)|((int)cal_thdu_b[18]);*(pinputRegisters_sub+222)=cal_thdu_b[19];*(pinputRegisters_sub+222)=((*(pinputRegisters_sub+222))<<8)|((int)cal_thdu_b[21]);*(pinputRegisters_sub+223)=cal_thdu_b[23];*(pinputRegisters_sub+223)=((*(pinputRegisters_sub+223))<<8)|((int)cal_thdu_b[25]);*(pinputRegisters_sub+224)=cal_thdu_b[27];*(pinputRegisters_sub+224)=((*(pinputRegisters_sub+224))<<8)|((int)cal_thdu_b[29]);*(pinputRegisters_sub+225)=cal_thdu_b[31];*(pinputRegisters_sub+225)=((*(pinputRegisters_sub+225))<<8)|((int)cal_thdu_b[33]);*(pinputRegisters_sub+226)=cal_thdu_b[35];*(pinputRegisters_sub+226)=((*(pinputRegisters_sub+226))<<8)|((int)cal_thdu_b[37]);*(pinputRegisters_sub+227)=cal_thdu_b[39];*(pinputRegisters_sub+227)=((*(pinputRegisters_sub+227))<<8)|((int)cal_thdu_b[41]);*(pinputRegisters_sub+228)=cal_thdu_b[43];*(pinputRegisters_sub+228)=((*(pinputRegisters_sub+228))<<8)|((int)cal_thdu_b[45]);*(pinputRegisters_sub+229)=cal_thdu_b[47];*(pinputRegisters_sub+229)=((*(pinputRegisters_sub+229))<<8)|((int)cal_thdu_b[49]);//C相电压各次谐波含量*(pinputRegisters_sub+230)=cal_thdi_cl[1];*(pinputRegisters_sub+230)=((*(pinputRegisters_sub+230))<<8)|((int)cal_thdi_cl[2]);*(pinputRegisters_sub+231)=cal_thdi_cl[3];*(pinputRegisters_sub+231)=((*(pinputRegisters_sub+231))<<8)|((int)cal_thdi_cl[4]);*(pinputRegisters_sub+232)=cal_thdi_cl[5];*(pinputRegisters_sub+232)=((*(pinputRegisters_sub+232))<<8)|((int)cal_thdi_cl[6]);*(pinputRegisters_sub+233)=cal_thdi_cl[7];*(pinputRegisters_sub+233)=((*(pinputRegisters_sub+233))<<8)|((int)cal_thdi_cl[8]);*(pinputRegisters_sub+234)=cal_thdi_cl[9];*(pinputRegisters_sub+234)=((*(pinputRegisters_sub+234))<<8)|((int)cal_thdi_cl[10]);*(pinputRegisters_sub+235)=cal_thdi_cl[11];*(pinputRegisters_sub+235)=((*(pinputRegisters_sub+235))<<8)|((int)cal_thdi_cl[12]);*(pinputRegisters_sub+236)=cal_thdi_cl[13];*(pinputRegisters_sub+236)=((*(pinputRegisters_sub+236))<<8)|((int)cal_thdi_cl[14]);*(pinputRegisters_sub+237)=cal_thdi_cl[15];*(pinputRegisters_sub+237)=((*(pinputRegisters_sub+237))<<8)|((int)cal_thdi_cl[16]);*(pinputRegisters_sub+238)=cal_thdi_cl[17];*(pinputRegisters_sub+238)=((*(pinputRegisters_sub+238))<<8)|((int)cal_thdi_cl[18]);*(pinputRegisters_sub+239)=cal_thdi_cl[19];*(pinputRegisters_sub+239)=((*(pinputRegisters_sub+239))<<8)|((int)cal_thdi_cl[21]);*(pinputRegisters_sub+240)=cal_thdi_cl[23];*(pinputRegisters_sub+240)=((*(pinputRegisters_sub+240))<<8)|((int)cal_thdi_cl[25]);*(pinputRegisters_sub+241)=cal_thdi_cl[27];*(pinputRegisters_sub+241)=((*(pinputRegisters_sub+241))<<8)|((int)cal_thdi_cl[29]);*(pinputRegisters_sub+242)=cal_thdi_cl[31];*(pinputRegisters_sub+242)=((*(pinputRegisters_sub+242))<<8)|((int)cal_thdi_cl[33]);*(pinputRegisters_sub+243)=cal_thdi_cl[35];*(pinputRegisters_sub+243)=((*(pinputRegisters_sub+243))<<8)|((int)cal_thdi_cl[37]);*(pinputRegisters_sub+244)=cal_thdi_cl[39];*(pinputRegisters_sub+244)=((*(pinputRegisters_sub+244))<<8)|((int)cal_thdi_cl[41]);*(pinputRegisters_sub+245)=cal_thdi_cl[43];*(pinputRegisters_sub+245)=((*(pinputRegisters_sub+245))<<8)|((int)cal_thdi_cl[45]);*(pinputRegisters_sub+246)=cal_thdi_cl[47];*(pinputRegisters_sub+246)=((*(pinputRegisters_sub+246))<<8)|((int)cal_thdi_cl[49]);// memset(public_struc_modbus.rdata,0,sizeof(public_struc_modbus.rdata)); //初始化寄存器并分配空间
}uint32_t floatToIEEE754_H(float value)
{// Use a union to interpret the float as a 32-bit integerunion {float f;uint32_t u;} converter;converter.f = value; // Assign the float value to the unionreturn converter.u>>16; // Return the 32-bit integer representation
}uint32_t floatToIEEE754_L(float value)
{// Use a union to interpret the float as a 32-bit integerunion {float f;uint32_t u;} converter;converter.f = value; // Assign the float value to the unionreturn converter.u; // Return the 32-bit integer representation
}//float ieee754ToFloat(uint32_t ieee)
//{
// // Extract the sign bit (1 bit)
// int sign = (ieee >> 31) & 1;
//
// // Extract the exponent (8 bits)
// int exponent = (ieee >> 23) & 0xFF;
//
// // Extract the mantissa (23 bits)
// uint32_t mantissa = ieee & 0x7FFFFF;
//
// // Handle special cases
// if (exponent == 255) {
// if (mantissa == 0) {
// return sign ? -INFINITY : INFINITY; // Infinity
// } else {
// return NAN; // Not a Number (NaN)
// }
// } else if (exponent == 0) {
// // Denormalized numbers (exponent = 0)
// float result = (mantissa / (float)(1 << 23)) * pow(2, -126);
// return sign ? -result : result;
// }
//
// // Normalized numbers
// float result = (1 + (mantissa / (float)(1 << 23))) * pow(2, exponent - 127);
// return sign ? -result : result;
//}
上面源程序中:定义了SCIC 控制字初始化函数,收发中断函数,CRC16校验函数,收发处理函数。数据传送接收赋值函数。
sys_XXX 等变量是接收数据(从上位机MODBUS Master下发下来的数据)
cal_XXX 等变量是发送数据(发送给上位机MODBUS Master的数据)
注:程序中IEEE754是用于处理32位浮点数的函数,如果有兴趣额可以放开自己试一下
3、如何在主函数中调用。
#include "PeripheralHeaderIncludes.h" //TI公司标准头文件
#include "DSP2833x_Project.h" //
#include "string.h" //用于清零数组
#include <EUCO_MODBUS.h> //包含MODBUS协议头文件
//##################################################################################//void main(void) //主函数入口
{
// Step 1. Initialize System Control:PLL, WatchDog, enable Peripheral Clocks;
// This example function is found in the DSP2833x_SysCtrl.c file.InitSysCtrl(); //系统控制初始化// This example function is found in the HVPM_Sensorless-DevInit_F2833x.c file.DeviceInit(); //设备初始化 30M 5倍频150M赫兹#ifdef FLASHmemcpy(&RamfuncsRunStart,&RamfuncsLoadStart,&RamfuncsLoadEnd-&RamfuncsLoadStart); //将执行代码从RAM中拷贝到FLASH中,下次上电后从FLASH加载程序并运行#endifInitFlash(); //初始化DSP片内闪存 (掉电再上电可运行)DELAY_US(5000); //延迟5ms完成程序装载, 函数包含在DSP2833x_usDelay.asm// Step 2. Initialize GPIO: This example function is found in the DSP2833x_Gpio.c file;
// and illustrates how to set the GPIO to it's default state.InitGpio(); //系统应用的GPIO口初始化 DSP2833x_Gpio.c// Step 3. Clear all interrupts and initialize PIE vector table: Disable CPU interruptsDINT; //清除所有中断初始化中断向量表: 禁止CPU全局中断// Initialize the PIE control registers to their default state.
// The default state is all PIE interrupts disabled and flags are cleared.
// This function is found in the DSP2833x_PieCtrl.c file.InitPieCtrl();
// 初始化PIE中断向量表,并使其指向中断服务子程序(ISR) 这个函数放在了DSP2833x_PieVect.c源文件里面.
// 中断服务子程序被放在了DSP280x_DefaultIsr.c源文件中
// Disable CPU interrupts and clear all CPU interrupt flags:IER = 0x0000; // 中断使能寄存器 禁止CPU中断和清除所有CPU中断标志IFR = 0x0000; // 中断标志寄存器 禁止CPU中断和清除所有CPU中断标志// Initialize the PIE vector table with pointers to the shell Interrupt Service Routines (ISR).
// This will populate the entire table, even if the interrupt is not used in this example. This is useful for debug purposes.
// The shell ISR routines are found in DSP2833x_DefaultIsr.c.
// This function is found in DSP2833x_PieVect.c.InitPieVectTable();
// PIE 向量表指针指向中断服务程(ISR)完成其初始化. 即使在程序里不需要使用中断功能,也要对 PIE 向量表进行初始化.这样做是为了避免PIE引起的错误.SCIC_Modbus_Init(); //P3 初始化SCICMODBUS控制寄存器及数据寄存器初始化 该函数在MODBUS.c中for(;;)//主循环开始
{DATA_TRANSFER_DSP_HMI(); // 用于循环接收发送 MODBUS 数据, 该函数在MODBUS.c中}
}
行了,先写到这里。 反正测试可以用,并且利用昆仑通态和显控科技的屏幕都还行。 以昆仑通态截屏为例:
输入寄存器:
保持寄存器
屏幕发下来给DSP的数据,看看,还能对上。