diff --git a/Periphery.cpp b/Periphery.cpp index 80de701..71fa5ad 100644 --- a/Periphery.cpp +++ b/Periphery.cpp @@ -1,7 +1,7 @@ #include "Periphery.h" Periphery::Periphery() : - _cana(canSpace::CANA), + _cana(can_space::CANA), _digitalIO(), _zone6_ptr(reinterpret_cast(0x100000)), _scib(ScibRegs), @@ -27,22 +27,21 @@ void Periphery::config(){ _cana.config(); // Data Frame MBOX - _cana.configRxMBox(canSpace::MODBUS_SETTINGS_MBOX, canSpace::MsgID(0x0), canSpace::MsgCtrlReg(0x6)); // Modbus settings - _cana.configTxMBox(canSpace::MODBUS_DATA_COMM_TO_CPU_MBOX, canSpace::MsgID(0x29), canSpace::MsgCtrlReg(0x28)); // Send Modbus data to CPU - _cana.configRxMBox(canSpace::MODBUS_DATA_CPU_TO_COMM_MBOX, canSpace::MsgID(0x28), canSpace::MsgCtrlReg(0x8)); // Receive Modbus data from CPU - _cana.configTxMBox(canSpace::DIGITAL_INPUT_MBOX, canSpace::MsgID(0x30), canSpace::MsgCtrlReg(0x2)); // Receive DI - _cana.configRxMBox(canSpace::DIGITAL_OUTPUT_MBOX, canSpace::MsgID(0x31), canSpace::MsgCtrlReg(0x2)); // Send DO + _cana.configRxMBox(can_space::MODBUS_SETTINGS_MBOX, can_space::MsgID(0x0), can_space::MsgCtrlReg(0x6)); // Modbus settings + _cana.configTxMBox(can_space::MODBUS_DATA_COMM_TO_CPU_MBOX, can_space::MsgID(0x29), can_space::MsgCtrlReg(0x28)); // Send Modbus data to CPU + _cana.configRxMBox(can_space::MODBUS_DATA_CPU_TO_COMM_MBOX, can_space::MsgID(0x28), can_space::MsgCtrlReg(0x8)); // Receive Modbus data from CPU + _cana.configTxMBox(can_space::DIGITAL_INPUT_MBOX, can_space::MsgID(0x30), can_space::MsgCtrlReg(0x2)); // Send DI + _cana.configRxMBox(can_space::DIGITAL_OUTPUT_MBOX, can_space::MsgID(0x31), can_space::MsgCtrlReg(0x2)); // Receive DO // Remote frame MBOX - // _cana.configRxMBox(canSpace::MODBUS_SETTINGS_MBOX, canSpace::MsgID(0x0), canSpace::MsgCtrlReg(0x10)); - _cana.configTxMBox(canSpace::COMM_VERSION_MBOX, canSpace::MsgID(0x1, false, true), canSpace::MsgCtrlReg(0x4)); + _cana.configTxMBox(can_space::COMM_VERSION_MBOX, can_space::MsgID(0x1, false, true), can_space::MsgCtrlReg(0x4)); - _cana.enableTimeOutControl(canSpace::MODBUS_SETTINGS_MBOX); - _cana.setTimeOutValue(canSpace::MODBUS_SETTINGS_MBOX, 1000); + _cana.enableTimeOutControl(can_space::MODBUS_SETTINGS_MBOX); + _cana.setTimeOutValue(can_space::MODBUS_SETTINGS_MBOX, 1000); // Interrupts - _cana.configSystemIsr(canSpace::I0EN_ENABLE | - canSpace::EPIM_ENABLE | canSpace::WLIM_ENABLE | canSpace::AAIM_ENABLE); + _cana.configSystemIsr(can_space::I0EN_ENABLE | + can_space::EPIM_ENABLE | can_space::WLIM_ENABLE | can_space::AAIM_ENABLE); //--------------------------------------Init XINTF interface---------------------------------------------------------- @@ -76,39 +75,21 @@ void Periphery::config(){ Uint16 Periphery::getVersionFPGA(){ Uint16 data; data = *_zone6_ptr + interface::SOFT_VERSION_OFFSET; - return data; + return data & 0x3FF; // no more than 1023. (9.9.9) should be limit } void Periphery::updateVersionFPGA(){ - _softVersion.CPLD = getVersionFPGA() & 0x3FF; // no more than 1023. (9.9.9) should be limit + _softVersion.CPLD = getVersionFPGA(); _message.mdl.word.LOW_WORD = _softVersion.DSP; _message.mdl.word.HI_WORD = _softVersion.CPLD; - _cana.updateTXMessage(canSpace::COMM_VERSION_MBOX, _message); -} - - -void Periphery::initModbusTable(){ - modbusRTU.setInputRegsAddr(400); - modbusRTU.setOutputRegsAddr(400); - - modbusRTU.addInputReg(0, test_hmi_float_reg_400_test); - modbusRTU.addInputReg(1, test_hmi_float_reg_401_test); - modbusRTU.addInputReg(2, test_hmi_float_reg_402_test); - modbusRTU.addInputReg(3, test_hmi_float_reg_403_test); - modbusRTU.addInputReg(4, test_hmi_float_reg_404_test); - - modbusRTU.addOutputReg(0, test_hmi_float_reg_400_test); - modbusRTU.addOutputReg(1, test_hmi_float_reg_401_test); - modbusRTU.addOutputReg(2, test_hmi_float_reg_402_test); - modbusRTU.addOutputReg(3, test_hmi_float_reg_403_test); - modbusRTU.addOutputReg(4, test_hmi_float_reg_404_test); + _cana.updateTXMessage(can_space::COMM_VERSION_MBOX, _message); } void Periphery::receiveModbusParameters(){ - if (_cana.isNewMessage(canSpace::MODBUS_SETTINGS_MBOX)) { - _cana.receiveMsg(canSpace::MODBUS_SETTINGS_MBOX, _message); + if (_cana.isNewMessage(can_space::MODBUS_SETTINGS_MBOX)) { + _cana.receiveMsg(can_space::MODBUS_SETTINGS_MBOX, _message); MODBUSRTU::modbusConfiguration.node_id = _message.mdl.byte.BYTE0; MODBUSRTU::modbusConfiguration.config.lenght = static_cast(_message.mdl.byte.BYTE1); @@ -124,31 +105,31 @@ void Periphery::receiveModbusParameters(){ void Periphery::getModbusConfiguration(){ _cana.resetTimeStampCounter(); - _cana.clearTimeOutFlag(canSpace::MODBUS_SETTINGS_MBOX); + _cana.clearTimeOutFlag(can_space::MODBUS_SETTINGS_MBOX); bool requestIsSent = false; - while(!_cana.isNewMessage(canSpace::MODBUS_SETTINGS_MBOX)){ - if(_cana.isTimeOut(canSpace::MODBUS_SETTINGS_MBOX)){ + while(!_cana.isNewMessage(can_space::MODBUS_SETTINGS_MBOX)){ + if(_cana.isTimeOut(can_space::MODBUS_SETTINGS_MBOX)){ if (!requestIsSent) { _cana.resetTimeStampCounter(); - _cana.clearTimeOutFlag(canSpace::MODBUS_SETTINGS_MBOX); + _cana.clearTimeOutFlag(can_space::MODBUS_SETTINGS_MBOX); _message.mdl.word.LOW_WORD = _softVersion.DSP; _message.mdl.word.HI_WORD = _softVersion.CPLD; - _cana.transmitMsg(canSpace::COMM_VERSION_MBOX, _message); + _cana.transmitMsg(can_space::COMM_VERSION_MBOX, _message); requestIsSent = true; } else{ - _cana.clearTimeOutFlag(canSpace::MODBUS_SETTINGS_MBOX); - _cana.disableTimeOutControl(canSpace::MODBUS_SETTINGS_MBOX); + _cana.clearTimeOutFlag(can_space::MODBUS_SETTINGS_MBOX); + _cana.disableTimeOutControl(can_space::MODBUS_SETTINGS_MBOX); _error = true; return; } } } - _cana.receiveMsg(canSpace::MODBUS_SETTINGS_MBOX, _message); + _cana.receiveMsg(can_space::MODBUS_SETTINGS_MBOX, _message); MODBUSRTU::modbusConfiguration.node_id = _message.mdl.byte.BYTE0; MODBUSRTU::modbusConfiguration.config.lenght = static_cast(_message.mdl.byte.BYTE1); MODBUSRTU::modbusConfiguration.config.baudrate = static_cast(_message.mdl.word.LOW_WORD); @@ -163,13 +144,13 @@ void Periphery::getModbusConfiguration(){ void Periphery::processDigitalInput(){ Uint16 data = 0; _digitalIO.readDigitalIO(data); - _cana.transmitMsg(canSpace::DIGITAL_INPUT_MBOX, (data)); + _cana.transmitMsg(can_space::DIGITAL_INPUT_MBOX, data); } void Periphery::processDigitalOutput(){ - if(_cana.isNewMessage(canSpace::DIGITAL_OUTPUT_MBOX)){ - _cana.receiveMsg(canSpace::DIGITAL_OUTPUT_MBOX, _message); + if(_cana.isNewMessage(can_space::DIGITAL_OUTPUT_MBOX)){ + _cana.receiveMsg(can_space::DIGITAL_OUTPUT_MBOX, _message); Uint16 data = _message.mdl.word.LOW_WORD; _digitalIO.writeDigitalIO(data); } @@ -199,13 +180,13 @@ void Periphery::sendModbusDataToCPU(){ _modbusRegCounter++; } - _cana.transmitMsg(canSpace::MODBUS_DATA_COMM_TO_CPU_MBOX, _message); + _cana.transmitMsg(can_space::MODBUS_DATA_COMM_TO_CPU_MBOX, _message); } void Periphery::receiveCpuModbusData(){ - if (_cana.isNewMessage(canSpace::MODBUS_DATA_CPU_TO_COMM_MBOX)) { - _cana.receiveMsg(canSpace::MODBUS_DATA_CPU_TO_COMM_MBOX, _message); + if (_cana.isNewMessage(can_space::MODBUS_DATA_CPU_TO_COMM_MBOX)) { + _cana.receiveMsg(can_space::MODBUS_DATA_CPU_TO_COMM_MBOX, _message); WEINBUS::WeinbusTableRegister reg; diff --git a/Periphery.h b/Periphery.h index 0b75f31..240fcbc 100644 --- a/Periphery.h +++ b/Periphery.h @@ -29,7 +29,6 @@ public: void receiveModbusParameters(); void getModbusConfiguration(); - void initModbusTable(); // TODO Must be outside periphery! void processDigitalInput(); void processDigitalOutput(); @@ -38,14 +37,14 @@ public: void receiveCpuModbusData(); private: - canSpace::CAN _cana; + can_space::CAN _cana; interface::DigitalIO _digitalIO; Uint16* _zone6_ptr; DSP28335::SCIB _scib; SoftwareVersion _softVersion; - canSpace::CANMessage _message; + can_space::CANMessage _message; bool _modbusInitFlag; bool _error; uint16_t _modbusRegCounter; diff --git a/Protocol/CAN.cpp b/Protocol/CAN.cpp index 7c68c06..154671e 100644 --- a/Protocol/CAN.cpp +++ b/Protocol/CAN.cpp @@ -1,10 +1,8 @@ #include "CAN.h" -#include "DSP2833x_Device.h" -#include "DSP2833x_ECan.h" -namespace canSpace { +namespace can_space { -void CAN::transmitMsg(Uint16 boxNumber, const CANMessage& message){ +void CAN::transmitMsg(Uint16 boxNumber, const CANMessage& message, bool writeDataLength){ if (boxNumber > 31) return; Uint32 mboxControl(0); @@ -16,7 +14,7 @@ void CAN::transmitMsg(Uint16 boxNumber, const CANMessage& message){ p_MailBox->MDH.all = 0x0; p_MailBox->MDL.all = 0x0; - // p_MailBox->MSGCTRL.bit.DLC = message.dataLength; + if (writeDataLength) p_MailBox->MSGCTRL.bit.DLC = message.dataLength; p_MailBox->MDH.all = message.mdh.all; p_MailBox->MDL.all = message.mdl.all; @@ -36,7 +34,7 @@ void CAN::transmitMsg(Uint16 boxNumber, const CANMessage& message){ } -void CAN::transmitMsg(Uint16 boxNumber, const Uint64& message){ +void CAN::transmitMsg(Uint16 boxNumber, const Uint64& message, const Uint16 dlc){ if (boxNumber > 31) return; Uint32 mboxControl(0); @@ -47,7 +45,8 @@ void CAN::transmitMsg(Uint16 boxNumber, const Uint64& message){ p_MailBox->MDH.all = 0x0; p_MailBox->MDL.all = 0x0; - + + p_MailBox->MSGCTRL.bit.DLC = dlc; p_MailBox->MDH.all = message >> 32; p_MailBox->MDL.all = message; @@ -67,7 +66,7 @@ void CAN::transmitMsg(Uint16 boxNumber, const Uint64& message){ } -void CAN::transmitMsg(Uint16 boxNumber, const Uint64& message, const Uint16 dlc){ +void CAN::transmitMsg(Uint16 boxNumber, const Uint64& message){ if (boxNumber > 31) return; Uint32 mboxControl(0); @@ -78,8 +77,7 @@ void CAN::transmitMsg(Uint16 boxNumber, const Uint64& message, const Uint16 dlc) p_MailBox->MDH.all = 0x0; p_MailBox->MDL.all = 0x0; - - p_MailBox->MSGCTRL.bit.DLC = dlc; + p_MailBox->MDH.all = message >> 32; p_MailBox->MDL.all = message; @@ -111,7 +109,7 @@ void CAN::updateTXMessage(Uint16 boxNumber, const CANMessage& message){ // TODO // Set change data request (CDR bit + MBOX number) p_CanRegs_->CANMC.all |= (128 + boxNumber); - // TODO Add lenght changing? + p_MailBox->MSGCTRL.bit.DLC = message.dataLength; p_MailBox->MDL.all = message.mdl.all; p_MailBox->MDH.all = message.mdh.all; @@ -121,28 +119,6 @@ void CAN::updateTXMessage(Uint16 boxNumber, const CANMessage& message){ // TODO } -void CAN::updateTXMessage(Uint16 boxNumber, const Uint64& message){ // TODO check trs bit and set it at the end if it was here. Once the TRS bit is set for a mailbox and then data is changed in the mailbox using the CDR - // bit, the CAN module fails to transmit the new data and transmits the old data instead. To avoid this, - // reset transmission in that mailbox using the TRRn bit and set the TRSn bit again. The new data is - // then transmitted. - if (boxNumber > 31) return; - - volatile MBOX* p_MailBox(0); - p_MailBox = &(p_CanMBoxes_->MBOX0) + boxNumber; - - // Set change data request (CDR bit + MBOX number) - p_CanRegs_->CANMC.all |= (128 + boxNumber); - - // TODO Add lenght changing? - p_MailBox->MDL.all = message; - p_MailBox->MDH.all = message >> 32; - - CanShadow_.CANMC.all = p_CanRegs_->CANMC.all; - CanShadow_.CANMC.bit.CDR = 0; - p_CanRegs_->CANMC.all = CanShadow_.CANMC.all; -} - - void CAN::sendRemoteRequest(Uint16 boxNumber){ if (boxNumber > 31) return; @@ -171,7 +147,7 @@ void CAN::sendRemoteRequest(Uint16 boxNumber){ } -int16 CAN::receiveMsg(Uint16 boxNumber, CANMessage& rxMessage){ // TODO faults just return -1 +int16 CAN::receiveMsg(Uint16 boxNumber, CANMessage& rxMessage){ if (boxNumber > 31) { return -1; } Uint32 mboxControl(0); @@ -203,38 +179,6 @@ int16 CAN::receiveMsg(Uint16 boxNumber, CANMessage& rxMessage){ // TODO faults j } -int16 CAN::receiveMsg(Uint16 boxNumber, Uint64& rxMessage){ // TODO faults just return -1 - if (boxNumber > 31) { return -1; } - - Uint32 mboxControl(0); - mboxControl = 1ul << boxNumber; - - volatile MBOX* p_MailBox(0); - p_MailBox = &(p_CanMBoxes_->MBOX0) + boxNumber; - - bool isNewMessageInBox = p_CanRegs_->CANRMP.all & mboxControl; - if(!isNewMessageInBox) return -2; - - p_CanRegs_->CANRMP.all &= mboxControl; - - rxMessage = p_MailBox->MDH.all; - rxMessage = rxMessage << 32; - rxMessage = p_MailBox->MDL.all; - - bool newMessage; - bool lostMessage; - - newMessage = p_CanRegs_->CANRMP.all & mboxControl; - lostMessage = p_CanRegs_->CANRML.all & mboxControl; - - if(newMessage || lostMessage) { - return -3; - } - - return 0; -} - - bool CAN::isNewMessage(){ return static_cast(p_CanRegs_->CANRMP.all); } @@ -282,4 +226,4 @@ void CAN::clearTimeOutFlag(Uint16 boxNumber){ } -} // canSpace +} // can_space diff --git a/Protocol/CAN.h b/Protocol/CAN.h index 9d50408..49e0f1c 100644 --- a/Protocol/CAN.h +++ b/Protocol/CAN.h @@ -3,7 +3,7 @@ #include "F28335/DSP28x_Project.h" #include "F28335/DSP2833x_Device.h" -namespace canSpace { +namespace can_space { enum CAN_VARIANT{ CANA, @@ -113,14 +113,12 @@ public: bool isNewMessage(); bool isNewMessage(Uint16 boxNumber); - void transmitMsg(Uint16 boxNumber, const CANMessage& message); - void transmitMsg(Uint16 boxNumber, const Uint64& message); + void transmitMsg(Uint16 boxNumber, const CANMessage& message, bool writeDataLength = false); void transmitMsg(Uint16 boxNumber, const Uint64& message, const Uint16 dlc); + void transmitMsg(Uint16 boxNumber, const Uint64& message); void updateTXMessage(Uint16 boxNumber, const CANMessage& message); - void updateTXMessage(Uint16 boxNumber, const Uint64& message); void sendRemoteRequest(Uint16 boxNumber); int16 receiveMsg(Uint16 boxNumber, CANMessage& rxMessage); - int16 receiveMsg(Uint16 boxNumber, Uint64& rxMessage); void enableTimeOutControl(Uint16 boxNumber); void disableTimeOutControl(Uint16 boxNumber); @@ -139,4 +137,4 @@ private: }; -} // canSpace +} // can_space diff --git a/Protocol/CANConfig.cpp b/Protocol/CANConfig.cpp index 868f7c1..c1799ca 100644 --- a/Protocol/CANConfig.cpp +++ b/Protocol/CANConfig.cpp @@ -1,7 +1,7 @@ #include "CAN.h" #include "DSP2833x_ECan.h" -namespace canSpace { +namespace can_space { CAN::CAN(CAN_VARIANT canVariant) : canPort(canVariant), @@ -315,4 +315,4 @@ void CAN::disableTimeOutControl(Uint16 boxNumber){ } -} //canSpace +} //can_space diff --git a/Protocol/CAN_data.h b/Protocol/CAN_data.h index 932763a..f021a10 100644 --- a/Protocol/CAN_data.h +++ b/Protocol/CAN_data.h @@ -1,6 +1,6 @@ #pragma once -namespace canSpace { +namespace can_space { enum MBOX_NUMBERS { MODBUS_SETTINGS_MBOX = 0, diff --git a/System/ModbusTable.cpp b/System/ModbusTable.cpp index 9e2cd05..282cf6a 100644 --- a/System/ModbusTable.cpp +++ b/System/ModbusTable.cpp @@ -6,7 +6,6 @@ namespace SYSCTRL { void initModbusTable(Periphery& periphery){ periphery.modbusRTU.setInputRegsAddr(400); - periphery.modbusRTU.setOutputRegsAddr(400); periphery.modbusRTU.addInputReg(0, test_float_reg); periphery.modbusRTU.addInputReg(1, test_int16_reg); @@ -14,6 +13,9 @@ void initModbusTable(Periphery& periphery){ periphery.modbusRTU.addInputReg(3, test_int32_reg); periphery.modbusRTU.addInputReg(4, test_uint32_reg); + + periphery.modbusRTU.setOutputRegsAddr(400); + periphery.modbusRTU.addOutputReg(0, test_float_reg); periphery.modbusRTU.addOutputReg(1, test_int16_reg); periphery.modbusRTU.addOutputReg(2, test_uint16_reg); diff --git a/main.cpp b/main.cpp index ef0766a..ea49828 100644 --- a/main.cpp +++ b/main.cpp @@ -103,10 +103,7 @@ void idle_loop() infCounter++; periphery.receiveModbusParameters(); - - // - // MODBUS RTU HMI Service - // + periphery.modbusRTU.execute(); periphery.receiveCpuModbusData();