First test
1. Add an arbitrator class to control all necessary periphery main2.cpp represents it usage. main.cpp without periphery class. 2. Add XINTF init and DigitalIO interface 3. Change DI/O MBOX length to 2 bytes instead of 3feature/CAN_timeOut
parent
c692668f7b
commit
d864977511
@ -0,0 +1,92 @@
|
||||
#include "DSP2833x_Device.h"
|
||||
#include "DSP28x_Project.h"
|
||||
#include "Protocol/CAN.h"
|
||||
#include "Protocol/CAN_data.h"
|
||||
#include "Protocol/DigitalIO.h"
|
||||
#include "Periphery.h"
|
||||
|
||||
Periphery::Periphery():
|
||||
_canb(canSpace::CANB),
|
||||
_digitalIO(),
|
||||
_zone0_ptr(reinterpret_cast<Uint16*>(0x4000)),
|
||||
_modbusSettingsMsg(),
|
||||
_modbusInit(false)
|
||||
{
|
||||
_softVersion.DSP = 101;
|
||||
_softVersion.CPLD = 0;
|
||||
}
|
||||
|
||||
|
||||
void Periphery::config(){
|
||||
|
||||
//--------------------------------------Init CAN interface----------------------------------------------------------
|
||||
_canb.initGpio();
|
||||
_canb.config();
|
||||
|
||||
// Data Frame MBOX
|
||||
_canb.configRxMBox(canSpace::MODBUS_SETTINGS_MBOX, canSpace::MsgID(0x0), canSpace::MsgCtrlReg(0x6)); // Modbus settings
|
||||
// _canb.configTxMBox(canSpace::MODBUS_DATA_COMM_TO_CPU_MBOX, canSpace::MsgID(0x29), canSpace::MsgCtrlReg(0x26)); // Send Modbus data to CPU
|
||||
// _canb.configRxMBox(canSpace::MODBUS_DATA_CPU_TO_COMM_MBOX, canSpace::MsgID(0x28), canSpace::MsgCtrlReg(0x6)); // Receive Modbus data from CPU
|
||||
_canb.configTxMBox(canSpace::DIGITAL_INPUT_MBOX, canSpace::MsgID(0x30), canSpace::MsgCtrlReg(0x2)); // Receive DI
|
||||
_canb.configRxMBox(canSpace::DIGITAL_OUTPUT_MBOX, canSpace::MsgID(0x31), canSpace::MsgCtrlReg(0x2)); // Send DO
|
||||
|
||||
// Remote frame MBOX
|
||||
_canb.configTxMBox(canSpace::COMM_VERSION_MBOX, canSpace::MsgID(0x1, false, true), canSpace::MsgCtrlReg(0));
|
||||
|
||||
// Interrupts
|
||||
_canb.configSystemIsr(canSpace::I0EN_ENABLE |
|
||||
canSpace::EPIM_ENABLE | canSpace::WLIM_ENABLE | canSpace::AAIM_ENABLE);
|
||||
|
||||
|
||||
//--------------------------------------Init XINTF interface----------------------------------------------------------
|
||||
InitXintf();
|
||||
|
||||
|
||||
//---------------------------------------Init DIO interface----------------------------------------------------------
|
||||
_digitalIO.setup(_zone0_ptr);
|
||||
_digitalIO.setMemoryOffset(1);
|
||||
|
||||
}
|
||||
|
||||
|
||||
Uint16 Periphery::getVersionFPGA(){
|
||||
Uint16 data;
|
||||
data = *_zone0_ptr;
|
||||
return data;
|
||||
}
|
||||
|
||||
|
||||
void Periphery::updateVersionFPGA(){
|
||||
_softVersion.CPLD = getVersionFPGA() & 0x3FF; // no more than 1023 (9.9.9) should be limit
|
||||
canSpace::CANMessage data;
|
||||
data.mdl.word.LOW_WORD = _softVersion.DSP;
|
||||
data.mdl.word.HI_WORD = _softVersion.CPLD;
|
||||
_canb.updateTXMessage(canSpace::COMM_VERSION_MBOX, data);
|
||||
}
|
||||
|
||||
|
||||
void Periphery::processDigitalInput(){
|
||||
Uint16 data = 0;
|
||||
// _digitalIO.readDigitalIO(data);
|
||||
data = 0x1234;
|
||||
_canb.transmitMsg(canSpace::DIGITAL_INPUT_MBOX, (data & 0x3FF)); // TODO check! может быть лишнее затирание битов?
|
||||
}
|
||||
|
||||
|
||||
void Periphery::processDigitalOutput(){
|
||||
if(_canb.isNewMessage(canSpace::DIGITAL_OUTPUT_MBOX)){
|
||||
canSpace::CANMessage data;
|
||||
_canb.receiveMsg(canSpace::DIGITAL_OUTPUT_MBOX, data);
|
||||
Uint16 temp;
|
||||
temp = data.mdl.all;
|
||||
// _digitalIO.writeDigitalIO(temp);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Periphery::initExternalModbus(){
|
||||
if (!_modbusInit && (_canb.isNewMessage(canSpace::MODBUS_SETTINGS_MBOX))) {
|
||||
_canb.receiveMsg(canSpace::MODBUS_SETTINGS_MBOX, _modbusSettingsMsg);
|
||||
_modbusInit = true;
|
||||
}
|
||||
}
|
@ -0,0 +1,35 @@
|
||||
#pragma once
|
||||
|
||||
#include "DSP28x_Project.h"
|
||||
#include "DSP2833x_Device.h"
|
||||
#include "Protocol/CAN.h"
|
||||
#include "Protocol/CAN_data.h"
|
||||
#include "Protocol/DigitalIO.h"
|
||||
|
||||
|
||||
struct SoftwareVersion{
|
||||
Uint16 DSP;
|
||||
Uint16 CPLD;
|
||||
};
|
||||
|
||||
class Periphery{
|
||||
public:
|
||||
Periphery();
|
||||
void config();
|
||||
Uint16 getVersionFPGA();
|
||||
void updateVersionFPGA();
|
||||
void processDigitalInput();
|
||||
void processDigitalOutput();
|
||||
void initExternalModbus();
|
||||
void processExternalModbus(); // TODO
|
||||
void processCPUModbus(); // TODO
|
||||
|
||||
private:
|
||||
canSpace::CAN _canb;
|
||||
interface::DigitalIO _digitalIO;
|
||||
Uint16* _zone0_ptr;
|
||||
|
||||
SoftwareVersion _softVersion;
|
||||
canSpace::CANMessage _modbusSettingsMsg;
|
||||
bool _modbusInit;
|
||||
};
|
@ -0,0 +1,29 @@
|
||||
#include "DigitalIO.h"
|
||||
|
||||
namespace interface{
|
||||
|
||||
DigitalIO::DigitalIO():
|
||||
m_pointer(0)
|
||||
{}
|
||||
|
||||
|
||||
void DigitalIO::setup(Uint16 *memzone){
|
||||
m_pointer = memzone;// + OFFSET_DATA_DISCRETE_IO;
|
||||
}
|
||||
|
||||
|
||||
void DigitalIO::setMemoryOffset(Uint16 offset){
|
||||
m_pointer += offset;
|
||||
}
|
||||
|
||||
|
||||
void DigitalIO::readDigitalIO(Uint16& data){
|
||||
data = *m_pointer;
|
||||
}
|
||||
|
||||
|
||||
void DigitalIO::writeDigitalIO(Uint16& data) const{
|
||||
*m_pointer = data;
|
||||
}
|
||||
|
||||
} // interface
|
@ -0,0 +1,63 @@
|
||||
#pragma once
|
||||
|
||||
#include "DSP28x_Project.h"
|
||||
|
||||
namespace interface
|
||||
{
|
||||
|
||||
struct DigitalIODataBitField
|
||||
{
|
||||
Uint16 b00: 1;
|
||||
Uint16 b01: 1;
|
||||
Uint16 b02: 1;
|
||||
Uint16 b03: 1;
|
||||
Uint16 b04: 1;
|
||||
Uint16 b05: 1;
|
||||
Uint16 b06: 1;
|
||||
Uint16 b07: 1;
|
||||
Uint16 b08: 1;
|
||||
Uint16 b09: 1;
|
||||
Uint16 b10: 1;
|
||||
Uint16 b11: 1;
|
||||
Uint16 b12: 1;
|
||||
Uint16 b13: 1;
|
||||
Uint16 b14: 1;
|
||||
Uint16 b15: 1;
|
||||
};
|
||||
|
||||
|
||||
union DigitalIODataRegister
|
||||
{
|
||||
Uint16 all;
|
||||
DigitalIODataBitField bit;
|
||||
DigitalIODataRegister():
|
||||
all(0)
|
||||
{}
|
||||
};
|
||||
|
||||
|
||||
struct DigitalIOData
|
||||
{
|
||||
DigitalIODataRegister input;
|
||||
DigitalIODataRegister output;
|
||||
DigitalIOData():
|
||||
input(),
|
||||
output()
|
||||
{}
|
||||
};
|
||||
|
||||
|
||||
class DigitalIO {
|
||||
public:
|
||||
DigitalIO();
|
||||
void setup(Uint16 *memzone);
|
||||
void setMemoryOffset(Uint16 offset);
|
||||
|
||||
void readDigitalIO(Uint16& data);
|
||||
void writeDigitalIO(Uint16& data) const;
|
||||
|
||||
private:
|
||||
Uint16 *m_pointer;
|
||||
};
|
||||
|
||||
} // interface
|
@ -0,0 +1,167 @@
|
||||
// Some comments about author
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "DSP2833x_Device.h"
|
||||
#include "DSP28x_Project.h" // Device Headerfile and Examples Include File
|
||||
#include "DSP2833x_Examples.h"
|
||||
#include "Protocol/CAN.h"
|
||||
#include "Protocol/CAN_data.h"
|
||||
#include "Protocol/DigitalIO.h"
|
||||
#include "Periphery.h"
|
||||
|
||||
|
||||
//Functions declarations
|
||||
void idle_loop(void);
|
||||
|
||||
interrupt void cpu_timer0_isr(void);
|
||||
interrupt void cpu_timer1_isr(void);
|
||||
interrupt void canb_isr(void);
|
||||
interrupt void canb_box_isr(void);
|
||||
|
||||
Periphery periphery;
|
||||
|
||||
volatile Uint16 infCounter = 0;
|
||||
volatile Uint16 canISRcounter = 0;
|
||||
volatile Uint16 canBoxISRcounter = 0;
|
||||
volatile Uint16 testCounter = 0;
|
||||
|
||||
volatile bool init = true;
|
||||
volatile bool startTX = false;
|
||||
volatile bool update = false;
|
||||
volatile bool sendRemote = false;
|
||||
|
||||
Uint16 modbusInit = 0;
|
||||
int32 testVar = 0;
|
||||
|
||||
|
||||
void main()
|
||||
{
|
||||
ServiceDog();
|
||||
DisableDog();
|
||||
|
||||
InitSysCtrl();
|
||||
|
||||
DINT;
|
||||
|
||||
InitPieCtrl();
|
||||
|
||||
IER = 0x0000;
|
||||
IFR = 0x0000;
|
||||
|
||||
InitPieVectTable();
|
||||
|
||||
EALLOW;
|
||||
PieVectTable.TINT0 = &cpu_timer0_isr;
|
||||
PieVectTable.XINT13 = &cpu_timer1_isr;
|
||||
PieVectTable.ECAN0INTB = &canb_isr;
|
||||
PieVectTable.ECAN1INTB = &canb_box_isr;
|
||||
EDIS;
|
||||
|
||||
InitCpuTimers();
|
||||
ConfigCpuTimer(&CpuTimer0, 150, 1000); // 1ms
|
||||
ConfigCpuTimer(&CpuTimer1, 150, 5000); // 5ms
|
||||
|
||||
IER |= M_INT1; // Enable CPU Interrupt 1
|
||||
IER |= M_INT9; // Enable CPU Interrupt 9
|
||||
IER |= M_INT13; // Enable CPU Interrupt 13
|
||||
|
||||
PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
|
||||
PieCtrlRegs.PIEIER9.bit.INTx7 = 1; // from 5 to 8
|
||||
PieCtrlRegs.PIEIER9.bit.INTx8 = 1;
|
||||
|
||||
periphery.config();
|
||||
|
||||
// Enable global Interrupts and higher priority real-time debug events:
|
||||
EINT; // Enable Global interrupt INTM
|
||||
ERTM; // Enable Global realtime interrupt DBGM
|
||||
|
||||
periphery.updateVersionFPGA();
|
||||
|
||||
CpuTimer0.RegsAddr->TCR.bit.TSS = 0;
|
||||
CpuTimer1.RegsAddr->TCR.bit.TSS = 0;
|
||||
|
||||
idle_loop();
|
||||
//
|
||||
}//end main()
|
||||
//
|
||||
//
|
||||
|
||||
void idle_loop()
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
infCounter++;
|
||||
|
||||
periphery.initExternalModbus();
|
||||
|
||||
}//end while
|
||||
|
||||
}//end idle_loop()
|
||||
|
||||
|
||||
interrupt void cpu_timer0_isr(void)
|
||||
{
|
||||
periphery.processDigitalOutput();
|
||||
|
||||
PieCtrlRegs.PIEACK.all |= PIEACK_GROUP1;
|
||||
}//end
|
||||
|
||||
|
||||
interrupt void cpu_timer1_isr(){
|
||||
CpuTimer1.InterruptCount++;
|
||||
|
||||
periphery.processDigitalInput();
|
||||
}
|
||||
|
||||
|
||||
interrupt void canb_isr(void){
|
||||
canISRcounter++;
|
||||
|
||||
CANGIF0_REG CANGIF0_SHADOW;
|
||||
volatile Uint32 resetBit;
|
||||
|
||||
CANGIF0_SHADOW.all = ECanbRegs.CANGIF0.all;
|
||||
|
||||
if (CANGIF0_SHADOW.bit.WLIF0){
|
||||
resetBit = 256;
|
||||
ECanbRegs.CANGIF0.all = 256ul;
|
||||
}
|
||||
|
||||
if (CANGIF0_SHADOW.bit.EPIF0){
|
||||
ECanbRegs.CANGIF0.all = 528ul;
|
||||
}
|
||||
|
||||
PieCtrlRegs.PIEACK.all |= PIEACK_GROUP9;
|
||||
}
|
||||
|
||||
interrupt void canb_box_isr(void){
|
||||
canBoxISRcounter++;
|
||||
|
||||
// Just example
|
||||
//
|
||||
// volatile Uint32 boxNumberIsr;
|
||||
// boxNumberIsr = ECanbRegs.CANGIF1.bit.MIV1;
|
||||
|
||||
// CANRMP_REG temp;
|
||||
// temp.all = 0;
|
||||
// temp.all = 1ul << 27;
|
||||
|
||||
// ECanbRegs.CANRMP.all = temp.all;
|
||||
|
||||
// MODBUS_COMM_CPU_Message27.mdh.all = ECanbMboxes.MBOX27.MDH.all;
|
||||
// MODBUS_COMM_CPU_Message27.mdl.all = ECanbMboxes.MBOX27.MDL.all;
|
||||
|
||||
// temp.all = ECanbRegs.CANRMP.all;
|
||||
// if (temp.bit.RMP25){
|
||||
// temp.all = 1ul << 25;
|
||||
// ECanbRegs.CANRMP.all = temp.all;
|
||||
|
||||
// MODBUS_COMM_CPU_Message25.mdh.all = ECanbMboxes.MBOX25.MDH.all;
|
||||
// MODBUS_COMM_CPU_Message25.mdl.all = ECanbMboxes.MBOX25.MDL.all;
|
||||
// }
|
||||
|
||||
PieCtrlRegs.PIEACK.all |= PIEACK_GROUP9;
|
||||
}
|
Loading…
Reference in New Issue