Add memory map for XINTF. Change zone0 to zone6

feature/CAN_timeOut
Oleg 1 month ago
parent a450de810f
commit 61b34218ff

@ -80,14 +80,14 @@ InitXintf(void)
// //
XintfRegs.XTIMING0.bit.XWRLEAD = 3; XintfRegs.XTIMING0.bit.XWRLEAD = 3;
XintfRegs.XTIMING0.bit.XWRACTIVE = 5; XintfRegs.XTIMING0.bit.XWRACTIVE = 5;
XintfRegs.XTIMING0.bit.XWRTRAIL = 3; XintfRegs.XTIMING0.bit.XWRTRAIL = 1;
// //
// Zone read timing // Zone read timing
// //
XintfRegs.XTIMING0.bit.XRDLEAD = 3; XintfRegs.XTIMING0.bit.XRDLEAD = 3;
XintfRegs.XTIMING0.bit.XRDACTIVE = 5; XintfRegs.XTIMING0.bit.XRDACTIVE = 5;
XintfRegs.XTIMING0.bit.XRDTRAIL = 3; XintfRegs.XTIMING0.bit.XRDTRAIL = 1;
// //
// double all Zone read/write lead/active/trail timing // double all Zone read/write lead/active/trail timing
@ -97,8 +97,8 @@ InitXintf(void)
// //
// Zone will sample XREADY signal // Zone will sample XREADY signal
// //
XintfRegs.XTIMING0.bit.USEREADY = 0; XintfRegs.XTIMING0.bit.USEREADY = 1;
XintfRegs.XTIMING0.bit.READYMODE = 0; // sample asynchronous XintfRegs.XTIMING0.bit.READYMODE = 1; // sample asynchronous
// //
// Size must be either: // Size must be either:
@ -114,15 +114,15 @@ InitXintf(void)
// Zone write timing // Zone write timing
// //
XintfRegs.XTIMING6.bit.XWRLEAD = 3; XintfRegs.XTIMING6.bit.XWRLEAD = 3;
XintfRegs.XTIMING6.bit.XWRACTIVE = 7; XintfRegs.XTIMING6.bit.XWRACTIVE = 5;
XintfRegs.XTIMING6.bit.XWRTRAIL = 3; XintfRegs.XTIMING6.bit.XWRTRAIL = 1;
// //
// Zone read timing // Zone read timing
// //
XintfRegs.XTIMING6.bit.XRDLEAD = 3; XintfRegs.XTIMING6.bit.XRDLEAD = 3;
XintfRegs.XTIMING6.bit.XRDACTIVE = 7; XintfRegs.XTIMING6.bit.XRDACTIVE = 5;
XintfRegs.XTIMING6.bit.XRDTRAIL = 3; XintfRegs.XTIMING6.bit.XRDTRAIL = 1;
// //
// double all Zone read/write lead/active/trail timing // double all Zone read/write lead/active/trail timing
@ -132,8 +132,8 @@ InitXintf(void)
// //
// Zone will sample XREADY signal // Zone will sample XREADY signal
// //
XintfRegs.XTIMING6.bit.USEREADY = 1; XintfRegs.XTIMING6.bit.USEREADY = 0;
XintfRegs.XTIMING6.bit.READYMODE = 1; // sample asynchronous XintfRegs.XTIMING6.bit.READYMODE = 0; // sample asynchronous
// //
// Size must be either: // Size must be either:

@ -3,16 +3,17 @@
#include "Protocol/CAN.h" #include "Protocol/CAN.h"
#include "Protocol/CAN_data.h" #include "Protocol/CAN_data.h"
#include "Protocol/DigitalIO.h" #include "Protocol/DigitalIO.h"
#include "Protocol/MemoryMap.h"
#include "Periphery.h" #include "Periphery.h"
Periphery::Periphery(): Periphery::Periphery() :
_canb(canSpace::CANB), _canb(canSpace::CANA),
_digitalIO(), _digitalIO(),
_zone0_ptr(reinterpret_cast<Uint16*>(0x4000)), _zone6_ptr(reinterpret_cast<Uint16*>(0x100000)),
_modbusSettingsMsg(), _modbusSettingsMsg(),
_modbusInit(false) _modbusInit(false)
{ {
_softVersion.DSP = 101; _softVersion.DSP = 202;
_softVersion.CPLD = 0; _softVersion.CPLD = 0;
} }
@ -43,43 +44,39 @@ void Periphery::config(){
//---------------------------------------Init DIO interface---------------------------------------------------------- //---------------------------------------Init DIO interface----------------------------------------------------------
_digitalIO.setup(_zone0_ptr); _digitalIO.setup(_zone6_ptr);
_digitalIO.setMemoryOffset(1); _digitalIO.setMemoryOffset(interface::DISCRETE_DATA_OFFSET);
} }
Uint16 Periphery::getVersionFPGA(){ Uint16 Periphery::getVersionFPGA(){
Uint16 data; Uint16 data;
data = *_zone0_ptr; data = *_zone6_ptr + interface::SOFT_VERSION_OFFSET;
return data; return data;
} }
void Periphery::updateVersionFPGA(){ void Periphery::updateVersionFPGA(){
_softVersion.CPLD = getVersionFPGA() & 0x3FF; // no more than 1023 (9.9.9) should be limit _softVersion.CPLD = getVersionFPGA() & 0x3FF; // no more than 1023 (9.9.9) should be limit
canSpace::CANMessage data; _message.mdl.word.LOW_WORD = _softVersion.DSP;
data.mdl.word.LOW_WORD = _softVersion.DSP; _message.mdl.word.HI_WORD = _softVersion.CPLD;
data.mdl.word.HI_WORD = _softVersion.CPLD; _canb.updateTXMessage(canSpace::COMM_VERSION_MBOX, _message);
_canb.updateTXMessage(canSpace::COMM_VERSION_MBOX, data);
} }
void Periphery::processDigitalInput(){ void Periphery::processDigitalInput(){
Uint16 data = 0; Uint16 data = 0;
// _digitalIO.readDigitalIO(data); _digitalIO.readDigitalIO(data);
data = 0x1234; _canb.transmitMsg(canSpace::DIGITAL_INPUT_MBOX, (data));
_canb.transmitMsg(canSpace::DIGITAL_INPUT_MBOX, (data & 0x3FF)); // TODO check! может быть лишнее затирание битов?
} }
void Periphery::processDigitalOutput(){ void Periphery::processDigitalOutput(){
if(_canb.isNewMessage(canSpace::DIGITAL_OUTPUT_MBOX)){ if(_canb.isNewMessage(canSpace::DIGITAL_OUTPUT_MBOX)){
canSpace::CANMessage data; _canb.receiveMsg(canSpace::DIGITAL_OUTPUT_MBOX, _message);
_canb.receiveMsg(canSpace::DIGITAL_OUTPUT_MBOX, data); Uint16 data = _message.mdl.word.LOW_WORD;
Uint16 temp; _digitalIO.writeDigitalIO(data);
temp = data.mdl.all;
// _digitalIO.writeDigitalIO(temp);
} }
} }
@ -87,6 +84,6 @@ void Periphery::processDigitalOutput(){
void Periphery::initExternalModbus(){ void Periphery::initExternalModbus(){
if (!_modbusInit && (_canb.isNewMessage(canSpace::MODBUS_SETTINGS_MBOX))) { if (!_modbusInit && (_canb.isNewMessage(canSpace::MODBUS_SETTINGS_MBOX))) {
_canb.receiveMsg(canSpace::MODBUS_SETTINGS_MBOX, _modbusSettingsMsg); _canb.receiveMsg(canSpace::MODBUS_SETTINGS_MBOX, _modbusSettingsMsg);
_modbusInit = true; _modbusInit = true; // TODO modbus init function must be here
} }
} }

@ -5,6 +5,7 @@
#include "Protocol/CAN.h" #include "Protocol/CAN.h"
#include "Protocol/CAN_data.h" #include "Protocol/CAN_data.h"
#include "Protocol/DigitalIO.h" #include "Protocol/DigitalIO.h"
#include "Protocol/MemoryMap.h"
struct SoftwareVersion{ struct SoftwareVersion{
@ -27,9 +28,13 @@ public:
private: private:
canSpace::CAN _canb; canSpace::CAN _canb;
interface::DigitalIO _digitalIO; interface::DigitalIO _digitalIO;
Uint16* _zone0_ptr; Uint16* _zone6_ptr;
SoftwareVersion _softVersion; SoftwareVersion _softVersion;
canSpace::CANMessage _modbusSettingsMsg; canSpace::CANMessage _modbusSettingsMsg;
canSpace::CANMessage _message;
bool _modbusInit; bool _modbusInit;
Uint16 tempIn;
Uint16 tempOut;
}; };

@ -18,12 +18,24 @@ void DigitalIO::setMemoryOffset(Uint16 offset){
void DigitalIO::readDigitalIO(Uint16& data){ void DigitalIO::readDigitalIO(Uint16& data){
asm(" NOP");
asm(" NOP");
asm(" NOP");
data = *m_pointer; data = *m_pointer;
asm(" NOP");
asm(" NOP");
asm(" NOP");
} }
void DigitalIO::writeDigitalIO(Uint16& data) const{ void DigitalIO::writeDigitalIO(Uint16& data) const{
asm(" NOP");
asm(" NOP");
asm(" NOP");
*m_pointer = data; *m_pointer = data;
asm(" NOP");
asm(" NOP");
asm(" NOP");
} }
} // interface } // interface

@ -0,0 +1,11 @@
#pragma once
namespace interface {
enum MemoryOffset {
SOFT_VERSION_OFFSET = static_cast<Uint16>(0x0),
DISCRETE_DATA_OFFSET = static_cast<Uint16>(0xA),
PROFIBUS_OFFSET = static_cast<Uint16>(0x14)
};
}

@ -36,7 +36,6 @@ volatile bool sendRemote = false;
Uint16 modbusInit = 0; Uint16 modbusInit = 0;
int32 testVar = 0; int32 testVar = 0;
void main() void main()
{ {
ServiceDog(); ServiceDog();

Loading…
Cancel
Save