|  |  |  | // 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"
 | 
					
						
							|  |  |  | #include "System/SystemContol.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "DSP28335/SCIB.h"
 | 
					
						
							|  |  |  | #include "DSP28335/SCIBase.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; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | float test = 55; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     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(); | 
					
						
							|  |  |  |     periphery.updateVersionFPGA(); | 
					
						
							|  |  |  |     periphery.getModbusConfiguration(); | 
					
						
							|  |  |  |     SYSCTRL::initModbusTable(periphery); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Enable global Interrupts and higher priority real-time debug events:
 | 
					
						
							|  |  |  |     EINT;   // Enable Global interrupt INTM
 | 
					
						
							|  |  |  |     ERTM;   // Enable Global realtime interrupt DBGM
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     CpuTimer0.RegsAddr->TCR.bit.TSS = 0; | 
					
						
							|  |  |  |     CpuTimer1.RegsAddr->TCR.bit.TSS = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     idle_loop(); | 
					
						
							|  |  |  |     //
 | 
					
						
							|  |  |  | }//end main()
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void idle_loop() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     while (true) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         infCounter++; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         periphery.receiveModbusParameters(); | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         periphery.modbusRTU.execute(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         periphery.receiveCpuModbusData(); | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |     }//end while
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | }//end idle_loop()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | interrupt void cpu_timer0_isr(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     periphery.processDigitalOutput(); | 
					
						
							|  |  |  |     periphery.sendModbusDataToCPU(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     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; | 
					
						
							|  |  |  | } |