DSP28335 高速modbus代码实现
发布日期:2021-05-06 22:01:43 浏览次数:29 分类:精选文章

本文共 24334 字,大约阅读时间需要 81 分钟。

Modbus????????

????

  • ????????????????????while??????????
  • ???????????8????????????
  • ?????????CRC????????????
  • ???????????????????????????
  • ???modbus.h

    #ifndef MODBUS_H
    #define MODBUS_H
    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;
    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;
    typedef struct ModbusData ModbusData;
    struct ModbusData {
    Uint16 slaveAddress;
    Uint16 functionCode;
    Uint32 contentIdx;
    Uint32 numofregisters;
    Uint16 content[20];
    Uint16 size;
    Uint16 crc;
    };
    void KD_Modbus_Init(void);
    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;
    };
    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;
    };
    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;
    };
    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;
    };
    typedef struct ModbusSlaveStruc {
    ModbusState state;
    Uint16 rdata[30];
    Uint16 sdata[100];
    Uint16 recvlen;
    Uint16 sendlen;
    ModbusCoilsMap coils;
    ModbusInputsMap inputs;
    ModbusHoldingRegistersMap holdingRegisters;
    ModbusInputRegistersMap inputRegisters;
    } MBSLSTRU;
    #endif

    ???modbus.c

    /* Modbus???? */
    #include
    #include
    #include
    #include
    typedef struct ScicRecvMsgQueueStruc {
    Uint16 msgLen;
    Uint16 msgIdx;
    Uint16 *pMsgData;
    } ScicRecvMsgQueueStruc;
    __interrupt void scicTxFifoIsr(void) {
    if ((public_struc_modbus.sendlen & 0xFF) > bufferdepth) {
    Temp = bufferdepth;
    ScicRegs.SCIFFTX.bit.TXFFIL = 0;
    for (i = 0; i < Temp; i++) {
    ScicRegs.SCITXBUF = public_struc_modbus.sdata[i + bufferdepth * (public_struc_modbus.sendlen > 12)];
    }
    public_struc_modbus.sendlen = public_struc_modbus.sendlen - bufferdepth + 0x1000;
    } else {
    Temp = (public_struc_modbus.sendlen & 0xFF);
    if (Temp > 0) {
    ScicRegs.SCIFFTX.bit.TXFFIL = 0;
    for (i = 0; i < Temp; i++) {
    ScicRegs.SCITXBUF = public_struc_modbus.sdata[i + bufferdepth * (public_struc_modbus.sendlen > 12)];
    }
    public_struc_modbus.sendlen = 0;
    } else {
    if (public_struc_modbus.sendlen == 0) {
    ScicRegs.SCIFFTX.bit.TXFFIENA = 0;
    }
    }
    }
    ScicRegs.SCIFFTX.bit.TXFFINTCLR = 1;
    PieCtrlRegs.PIEACK.bit.ACK8 = 1;
    }
    __interrupt void scicRxFifoIsr(void) {
    if (ScicRegs.SCIFFRX.bit.RXFFIL != 1) {
    if (public_struc_modbus.rdata[1] == 0) {
    for (i = 1; i < 8; i++) {
    public_struc_modbus.rdata[i] = ScicRegs.SCIRXBUF.all;
    }
    }
    if ((public_struc_modbus.rdata[1] == 15) || (public_struc_modbus.rdata[1] == 16)) {
    if (public_struc_modbus.recvlen == 0) {
    public_struc_modbus.recvlen = public_struc_modbus.rdata[6] + 9 + 0x1000;
    ScicRegs.SCIFFRX.bit.RXFFIL = 8;
    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 {
    if ((public_struc_modbus.recvlen > 12) && (public_struc_modbus.recvlen & 0xFF) / 8 < (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;
    }
    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;
    }
    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)) {
    receieve_handler(&public_struc_modbus);
    public_struc_modbus.rdata[1] = 0;
    ScicRegs.SCIFFRX.bit.RXFFIL = 1;
    } else {
    receieve_handler(&public_struc_modbus);
    public_struc_modbus.rdata[1] = 0;
    ScicRegs.SCIFFRX.bit.RXFFIL = 1;
    }
    }
    } else {
    public_struc_modbus.rdata[0] = ScicRegs.SCIRXBUF.all;
    if (public_struc_modbus.rdata[0] == ModbusSlaveAddress) {
    ScicRegs.SCIFFRX.bit.RXFFIL = 7;
    } else {
    ScicRegs.SCIFFRX.bit.RXFFIL = 1;
    }
    }
    ScicRegs.SCIFFRX.bit.RXFFOVRCLR = 1;
    ScicRegs.SCIFFRX.bit.RXFFINTCLR = 1;
    PieCtrlRegs.PIEACK.bit.ACK8 = 1;
    }
    void KD_Modbus_Init(void) {
    InitScicGpio();
    InitSci();
    EALLOW;
    PieVectTable.SCIRXINTC = &scicRxFifoIsr;
    PieVectTable.SCITXINTC = &scicTxFifoIsr;
    EDIS;
    PieCtrlRegs.PIECTRL.bit.ENPIE = 1;
    PieCtrlRegs.PIEIER8.bit.INTx5 = 1;
    PieCtrlRegs.PIEIER8.bit.INTx6 = 1;
    IER |= M_INT8;
    public_struc_modbus.recvlen = 0;
    public_struc_modbus.sendlen = 0;
    Uint16 i, *pcoils_sub, *pinputs_sub, *pholdingRegisters_sub, *pinputRegisters_sub;
    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++) {
    if (i % 2 == 0) {
    *(pinputs_sub + i) = 1;
    } else {
    *(pinputs_sub + i) = 0;
    }
    }
    for (i = 0; i < sizeof(public_struc_modbus.inputRegisters); i++) {
    *(pholdingRegisters_sub + i) = i + 1;
    }
    for (i = 0; i < sizeof(public_struc_modbus.pinputRegisters); i++) {
    *(pinputRegisters_sub + i) = i + 1;
    }
    memset(public_struc_modbus.rdata, 0, sizeof(public_struc_modbus.rdata));
    }
    void receieve_handler(MBSLSTRU *pModbusSlave) {
    uint16 i, lentemp = public_struc_modbus.recvlen & 0xFF;
    ModbusData ptempdata;
    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];
    if (pModbusSlave->rdata[0] == ModbusSlaveAddress) {
    pModbusSlave->sdata[1] = pModbusSlave->rdata[1];
    if (CRC16(pModbusSlave->rdata, lentemp - 2) == pTempData.crc) {
    pTempData.contentIdx = (pModbusSlave->rdata[2] << 8) + pModbusSlave->rdata[3];
    pTempData.numofregisters = (pModbusSlave->rdata[4] << 8) + pModbusSlave->rdata[5];
    if ((pTempData.contentIdx + pTempData.numofregisters) > 40) {
    pModbusSlave->sdata[1] |= 0x80;
    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;
    } else {
    switch (pModbusSlave->rdata[1]) {
    case MB_FUNC_READ_COIL:
    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:
    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:
    pModbusSlave->sdata[2] = pTempData.numofregisters * 2;
    for (i = 0; i < pTempData.numofregisters; i++) {
    pModbusSlave->sdata[3 + i * 2 + 1] = *(pholdingRegisters_sub + i + pTempData.contentIdx);
    pModbusSlave->sdata[3 + i * 2 + 1] = (pModbusSlave->sdata[3 + i * 2 + 1] & 0xff);
    pModbusSlave->sdata[3 + i * 2] = *(pholdingRegisters_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_READ_INPUTREGISTERS:
    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:
    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:
    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:
    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:
    for (i = 0; i < pTempData.numofregisters; i++) {
    *(pholdingRegisters_sub + i + pTempData.contentIdx) = ((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 {
    pModbusSlave->sdata[1] |= 0x80;
    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;
    }
    }
    }
    Uint16 CRC16(Uint16 *nData, Uint16 wLength) {
    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, 0xCA61, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841,
    0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDB41, 0xDA81, 0x1A40,
    0x1E00, 0xDC01, 0xD481, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41,
    0xD400, 0xD4C1, 0xD581, 0xD541, 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, 0xAAC1, 0xAD81, 0x6D40, 0xAFA1, 0x6FC0, 0x6E80, 0xAE41,
    0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840,
    0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41,
    0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBD41, 0xBC81, 0x7C40,
    0xBA41, 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
    };
    Uint16 nTemp;
    Uint16 wCRCWord = 0xFFFF;
    while (wLength--) {
    nTemp = (*nData++ ^ wCRCWord) & 0xff;
    wCRCWord >>= 8;
    wCRCWord ^= wCRCTable[nTemp];
    }
    wCRCWord = (wCRCWord << 8) | (wCRCWord >> 8);
    return wCRCWord;
    }
    上一篇:matplotlib官方例程实验 一
    下一篇:28335 Mcbsp SPI DMA接收第一字节异常解决

    发表评论

    最新留言

    网站不错 人气很旺了 加油
    [***.192.178.218]2025年04月18日 09时55分59秒