Compare commits
22 Commits
main
...
feature/CA
Author | SHA1 | Date |
---|---|---|
|
8cbdce2192 | 1 month ago |
|
61b34218ff | 1 month ago |
|
a450de810f | 1 month ago |
|
cc59948011 | 1 month ago |
|
d864977511 | 1 month ago |
|
c692668f7b | 1 month ago |
|
dbbd22524b | 2 months ago |
|
07bb5edd57 | 2 months ago |
|
7cd6a2ea9e | 2 months ago |
|
b884754d93 | 2 months ago |
|
182ada3bba | 2 months ago |
|
ac023187cd | 2 months ago |
|
714f0265cc | 2 months ago |
|
0246107428 | 2 months ago |
|
0efa3cb375 | 2 months ago |
|
de707c052a | 2 months ago |
|
fd72d2833b | 2 months ago |
|
dfb90e3ee8 | 2 months ago |
|
4446eb970a | 2 months ago |
|
82df69c385 | 2 months ago |
|
34fe93213f | 2 months ago |
|
eee4c90277 | 2 months ago |
@ -0,0 +1,45 @@
|
||||
;; TI File $Revision: /main/1 $
|
||||
;; Checkin $Date: July 30, 2007 10:29:23 $
|
||||
;;###########################################################################
|
||||
;;
|
||||
;; FILE: ADC_cal.asm
|
||||
;;
|
||||
;; TITLE: 2833x Boot Rom ADC Cal routine.
|
||||
;;
|
||||
;; Functions:
|
||||
;;
|
||||
;; _ADC_cal - Copies device specific calibration data into ADCREFSEL and
|
||||
;; ADCOFFTRIM registers
|
||||
;; Notes:
|
||||
;;
|
||||
;;###########################################################################
|
||||
;; $TI Release: F2833x/F2823x Header Files and Peripheral Examples V142 $
|
||||
;; $Release Date: November 1, 2016 $
|
||||
;; $Copyright: Copyright (C) 2007-2016 Texas Instruments Incorporated -
|
||||
;; http://www.ti.com/ ALL RIGHTS RESERVED $
|
||||
;;###########################################################################
|
||||
|
||||
.def _ADC_cal
|
||||
.asg "0x711C", ADCREFSEL_LOC
|
||||
|
||||
;-----------------------------------------------
|
||||
; _ADC_cal
|
||||
;-----------------------------------------------
|
||||
;-----------------------------------------------
|
||||
; This is the ADC cal routine.This routine is programmed into
|
||||
; reserved memory by the factory. 0xAAAA and 0xBBBB are place-
|
||||
; holders for calibration data.
|
||||
;The actual values programmed by TI are device specific.
|
||||
;
|
||||
; This function assumes that the clocks have been
|
||||
; enabled to the ADC module.
|
||||
;-----------------------------------------------
|
||||
|
||||
.sect ".adc_cal"
|
||||
|
||||
_ADC_cal
|
||||
MOVW DP, #ADCREFSEL_LOC >> 6
|
||||
MOV @28, #0xAAAA ; actual value may not be 0xAAAA
|
||||
MOV @29, #0xBBBB ; actual value may not be 0xBBBB
|
||||
LRETR
|
||||
;eof ----------
|
@ -0,0 +1,88 @@
|
||||
;// TI File $Revision: /main/1 $
|
||||
;// Checkin $Date: August 18, 2006 13:45:55 $
|
||||
;//###########################################################################
|
||||
;//
|
||||
;// FILE: DSP2833x_CodeStartBranch.asm
|
||||
;//
|
||||
;// TITLE: Branch for redirecting code execution after boot.
|
||||
;//
|
||||
;// For these examples, code_start is the first code that is executed after
|
||||
;// exiting the boot ROM code.
|
||||
;//
|
||||
;// The codestart section in the linker cmd file is used to physically place
|
||||
;// this code at the correct memory location. This section should be placed
|
||||
;// at the location the BOOT ROM will re-direct the code to. For example,
|
||||
;// for boot to FLASH this code will be located at 0x3f7ff6.
|
||||
;//
|
||||
;// In addition, the example DSP2833x projects are setup such that the codegen
|
||||
;// entry point is also set to the code_start label. This is done by linker
|
||||
;// option -e in the project build options. When the debugger loads the code,
|
||||
;// it will automatically set the PC to the "entry point" address indicated by
|
||||
;// the -e linker option. In this case the debugger is simply assigning the PC,
|
||||
;// it is not the same as a full reset of the device.
|
||||
;//
|
||||
;// The compiler may warn that the entry point for the project is other then
|
||||
;// _c_init00. _c_init00 is the C environment setup and is run before
|
||||
;// main() is entered. The code_start code will re-direct the execution
|
||||
;// to _c_init00 and thus there is no worry and this warning can be ignored.
|
||||
;//
|
||||
;//###########################################################################
|
||||
;// $TI Release: F2833x/F2823x Header Files and Peripheral Examples V142 $
|
||||
;// $Release Date: November 1, 2016 $
|
||||
;// $Copyright: Copyright (C) 2007-2016 Texas Instruments Incorporated -
|
||||
;// http://www.ti.com/ ALL RIGHTS RESERVED $
|
||||
;//###########################################################################
|
||||
|
||||
|
||||
***********************************************************************
|
||||
|
||||
WD_DISABLE .set 1 ;set to 1 to disable WD, else set to 0
|
||||
|
||||
.ref _c_int00
|
||||
.global code_start
|
||||
|
||||
***********************************************************************
|
||||
* Function: codestart section
|
||||
*
|
||||
* Description: Branch to code starting point
|
||||
***********************************************************************
|
||||
|
||||
.sect "codestart"
|
||||
|
||||
code_start:
|
||||
.if WD_DISABLE == 1
|
||||
LB wd_disable ;Branch to watchdog disable code
|
||||
.else
|
||||
LB _c_int00 ;Branch to start of boot.asm in RTS library
|
||||
.endif
|
||||
|
||||
;end codestart section
|
||||
|
||||
|
||||
***********************************************************************
|
||||
* Function: wd_disable
|
||||
*
|
||||
* Description: Disables the watchdog timer
|
||||
***********************************************************************
|
||||
.if WD_DISABLE == 1
|
||||
|
||||
.text
|
||||
wd_disable:
|
||||
SETC OBJMODE ;Set OBJMODE for 28x object code
|
||||
EALLOW ;Enable EALLOW protected register access
|
||||
MOVZ DP, #7029h>>6 ;Set data page for WDCR register
|
||||
MOV @7029h, #0068h ;Set WDDIS bit in WDCR to disable WD
|
||||
EDIS ;Disable EALLOW protected register access
|
||||
LB _c_int00 ;Branch to start of boot.asm in RTS library
|
||||
|
||||
.endif
|
||||
|
||||
;end wd_disable
|
||||
|
||||
|
||||
|
||||
.end
|
||||
|
||||
;//===========================================================================
|
||||
;// End of file.
|
||||
;//===========================================================================
|
@ -0,0 +1,164 @@
|
||||
//###########################################################################
|
||||
//
|
||||
// FILE: DSP2833x_CpuTimers.c
|
||||
//
|
||||
// TITLE: CPU 32-bit Timers Initialization & Support Functions.
|
||||
//
|
||||
// NOTES: CpuTimer2 is reserved for use with DSP BIOS and
|
||||
// other realtime operating systems.
|
||||
//
|
||||
// Do not use these this timer in your application if you ever plan
|
||||
// on integrating DSP-BIOS or another realtime OS.
|
||||
//
|
||||
//###########################################################################
|
||||
// $TI Release: F2833x/F2823x Header Files and Peripheral Examples V142 $
|
||||
// $Release Date: November 1, 2016 $
|
||||
// $Copyright: Copyright (C) 2007-2016 Texas Instruments Incorporated -
|
||||
// http://www.ti.com/ ALL RIGHTS RESERVED $
|
||||
//###########################################################################
|
||||
|
||||
//
|
||||
// Included Files
|
||||
//
|
||||
#include "DSP2833x_Device.h" // Headerfile Include File
|
||||
#include "DSP2833x_Examples.h" // Examples Include File
|
||||
|
||||
//
|
||||
// Defines
|
||||
//
|
||||
struct CPUTIMER_VARS CpuTimer0;
|
||||
|
||||
//
|
||||
// When using DSP BIOS & other RTOS, comment out CPU Timer 2 code.
|
||||
//
|
||||
struct CPUTIMER_VARS CpuTimer1;
|
||||
struct CPUTIMER_VARS CpuTimer2;
|
||||
|
||||
//
|
||||
// InitCpuTimers - This function initializes all three CPU timers to a known
|
||||
// state.
|
||||
//
|
||||
void
|
||||
InitCpuTimers(void)
|
||||
{
|
||||
//
|
||||
// CPU Timer 0 - Initialize address pointers to respective timer registers
|
||||
//
|
||||
CpuTimer0.RegsAddr = &CpuTimer0Regs;
|
||||
|
||||
//
|
||||
// Initialize timer period to maximum
|
||||
//
|
||||
CpuTimer0Regs.PRD.all = 0xFFFFFFFF;
|
||||
|
||||
//
|
||||
// Initialize pre-scale counter to divide by 1 (SYSCLKOUT)
|
||||
//
|
||||
CpuTimer0Regs.TPR.all = 0;
|
||||
CpuTimer0Regs.TPRH.all = 0;
|
||||
|
||||
//
|
||||
// Make sure timer is stopped
|
||||
//
|
||||
CpuTimer0Regs.TCR.bit.TSS = 1;
|
||||
|
||||
//
|
||||
// Reload all counter register with period value
|
||||
//
|
||||
CpuTimer0Regs.TCR.bit.TRB = 1;
|
||||
|
||||
//
|
||||
// Reset interrupt counters
|
||||
//
|
||||
CpuTimer0.InterruptCount = 0;
|
||||
|
||||
//
|
||||
// CpuTimer2 is reserved for DSP BIOS & other RTOS
|
||||
// Do not use this timer if you ever plan on integrating
|
||||
// DSP-BIOS or another realtime OS.
|
||||
//
|
||||
|
||||
//
|
||||
// Initialize address pointers to respective timer registers
|
||||
//
|
||||
CpuTimer1.RegsAddr = &CpuTimer1Regs;
|
||||
CpuTimer2.RegsAddr = &CpuTimer2Regs;
|
||||
|
||||
//
|
||||
// Initialize timer period to maximum
|
||||
//
|
||||
CpuTimer1Regs.PRD.all = 0xFFFFFFFF;
|
||||
CpuTimer2Regs.PRD.all = 0xFFFFFFFF;
|
||||
|
||||
//
|
||||
// Make sure timers are stopped
|
||||
//
|
||||
CpuTimer1Regs.TCR.bit.TSS = 1;
|
||||
CpuTimer2Regs.TCR.bit.TSS = 1;
|
||||
|
||||
//
|
||||
// Reload all counter register with period value
|
||||
//
|
||||
CpuTimer1Regs.TCR.bit.TRB = 1;
|
||||
CpuTimer2Regs.TCR.bit.TRB = 1;
|
||||
|
||||
//
|
||||
// Reset interrupt counters
|
||||
//
|
||||
CpuTimer1.InterruptCount = 0;
|
||||
CpuTimer2.InterruptCount = 0;
|
||||
}
|
||||
|
||||
//
|
||||
// ConfigCpuTimer - This function initializes the selected timer to the period
|
||||
// specified by the "Freq" and "Period" parameters. The "Freq" is entered as
|
||||
// "MHz" and the period in "uSeconds". The timer is held in the stopped state
|
||||
// after configuration.
|
||||
//
|
||||
void
|
||||
ConfigCpuTimer(struct CPUTIMER_VARS *Timer, float Freq, float Period)
|
||||
{
|
||||
Uint32 temp;
|
||||
|
||||
//
|
||||
// Initialize timer period
|
||||
//
|
||||
Timer->CPUFreqInMHz = Freq;
|
||||
Timer->PeriodInUSec = Period;
|
||||
temp = (long) (Freq * Period);
|
||||
Timer->RegsAddr->PRD.all = temp;
|
||||
|
||||
//
|
||||
// Set pre-scale counter to divide by 1 (SYSCLKOUT)
|
||||
//
|
||||
Timer->RegsAddr->TPR.all = 0;
|
||||
Timer->RegsAddr->TPRH.all = 0;
|
||||
|
||||
//
|
||||
// Initialize timer control register
|
||||
//
|
||||
|
||||
//
|
||||
// 1 = Stop timer, 0 = Start/Restart Timer
|
||||
//
|
||||
Timer->RegsAddr->TCR.bit.TSS = 1;
|
||||
|
||||
Timer->RegsAddr->TCR.bit.TRB = 1; // 1 = reload timer
|
||||
Timer->RegsAddr->TCR.bit.SOFT = 1;
|
||||
Timer->RegsAddr->TCR.bit.FREE = 1; // Timer Free Run
|
||||
|
||||
//
|
||||
// 0 = Disable/ 1 = Enable Timer Interrupt
|
||||
//
|
||||
Timer->RegsAddr->TCR.bit.TIE = 1;
|
||||
|
||||
//
|
||||
// Reset interrupt counter
|
||||
//
|
||||
Timer->InterruptCount = 0;
|
||||
}
|
||||
|
||||
//
|
||||
// End of File
|
||||
//
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,464 @@
|
||||
//###########################################################################
|
||||
//
|
||||
// FILE: DSP2833x_ECan.c
|
||||
//
|
||||
// TITLE: DSP2833x Enhanced CAN Initialization & Support Functions.
|
||||
//
|
||||
//###########################################################################
|
||||
// $TI Release: F2833x/F2823x Header Files and Peripheral Examples V142 $
|
||||
// $Release Date: November 1, 2016 $
|
||||
// $Copyright: Copyright (C) 2007-2016 Texas Instruments Incorporated -
|
||||
// http://www.ti.com/ ALL RIGHTS RESERVED $
|
||||
//###########################################################################
|
||||
|
||||
//
|
||||
// Included Files
|
||||
//
|
||||
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
|
||||
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File
|
||||
|
||||
//
|
||||
// InitECan - This function initializes the eCAN module to a known state.
|
||||
//
|
||||
void
|
||||
InitECan(void)
|
||||
{
|
||||
InitECana();
|
||||
#if DSP28_ECANB
|
||||
InitECanb();
|
||||
#endif // if DSP28_ECANB
|
||||
}
|
||||
|
||||
//
|
||||
// InitECana - Initialize eCAN-A module
|
||||
//
|
||||
void
|
||||
InitECana(void)
|
||||
{
|
||||
//
|
||||
// Create a shadow register structure for the CAN control registers. This
|
||||
// is needed, since only 32-bit access is allowed to these registers.
|
||||
// 16-bit access to these registers could potentially corrupt the register
|
||||
// contents or return false data. This is especially true while writing
|
||||
// to/reading from a bit (or group of bits) among bits 16 - 31
|
||||
//
|
||||
struct ECAN_REGS ECanaShadow;
|
||||
|
||||
EALLOW; // EALLOW enables access to protected bits
|
||||
|
||||
//
|
||||
// Configure eCAN RX and TX pins for CAN operation using eCAN regs
|
||||
//
|
||||
ECanaShadow.CANTIOC.all = ECanaRegs.CANTIOC.all;
|
||||
ECanaShadow.CANTIOC.bit.TXFUNC = 1;
|
||||
ECanaRegs.CANTIOC.all = ECanaShadow.CANTIOC.all;
|
||||
|
||||
ECanaShadow.CANRIOC.all = ECanaRegs.CANRIOC.all;
|
||||
ECanaShadow.CANRIOC.bit.RXFUNC = 1;
|
||||
ECanaRegs.CANRIOC.all = ECanaShadow.CANRIOC.all;
|
||||
|
||||
//
|
||||
// Configure eCAN for HECC mode - (reqd to access mailboxes 16 thru 31)
|
||||
// HECC mode also enables time-stamping feature
|
||||
//
|
||||
ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
|
||||
ECanaShadow.CANMC.bit.SCB = 1;
|
||||
ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
|
||||
|
||||
//
|
||||
// Initialize all bits of 'Master Control Field' to zero
|
||||
// Some bits of MSGCTRL register come up in an unknown state. For proper
|
||||
// operation, all bits (including reserved bits) of MSGCTRL must be
|
||||
// initialized to zero
|
||||
//
|
||||
ECanaMboxes.MBOX0.MSGCTRL.all = 0x00000000;
|
||||
ECanaMboxes.MBOX1.MSGCTRL.all = 0x00000000;
|
||||
ECanaMboxes.MBOX2.MSGCTRL.all = 0x00000000;
|
||||
ECanaMboxes.MBOX3.MSGCTRL.all = 0x00000000;
|
||||
ECanaMboxes.MBOX4.MSGCTRL.all = 0x00000000;
|
||||
ECanaMboxes.MBOX5.MSGCTRL.all = 0x00000000;
|
||||
ECanaMboxes.MBOX6.MSGCTRL.all = 0x00000000;
|
||||
ECanaMboxes.MBOX7.MSGCTRL.all = 0x00000000;
|
||||
ECanaMboxes.MBOX8.MSGCTRL.all = 0x00000000;
|
||||
ECanaMboxes.MBOX9.MSGCTRL.all = 0x00000000;
|
||||
ECanaMboxes.MBOX10.MSGCTRL.all = 0x00000000;
|
||||
ECanaMboxes.MBOX11.MSGCTRL.all = 0x00000000;
|
||||
ECanaMboxes.MBOX12.MSGCTRL.all = 0x00000000;
|
||||
ECanaMboxes.MBOX13.MSGCTRL.all = 0x00000000;
|
||||
ECanaMboxes.MBOX14.MSGCTRL.all = 0x00000000;
|
||||
ECanaMboxes.MBOX15.MSGCTRL.all = 0x00000000;
|
||||
ECanaMboxes.MBOX16.MSGCTRL.all = 0x00000000;
|
||||
ECanaMboxes.MBOX17.MSGCTRL.all = 0x00000000;
|
||||
ECanaMboxes.MBOX18.MSGCTRL.all = 0x00000000;
|
||||
ECanaMboxes.MBOX19.MSGCTRL.all = 0x00000000;
|
||||
ECanaMboxes.MBOX20.MSGCTRL.all = 0x00000000;
|
||||
ECanaMboxes.MBOX21.MSGCTRL.all = 0x00000000;
|
||||
ECanaMboxes.MBOX22.MSGCTRL.all = 0x00000000;
|
||||
ECanaMboxes.MBOX23.MSGCTRL.all = 0x00000000;
|
||||
ECanaMboxes.MBOX24.MSGCTRL.all = 0x00000000;
|
||||
ECanaMboxes.MBOX25.MSGCTRL.all = 0x00000000;
|
||||
ECanaMboxes.MBOX26.MSGCTRL.all = 0x00000000;
|
||||
ECanaMboxes.MBOX27.MSGCTRL.all = 0x00000000;
|
||||
ECanaMboxes.MBOX28.MSGCTRL.all = 0x00000000;
|
||||
ECanaMboxes.MBOX29.MSGCTRL.all = 0x00000000;
|
||||
ECanaMboxes.MBOX30.MSGCTRL.all = 0x00000000;
|
||||
ECanaMboxes.MBOX31.MSGCTRL.all = 0x00000000;
|
||||
|
||||
//
|
||||
// TAn, RMPn, GIFn bits are all zero upon reset and are cleared again
|
||||
// as a matter of precaution.
|
||||
//
|
||||
ECanaRegs.CANTA.all = 0xFFFFFFFF; // Clear all TAn bits
|
||||
|
||||
ECanaRegs.CANRMP.all = 0xFFFFFFFF; // Clear all RMPn bits
|
||||
|
||||
ECanaRegs.CANGIF0.all = 0xFFFFFFFF; // Clear all interrupt flag bits
|
||||
ECanaRegs.CANGIF1.all = 0xFFFFFFFF;
|
||||
|
||||
//
|
||||
// Configure bit timing parameters for eCANA
|
||||
//
|
||||
ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
|
||||
ECanaShadow.CANMC.bit.CCR = 1 ; // Set CCR = 1
|
||||
ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
|
||||
|
||||
ECanaShadow.CANES.all = ECanaRegs.CANES.all;
|
||||
|
||||
do
|
||||
{
|
||||
ECanaShadow.CANES.all = ECanaRegs.CANES.all;
|
||||
} while(ECanaShadow.CANES.bit.CCE != 1 ); // Wait for CCE bit to be set
|
||||
|
||||
ECanaShadow.CANBTC.all = 0;
|
||||
|
||||
//
|
||||
// CPU_FRQ_150MHz is defined in DSP2833x_Examples.h
|
||||
//
|
||||
#if (CPU_FRQ_150MHZ)
|
||||
//
|
||||
// The following block for all 150 MHz SYSCLKOUT
|
||||
// (75 MHz CAN clock) - default. Bit rate = 1 Mbps See Note at End of File
|
||||
//
|
||||
ECanaShadow.CANBTC.bit.BRPREG = 4;
|
||||
ECanaShadow.CANBTC.bit.TSEG2REG = 2;
|
||||
ECanaShadow.CANBTC.bit.TSEG1REG = 10;
|
||||
#endif
|
||||
|
||||
//
|
||||
// CPU_FRQ_100MHz is defined in DSP2833x_Examples.h
|
||||
//
|
||||
#if (CPU_FRQ_100MHZ)
|
||||
//
|
||||
// The following block is only for 100 MHz SYSCLKOUT (50 MHz CAN clock).
|
||||
// Bit rate = 1 Mbps See Note at End of File
|
||||
//
|
||||
ECanaShadow.CANBTC.bit.BRPREG = 4;
|
||||
ECanaShadow.CANBTC.bit.TSEG2REG = 1;
|
||||
ECanaShadow.CANBTC.bit.TSEG1REG = 6;
|
||||
#endif
|
||||
|
||||
ECanaShadow.CANBTC.bit.SAM = 1;
|
||||
ECanaRegs.CANBTC.all = ECanaShadow.CANBTC.all;
|
||||
|
||||
ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
|
||||
ECanaShadow.CANMC.bit.CCR = 0 ; // Set CCR = 0
|
||||
ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
|
||||
|
||||
ECanaShadow.CANES.all = ECanaRegs.CANES.all;
|
||||
|
||||
do
|
||||
{
|
||||
ECanaShadow.CANES.all = ECanaRegs.CANES.all;
|
||||
} while(ECanaShadow.CANES.bit.CCE != 0 );// Wait for CCE bit to be cleared
|
||||
|
||||
//
|
||||
// Disable all Mailboxes
|
||||
//
|
||||
ECanaRegs.CANME.all = 0; // Required before writing the MSGIDs
|
||||
|
||||
EDIS;
|
||||
}
|
||||
|
||||
#if (DSP28_ECANB)
|
||||
//
|
||||
// Initialize eCAN-B module
|
||||
//
|
||||
void
|
||||
InitECanb(void)
|
||||
{
|
||||
//
|
||||
// Create a shadow register structure for the CAN control registers. This
|
||||
// is needed, since only 32-bit access is allowed to these registers.
|
||||
// 16-bit access to these registers could potentially corrupt the register
|
||||
// contents or return false data. This is especially true while writing
|
||||
// to/reading from a bit (or group of bits) among bits 16 - 31
|
||||
//
|
||||
struct ECAN_REGS ECanbShadow;
|
||||
|
||||
EALLOW; // EALLOW enables access to protected bits
|
||||
|
||||
//
|
||||
// Configure eCAN RX and TX pins for CAN operation using eCAN regs
|
||||
//
|
||||
ECanbShadow.CANTIOC.all = ECanbRegs.CANTIOC.all;
|
||||
ECanbShadow.CANTIOC.bit.TXFUNC = 1;
|
||||
ECanbRegs.CANTIOC.all = ECanbShadow.CANTIOC.all;
|
||||
|
||||
ECanbShadow.CANRIOC.all = ECanbRegs.CANRIOC.all;
|
||||
ECanbShadow.CANRIOC.bit.RXFUNC = 1;
|
||||
ECanbRegs.CANRIOC.all = ECanbShadow.CANRIOC.all;
|
||||
|
||||
//
|
||||
// Configure eCAN for HECC mode - (read to access mailboxes 16 thru 31)
|
||||
//
|
||||
ECanbShadow.CANMC.all = ECanbRegs.CANMC.all;
|
||||
ECanbShadow.CANMC.bit.SCB = 1;
|
||||
ECanbRegs.CANMC.all = ECanbShadow.CANMC.all;
|
||||
|
||||
//
|
||||
// Initialize all bits of 'Master Control Field' to zero
|
||||
// Some bits of MSGCTRL register come up in an unknown state. For proper
|
||||
// operation, all bits (including reserved bits) of MSGCTRL must be
|
||||
// initialized to zero
|
||||
//
|
||||
ECanbMboxes.MBOX0.MSGCTRL.all = 0x00000000;
|
||||
ECanbMboxes.MBOX1.MSGCTRL.all = 0x00000000;
|
||||
ECanbMboxes.MBOX2.MSGCTRL.all = 0x00000000;
|
||||
ECanbMboxes.MBOX3.MSGCTRL.all = 0x00000000;
|
||||
ECanbMboxes.MBOX4.MSGCTRL.all = 0x00000000;
|
||||
ECanbMboxes.MBOX5.MSGCTRL.all = 0x00000000;
|
||||
ECanbMboxes.MBOX6.MSGCTRL.all = 0x00000000;
|
||||
ECanbMboxes.MBOX7.MSGCTRL.all = 0x00000000;
|
||||
ECanbMboxes.MBOX8.MSGCTRL.all = 0x00000000;
|
||||
ECanbMboxes.MBOX9.MSGCTRL.all = 0x00000000;
|
||||
ECanbMboxes.MBOX10.MSGCTRL.all = 0x00000000;
|
||||
ECanbMboxes.MBOX11.MSGCTRL.all = 0x00000000;
|
||||
ECanbMboxes.MBOX12.MSGCTRL.all = 0x00000000;
|
||||
ECanbMboxes.MBOX13.MSGCTRL.all = 0x00000000;
|
||||
ECanbMboxes.MBOX14.MSGCTRL.all = 0x00000000;
|
||||
ECanbMboxes.MBOX15.MSGCTRL.all = 0x00000000;
|
||||
ECanbMboxes.MBOX16.MSGCTRL.all = 0x00000000;
|
||||
ECanbMboxes.MBOX17.MSGCTRL.all = 0x00000000;
|
||||
ECanbMboxes.MBOX18.MSGCTRL.all = 0x00000000;
|
||||
ECanbMboxes.MBOX19.MSGCTRL.all = 0x00000000;
|
||||
ECanbMboxes.MBOX20.MSGCTRL.all = 0x00000000;
|
||||
ECanbMboxes.MBOX21.MSGCTRL.all = 0x00000000;
|
||||
ECanbMboxes.MBOX22.MSGCTRL.all = 0x00000000;
|
||||
ECanbMboxes.MBOX23.MSGCTRL.all = 0x00000000;
|
||||
ECanbMboxes.MBOX24.MSGCTRL.all = 0x00000000;
|
||||
ECanbMboxes.MBOX25.MSGCTRL.all = 0x00000000;
|
||||
ECanbMboxes.MBOX26.MSGCTRL.all = 0x00000000;
|
||||
ECanbMboxes.MBOX27.MSGCTRL.all = 0x00000000;
|
||||
ECanbMboxes.MBOX28.MSGCTRL.all = 0x00000000;
|
||||
ECanbMboxes.MBOX29.MSGCTRL.all = 0x00000000;
|
||||
ECanbMboxes.MBOX30.MSGCTRL.all = 0x00000000;
|
||||
ECanbMboxes.MBOX31.MSGCTRL.all = 0x00000000;
|
||||
|
||||
//
|
||||
// TAn, RMPn, GIFn bits are all zero upon reset and are cleared again
|
||||
// as a matter of precaution.
|
||||
//
|
||||
ECanbRegs.CANTA.all = 0xFFFFFFFF; // Clear all TAn bits
|
||||
|
||||
ECanbRegs.CANRMP.all = 0xFFFFFFFF; // Clear all RMPn bits
|
||||
|
||||
ECanbRegs.CANGIF0.all = 0xFFFFFFFF; // Clear all interrupt flag bits
|
||||
ECanbRegs.CANGIF1.all = 0xFFFFFFFF;
|
||||
|
||||
//
|
||||
// Configure bit timing parameters for eCANB
|
||||
//
|
||||
ECanbShadow.CANMC.all = ECanbRegs.CANMC.all;
|
||||
ECanbShadow.CANMC.bit.CCR = 1 ; // Set CCR = 1
|
||||
ECanbRegs.CANMC.all = ECanbShadow.CANMC.all;
|
||||
|
||||
ECanbShadow.CANES.all = ECanbRegs.CANES.all;
|
||||
|
||||
do
|
||||
{
|
||||
ECanbShadow.CANES.all = ECanbRegs.CANES.all;
|
||||
} while(ECanbShadow.CANES.bit.CCE != 1); // Wait for CCE bit to be cleared
|
||||
|
||||
ECanbShadow.CANBTC.all = 0;
|
||||
|
||||
//
|
||||
// CPU_FRQ_150MHz is defined in DSP2833x_Examples.h
|
||||
//
|
||||
#if (CPU_FRQ_150MHZ)
|
||||
//
|
||||
// The following block for all 150 MHz SYSCLKOUT
|
||||
// (75 MHz CAN clock) - default. Bit rate = 1 Mbps See Note at end of file
|
||||
//
|
||||
ECanbShadow.CANBTC.bit.BRPREG = 4;
|
||||
ECanbShadow.CANBTC.bit.TSEG2REG = 2;
|
||||
ECanbShadow.CANBTC.bit.TSEG1REG = 10;
|
||||
#endif
|
||||
|
||||
//
|
||||
// CPU_FRQ_100MHz is defined in DSP2833x_Examples.h
|
||||
//
|
||||
#if (CPU_FRQ_100MHZ)
|
||||
//
|
||||
// The following block is only for 100 MHz SYSCLKOUT (50 MHz CAN clock).
|
||||
// Bit rate = 1 Mbps See Note at end of file
|
||||
//
|
||||
ECanbShadow.CANBTC.bit.BRPREG = 4;
|
||||
ECanbShadow.CANBTC.bit.TSEG2REG = 1;
|
||||
ECanbShadow.CANBTC.bit.TSEG1REG = 6;
|
||||
#endif
|
||||
|
||||
ECanbShadow.CANBTC.bit.SAM = 1;
|
||||
ECanbRegs.CANBTC.all = ECanbShadow.CANBTC.all;
|
||||
|
||||
ECanbShadow.CANMC.all = ECanbRegs.CANMC.all;
|
||||
ECanbShadow.CANMC.bit.CCR = 0 ; // Set CCR = 0
|
||||
ECanbRegs.CANMC.all = ECanbShadow.CANMC.all;
|
||||
|
||||
ECanbShadow.CANES.all = ECanbRegs.CANES.all;
|
||||
|
||||
do
|
||||
{
|
||||
ECanbShadow.CANES.all = ECanbRegs.CANES.all;
|
||||
} while(ECanbShadow.CANES.bit.CCE != 0 );// Wait for CCE bit to be cleared
|
||||
|
||||
//
|
||||
// Disable all Mailboxes
|
||||
//
|
||||
ECanbRegs.CANME.all = 0; // Required before writing the MSGIDs
|
||||
|
||||
EDIS;
|
||||
}
|
||||
#endif // if DSP28_ECANB
|
||||
|
||||
//
|
||||
// InitECanGpio - This function initializes GPIO pins to function as eCAN pins
|
||||
//
|
||||
// Each GPIO pin can be configured as a GPIO pin or up to 3 different
|
||||
// peripheral functional pins. By default all pins come up as GPIO
|
||||
// inputs after reset.
|
||||
//
|
||||
// Caution:
|
||||
// Only one GPIO pin should be enabled for CANTXA/B operation.
|
||||
// Only one GPIO pin shoudl be enabled for CANRXA/B operation.
|
||||
// Comment out other unwanted lines.
|
||||
//
|
||||
void
|
||||
InitECanGpio(void)
|
||||
{
|
||||
InitECanaGpio();
|
||||
#if (DSP28_ECANB)
|
||||
InitECanbGpio();
|
||||
#endif // if DSP28_ECANB
|
||||
}
|
||||
|
||||
//
|
||||
// InitECanaGpio - This function initializes GPIO pins to function as eCAN- A
|
||||
//
|
||||
void
|
||||
InitECanaGpio(void)
|
||||
{
|
||||
EALLOW;
|
||||
|
||||
//
|
||||
// Enable internal pull-up for the selected CAN pins
|
||||
// Pull-ups can be enabled or disabled by the user.
|
||||
// This will enable the pullups for the specified pins.
|
||||
// Comment out other unwanted lines.
|
||||
//
|
||||
// GpioCtrlRegs.GPAPUD.bit.GPIO30 = 0; // Enable pull-up for GPIO30 (CANRXA)
|
||||
GpioCtrlRegs.GPAPUD.bit.GPIO18 = 0; // Enable pull-up for GPIO18 (CANRXA)
|
||||
|
||||
// GpioCtrlRegs.GPAPUD.bit.GPIO31 = 0; //Enable pull-up for GPIO31 (CANTXA)
|
||||
GpioCtrlRegs.GPAPUD.bit.GPIO19 = 0; //Enable pull-up for GPIO19 (CANTXA)
|
||||
|
||||
//
|
||||
// Set qualification for selected CAN pins to asynch only
|
||||
// Inputs are synchronized to SYSCLKOUT by default.
|
||||
// This will select asynch (no qualification) for the selected pins.
|
||||
//
|
||||
// GpioCtrlRegs.GPAQSEL2.bit.GPIO30 = 3; // Asynch qual for GPIO30 (CANRXA)
|
||||
GpioCtrlRegs.GPAQSEL2.bit.GPIO18 = 3; // Asynch qual for GPIO18 (CANRXA)
|
||||
|
||||
//
|
||||
// Configure eCAN-A pins using GPIO regs
|
||||
// This specifies which of the possible GPIO pins will be eCAN functional
|
||||
// pins.
|
||||
//
|
||||
// GpioCtrlRegs.GPAMUX2.bit.GPIO30 = 1; // Configure GPIO30 for CANRXA
|
||||
GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 3; // Configure GPIO18 for CANRXA
|
||||
// GpioCtrlRegs.GPAMUX2.bit.GPIO31 = 1; // Configure GPIO31 for CANTXA
|
||||
GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 3; // Configure GPIO19 for CANTXA
|
||||
|
||||
EDIS;
|
||||
}
|
||||
|
||||
#if (DSP28_ECANB)
|
||||
//
|
||||
// InitECanbGpio - This function initializes GPIO pins to function as eCAN-B
|
||||
//
|
||||
void
|
||||
InitECanbGpio(void)
|
||||
{
|
||||
EALLOW;
|
||||
|
||||
//
|
||||
// Enable internal pull-up for the selected CAN pins
|
||||
// Pull-ups can be enabled or disabled by the user.
|
||||
// This will enable the pullups for the specified pins.
|
||||
// Comment out other unwanted lines.
|
||||
//
|
||||
// GpioCtrlRegs.GPAPUD.bit.GPIO8 = 0; //Enable pull-up for GPIO8 (CANTXB)
|
||||
//GpioCtrlRegs.GPAPUD.bit.GPIO12 = 0; //Enable pull-up for GPIO12(CANTXB)
|
||||
//GpioCtrlRegs.GPAPUD.bit.GPIO16 = 0; //Enable pull-up for GPIO16(CANTXB)
|
||||
GpioCtrlRegs.GPAPUD.bit.GPIO20 = 0; //Enable pull-up for GPIO20(CANTXB)
|
||||
|
||||
// GpioCtrlRegs.GPAPUD.bit.GPIO10 = 0; // Enable pull-up for GPIO10(CANRXB)
|
||||
//GpioCtrlRegs.GPAPUD.bit.GPIO13 = 0; // Enable pull-up for GPIO13(CANRXB)
|
||||
//GpioCtrlRegs.GPAPUD.bit.GPIO17 = 0; // Enable pull-up for GPIO17(CANRXB)
|
||||
GpioCtrlRegs.GPAPUD.bit.GPIO21 = 0; // Enable pull-up for GPIO21(CANRXB)
|
||||
|
||||
//
|
||||
// Set qualification for selected CAN pins to asynch only
|
||||
// Inputs are synchronized to SYSCLKOUT by default.
|
||||
// This will select asynch (no qualification) for the selected pins.
|
||||
// Comment out other unwanted lines.
|
||||
//
|
||||
// GpioCtrlRegs.GPAQSEL1.bit.GPIO10 = 3; // Asynch qual for GPIO10 (CANRXB)
|
||||
//GpioCtrlRegs.GPAQSEL1.bit.GPIO13 = 3; // Asynch qual for GPIO13 (CANRXB)
|
||||
//GpioCtrlRegs.GPAQSEL2.bit.GPIO17 = 3; // Asynch qual for GPIO17 (CANRXB)
|
||||
GpioCtrlRegs.GPAQSEL2.bit.GPIO21 = 3; // Asynch qual for GPIO21 (CANRXB)
|
||||
|
||||
//
|
||||
// Configure eCAN-B pins using GPIO regs
|
||||
// This specifies which of the possible GPIO pins will be eCAN functional
|
||||
// pins.
|
||||
//
|
||||
// GpioCtrlRegs.GPAMUX1.bit.GPIO8 = 2; // Configure GPIO8 for CANTXB
|
||||
//GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 2; // Configure GPIO12 for CANTXB
|
||||
//GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 2; // Configure GPIO16 for CANTXB
|
||||
GpioCtrlRegs.GPAMUX2.bit.GPIO20 = 3; // Configure GPIO20 for CANTXB
|
||||
|
||||
// GpioCtrlRegs.GPAMUX1.bit.GPIO10 = 2; // Configure GPIO10 for CANRXB
|
||||
//GpioCtrlRegs.GPAMUX1.bit.GPIO13 = 2; // Configure GPIO13 for CANRXB
|
||||
//GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 2; // Configure GPIO17 for CANRXB
|
||||
GpioCtrlRegs.GPAMUX2.bit.GPIO21 = 3; // Configure GPIO21 for CANRXB
|
||||
|
||||
EDIS;
|
||||
}
|
||||
#endif // if DSP28_ECANB
|
||||
|
||||
//
|
||||
// Note: Bit timing parameters must be chosen based on the network parameters
|
||||
// such as the sampling point desired and the propagation delay of the network.
|
||||
// The propagation delay is a function of length of the cable, delay introduced
|
||||
// by the transceivers and opto/galvanic-isolators (if any).
|
||||
//
|
||||
// The parameters used in this file must be changed taking into account the
|
||||
// above mentioned factors in order to arrive at the bit-timing parameters
|
||||
// suitable for a network.
|
||||
//
|
||||
|
||||
//
|
||||
// End of File
|
||||
//
|
||||
|
@ -0,0 +1,273 @@
|
||||
//###########################################################################
|
||||
//
|
||||
// FILE: DSP2833x_ECap.c
|
||||
//
|
||||
// TITLE: DSP2833x eCAP Initialization & Support Functions.
|
||||
//
|
||||
//###########################################################################
|
||||
// $TI Release: F2833x/F2823x Header Files and Peripheral Examples V142 $
|
||||
// $Release Date: November 1, 2016 $
|
||||
// $Copyright: Copyright (C) 2007-2016 Texas Instruments Incorporated -
|
||||
// http://www.ti.com/ ALL RIGHTS RESERVED $
|
||||
//###########################################################################
|
||||
|
||||
//
|
||||
// Included Files
|
||||
//
|
||||
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
|
||||
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File
|
||||
|
||||
//
|
||||
// InitECap - This function initializes the eCAP(s) to a known state.
|
||||
//
|
||||
void
|
||||
InitECap(void)
|
||||
{
|
||||
//
|
||||
// Initialize eCAP1/2/3
|
||||
//
|
||||
}
|
||||
|
||||
//
|
||||
// InitECapGpio - This function initializes GPIO pins to function as ECAP pins
|
||||
//
|
||||
// Each GPIO pin can be configured as a GPIO pin or up to 3 different
|
||||
// peripheral functional pins. By default all pins come up as GPIO
|
||||
// inputs after reset.
|
||||
//
|
||||
// Caution:
|
||||
// For each eCAP peripheral
|
||||
// Only one GPIO pin should be enabled for ECAP operation.
|
||||
// Comment out other unwanted lines.
|
||||
//
|
||||
void
|
||||
InitECapGpio()
|
||||
{
|
||||
InitECap1Gpio();
|
||||
#if (DSP28_ECAP2)
|
||||
InitECap2Gpio();
|
||||
#endif // endif DSP28_ECAP2
|
||||
#if (DSP28_ECAP3)
|
||||
InitECap3Gpio();
|
||||
#endif // endif DSP28_ECAP3
|
||||
#if (DSP28_ECAP4)
|
||||
InitECap4Gpio();
|
||||
#endif // endif DSP28_ECAP4
|
||||
#if (DSP28_ECAP5)
|
||||
InitECap5Gpio();
|
||||
#endif // endif DSP28_ECAP5
|
||||
#if (DSP28_ECAP6)
|
||||
InitECap6Gpio();
|
||||
#endif // endif DSP28_ECAP6
|
||||
}
|
||||
|
||||
//
|
||||
// InitECap1Gpio -
|
||||
//
|
||||
void
|
||||
InitECap1Gpio(void)
|
||||
{
|
||||
EALLOW;
|
||||
|
||||
//
|
||||
// Enable internal pull-up for the selected pins
|
||||
// Pull-ups can be enabled or disabled by the user.
|
||||
// This will enable the pullups for the specified pins.
|
||||
// Comment out other unwanted lines.
|
||||
//
|
||||
//GpioCtrlRegs.GPAPUD.bit.GPIO5 = 0; // Enable pull-up on GPIO5 (CAP1)
|
||||
GpioCtrlRegs.GPAPUD.bit.GPIO24 = 0; // Enable pull-up on GPIO24 (CAP1)
|
||||
//GpioCtrlRegs.GPBPUD.bit.GPIO34 = 0; // Enable pull-up on GPIO34 (CAP1)
|
||||
|
||||
//
|
||||
// Inputs are synchronized to SYSCLKOUT by default.
|
||||
// Comment out other unwanted lines.
|
||||
//
|
||||
//GpioCtrlRegs.GPAQSEL1.bit.GPIO5 = 0; //Synch to SYSCLKOUT GPIO5 (CAP1)
|
||||
GpioCtrlRegs.GPAQSEL2.bit.GPIO24 = 0; //Synch to SYSCLKOUT GPIO24 (CAP1)
|
||||
//GpioCtrlRegs.GPBQSEL1.bit.GPIO34 = 0; //Synch to SYSCLKOUT GPIO34 (CAP1)
|
||||
|
||||
//
|
||||
// Configure eCAP-1 pins using GPIO regs
|
||||
// This specifies which of the possible GPIO pins will be eCAP1 functional pins.
|
||||
// Comment out other unwanted lines.
|
||||
//
|
||||
//GpioCtrlRegs.GPAMUX1.bit.GPIO5 = 3; // Configure GPIO5 as CAP1
|
||||
GpioCtrlRegs.GPAMUX2.bit.GPIO24 = 1; // Configure GPIO24 as CAP1
|
||||
//GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 1; // Configure GPIO24 as CAP1
|
||||
|
||||
EDIS;
|
||||
}
|
||||
|
||||
#if DSP28_ECAP2
|
||||
//
|
||||
// InitECap2Gpio -
|
||||
//
|
||||
void
|
||||
InitECap2Gpio(void)
|
||||
{
|
||||
EALLOW;
|
||||
|
||||
//
|
||||
// Enable internal pull-up for the selected pins
|
||||
// Pull-ups can be enabled or disabled by the user.
|
||||
// This will enable the pullups for the specified pins.
|
||||
// Comment out other unwanted lines.
|
||||
//
|
||||
GpioCtrlRegs.GPAPUD.bit.GPIO7 = 0; // Enable pull-up on GPIO7 (CAP2)
|
||||
//GpioCtrlRegs.GPAPUD.bit.GPIO25 = 0; // Enable pull-up on GPIO25 (CAP2)
|
||||
//GpioCtrlRegs.GPBPUD.bit.GPIO37 = 0; // Enable pull-up on GPIO37 (CAP2)
|
||||
|
||||
//
|
||||
// Inputs are synchronized to SYSCLKOUT by default.
|
||||
// Comment out other unwanted lines.
|
||||
//
|
||||
GpioCtrlRegs.GPAQSEL1.bit.GPIO7 = 0; //Synch to SYSCLKOUT GPIO7 (CAP2)
|
||||
//GpioCtrlRegs.GPAQSEL2.bit.GPIO25 = 0; //Synch to SYSCLKOUT GPIO25 (CAP2)
|
||||
//GpioCtrlRegs.GPBQSEL1.bit.GPIO37 = 0; //Synch to SYSCLKOUT GPIO37 (CAP2)
|
||||
|
||||
//
|
||||
// Configure eCAP-2 pins using GPIO regs
|
||||
// This specifies which of the possible GPIO pins will be eCAP2 functional
|
||||
// pins. Comment out other unwanted lines.
|
||||
//
|
||||
GpioCtrlRegs.GPAMUX1.bit.GPIO7 = 3; // Configure GPIO7 as CAP2
|
||||
//GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 1; // Configure GPIO25 as CAP2
|
||||
//GpioCtrlRegs.GPBMUX1.bit.GPIO37 = 3; // Configure GPIO37 as CAP2
|
||||
|
||||
EDIS;
|
||||
}
|
||||
#endif // endif DSP28_ECAP2
|
||||
|
||||
#if DSP28_ECAP3
|
||||
//
|
||||
// InitECap3Gpio -
|
||||
//
|
||||
void
|
||||
InitECap3Gpio(void)
|
||||
{
|
||||
EALLOW;
|
||||
|
||||
/* Enable internal pull-up for the selected pins */
|
||||
// Pull-ups can be enabled or disabled by the user.
|
||||
// This will enable the pullups for the specified pins.
|
||||
// Comment out other unwanted lines.
|
||||
|
||||
GpioCtrlRegs.GPAPUD.bit.GPIO9 = 0; // Enable pull-up on GPIO9 (CAP3)
|
||||
// GpioCtrlRegs.GPAPUD.bit.GPIO26 = 0; // Enable pull-up on GPIO26 (CAP3)
|
||||
|
||||
// Inputs are synchronized to SYSCLKOUT by default.
|
||||
// Comment out other unwanted lines.
|
||||
|
||||
GpioCtrlRegs.GPAQSEL1.bit.GPIO9 = 0; // Synch to SYSCLKOUT GPIO9 (CAP3)
|
||||
// GpioCtrlRegs.GPAQSEL2.bit.GPIO26 = 0; // Synch to SYSCLKOUT GPIO26 (CAP3)
|
||||
|
||||
/* Configure eCAP-3 pins using GPIO regs*/
|
||||
// This specifies which of the possible GPIO pins will be eCAP3 functional pins.
|
||||
// Comment out other unwanted lines.
|
||||
|
||||
GpioCtrlRegs.GPAMUX1.bit.GPIO9 = 3; // Configure GPIO9 as CAP3
|
||||
// GpioCtrlRegs.GPAMUX2.bit.GPIO26 = 1; // Configure GPIO26 as CAP3
|
||||
|
||||
EDIS;
|
||||
}
|
||||
#endif // endif DSP28_ECAP3
|
||||
|
||||
|
||||
#if DSP28_ECAP4
|
||||
void InitECap4Gpio(void)
|
||||
{
|
||||
EALLOW;
|
||||
|
||||
/* Enable internal pull-up for the selected pins */
|
||||
// Pull-ups can be enabled or disabled by the user.
|
||||
// This will enable the pullups for the specified pins.
|
||||
// Comment out other unwanted lines.
|
||||
|
||||
GpioCtrlRegs.GPAPUD.bit.GPIO11 = 0; // Enable pull-up on GPIO11 (CAP4)
|
||||
// GpioCtrlRegs.GPAPUD.bit.GPIO27 = 0; // Enable pull-up on GPIO27 (CAP4)
|
||||
|
||||
// Inputs are synchronized to SYSCLKOUT by default.
|
||||
// Comment out other unwanted lines.
|
||||
|
||||
GpioCtrlRegs.GPAQSEL1.bit.GPIO11 = 0; // Synch to SYSCLKOUT GPIO11 (CAP4)
|
||||
// GpioCtrlRegs.GPAQSEL2.bit.GPIO27 = 0; // Synch to SYSCLKOUT GPIO27 (CAP4)
|
||||
|
||||
/* Configure eCAP-4 pins using GPIO regs*/
|
||||
// This specifies which of the possible GPIO pins will be eCAP4 functional pins.
|
||||
// Comment out other unwanted lines.
|
||||
|
||||
GpioCtrlRegs.GPAMUX1.bit.GPIO11 = 3; // Configure GPIO11 as CAP4
|
||||
// GpioCtrlRegs.GPAMUX2.bit.GPIO27 = 1; // Configure GPIO27 as CAP4
|
||||
|
||||
EDIS;
|
||||
}
|
||||
#endif // endif DSP28_ECAP4
|
||||
|
||||
|
||||
#if DSP28_ECAP5
|
||||
void InitECap5Gpio(void)
|
||||
{
|
||||
EALLOW;
|
||||
|
||||
/* Enable internal pull-up for the selected pins */
|
||||
// Pull-ups can be enabled or disabled by the user.
|
||||
// This will enable the pullups for the specified pins.
|
||||
// Comment out other unwanted lines.
|
||||
|
||||
GpioCtrlRegs.GPAPUD.bit.GPIO3 = 0; // Enable pull-up on GPIO3 (CAP5)
|
||||
// GpioCtrlRegs.GPBPUD.bit.GPIO48 = 0; // Enable pull-up on GPIO48 (CAP5)
|
||||
|
||||
// Inputs are synchronized to SYSCLKOUT by default.
|
||||
// Comment out other unwanted lines.
|
||||
|
||||
GpioCtrlRegs.GPAQSEL1.bit.GPIO3 = 0; // Synch to SYSCLKOUT GPIO3 (CAP5)
|
||||
// GpioCtrlRegs.GPBQSEL2.bit.GPIO48 = 0; // Synch to SYSCLKOUT GPIO48 (CAP5)
|
||||
|
||||
/* Configure eCAP-5 pins using GPIO regs*/
|
||||
// This specifies which of the possible GPIO pins will be eCAP5 functional pins.
|
||||
// Comment out other unwanted lines.
|
||||
|
||||
GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 2; // Configure GPIO3 as CAP5
|
||||
// GpioCtrlRegs.GPBMUX2.bit.GPIO48 = 1; // Configure GPIO48 as CAP5
|
||||
|
||||
EDIS;
|
||||
}
|
||||
#endif // endif DSP28_ECAP5
|
||||
|
||||
|
||||
#if DSP28_ECAP6
|
||||
void InitECap6Gpio(void)
|
||||
{
|
||||
EALLOW;
|
||||
|
||||
/* Enable internal pull-up for the selected pins */
|
||||
// Pull-ups can be enabled or disabled by the user.
|
||||
// This will enable the pullups for the specified pins.
|
||||
// Comment out other unwanted lines.
|
||||
|
||||
GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0; // Enable pull-up on GPIO1 (CAP6)
|
||||
// GpioCtrlRegs.GPBPUD.bit.GPIO49 = 0; // Enable pull-up on GPIO49 (CAP6)
|
||||
|
||||
// Inputs are synchronized to SYSCLKOUT by default.
|
||||
// Comment out other unwanted lines.
|
||||
|
||||
GpioCtrlRegs.GPAQSEL1.bit.GPIO1 = 0; // Synch to SYSCLKOUT GPIO1 (CAP6)
|
||||
// GpioCtrlRegs.GPBQSEL2.bit.GPIO49 = 0; // Synch to SYSCLKOUT GPIO49 (CAP6)
|
||||
|
||||
/* Configure eCAP-5 pins using GPIO regs*/
|
||||
// This specifies which of the possible GPIO pins will be eCAP6 functional pins.
|
||||
// Comment out other unwanted lines.
|
||||
|
||||
GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 2; // Configure GPIO1 as CAP6
|
||||
// GpioCtrlRegs.GPBMUX2.bit.GPIO49 = 1; // Configure GPIO49 as CAP6
|
||||
|
||||
EDIS;
|
||||
}
|
||||
#endif // endif DSP28_ECAP6
|
||||
|
||||
|
||||
|
||||
//===========================================================================
|
||||
// End of file.
|
||||
//===========================================================================
|
@ -0,0 +1,376 @@
|
||||
//###########################################################################
|
||||
//
|
||||
// FILE: DSP2833x_EPwm.c
|
||||
//
|
||||
// TITLE: DSP2833x ePWM Initialization & Support Functions.
|
||||
//
|
||||
//###########################################################################
|
||||
// $TI Release: F2833x/F2823x Header Files and Peripheral Examples V142 $
|
||||
// $Release Date: November 1, 2016 $
|
||||
// $Copyright: Copyright (C) 2007-2016 Texas Instruments Incorporated -
|
||||
// http://www.ti.com/ ALL RIGHTS RESERVED $
|
||||
//###########################################################################
|
||||
|
||||
//
|
||||
// Included Files
|
||||
//
|
||||
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
|
||||
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File
|
||||
|
||||
//
|
||||
// InitEPwm - This function initializes the ePWM(s) to a known state.
|
||||
//
|
||||
void
|
||||
InitEPwm(void)
|
||||
{
|
||||
//
|
||||
// Initialize ePWM1/2/3/4/5/6
|
||||
//
|
||||
}
|
||||
|
||||
//
|
||||
// InitEPwmGpio - This function initializes GPIO pins to function as ePWM pins
|
||||
//
|
||||
// Each GPIO pin can be configured as a GPIO pin or up to 3 different
|
||||
// peripheral functional pins. By default all pins come up as GPIO
|
||||
// inputs after reset.
|
||||
//
|
||||
void
|
||||
InitEPwmGpio(void)
|
||||
{
|
||||
InitEPwm1Gpio();
|
||||
InitEPwm2Gpio();
|
||||
InitEPwm3Gpio();
|
||||
#if DSP28_EPWM4
|
||||
InitEPwm4Gpio();
|
||||
#endif // endif DSP28_EPWM4
|
||||
#if DSP28_EPWM5
|
||||
InitEPwm5Gpio();
|
||||
#endif // endif DSP28_EPWM5
|
||||
#if DSP28_EPWM6
|
||||
InitEPwm6Gpio();
|
||||
#endif // endif DSP28_EPWM6
|
||||
}
|
||||
|
||||
//
|
||||
// InitEPwm1Gpio - This function initializes GPIO pins to function as ePWM1
|
||||
//
|
||||
void
|
||||
InitEPwm1Gpio(void)
|
||||
{
|
||||
EALLOW;
|
||||
|
||||
//
|
||||
// Enable internal pull-up for the selected pins
|
||||
// Pull-ups can be enabled or disabled by the user.
|
||||
// This will enable the pullups for the specified pins.
|
||||
// Comment out other unwanted lines.
|
||||
//
|
||||
GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0; // Enable pull-up on GPIO0 (EPWM1A)
|
||||
GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0; // Enable pull-up on GPIO1 (EPWM1B)
|
||||
|
||||
//
|
||||
// Configure ePWM-1 pins using GPIO regs
|
||||
// This specifies which of the possible GPIO pins will be ePWM1 functional
|
||||
// pins. Comment out other unwanted lines.
|
||||
//
|
||||
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; // Configure GPIO0 as EPWM1A
|
||||
GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1; // Configure GPIO1 as EPWM1B
|
||||
|
||||
EDIS;
|
||||
}
|
||||
|
||||
//
|
||||
// InitEPwm2Gpio - This function initializes GPIO pins to function as ePWM2
|
||||
//
|
||||
void
|
||||
InitEPwm2Gpio(void)
|
||||
{
|
||||
EALLOW;
|
||||
|
||||
//
|
||||
// Enable internal pull-up for the selected pins
|
||||
// Pull-ups can be enabled or disabled by the user.
|
||||
// This will enable the pullups for the specified pins.
|
||||
// Comment out other unwanted lines.
|
||||
//
|
||||
GpioCtrlRegs.GPAPUD.bit.GPIO2 = 0; // Enable pull-up on GPIO2 (EPWM2A)
|
||||
GpioCtrlRegs.GPAPUD.bit.GPIO3 = 0; // Enable pull-up on GPIO3 (EPWM3B)
|
||||
|
||||
//
|
||||
// Configure ePWM-2 pins using GPIO regs
|
||||
// This specifies which of the possible GPIO pins will be ePWM2 functional
|
||||
// pins. Comment out other unwanted lines.
|
||||
//
|
||||
GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1; // Configure GPIO2 as EPWM2A
|
||||
GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 1; // Configure GPIO3 as EPWM2B
|
||||
|
||||
EDIS;
|
||||
}
|
||||
|
||||
//
|
||||
// InitEPwm3Gpio - This function initializes GPIO pins to function as ePWM3
|
||||
//
|
||||
void
|
||||
InitEPwm3Gpio(void)
|
||||
{
|
||||
EALLOW;
|
||||
|
||||
//
|
||||
// Enable internal pull-up for the selected pins
|
||||
// Pull-ups can be enabled or disabled by the user.
|
||||
// This will enable the pullups for the specified pins.
|
||||
// Comment out other unwanted lines.
|
||||
//
|
||||
GpioCtrlRegs.GPAPUD.bit.GPIO4 = 0; // Enable pull-up on GPIO4 (EPWM3A)
|
||||
GpioCtrlRegs.GPAPUD.bit.GPIO5 = 0; // Enable pull-up on GPIO5 (EPWM3B)
|
||||
|
||||
//
|
||||
// Configure ePWM-3 pins using GPIO regs
|
||||
// This specifies which of the possible GPIO pins will be ePWM3 functional
|
||||
// pins. Comment out other unwanted lines.
|
||||
//
|
||||
GpioCtrlRegs.GPAMUX1.bit.GPIO4 = 1; // Configure GPIO4 as EPWM3A
|
||||
GpioCtrlRegs.GPAMUX1.bit.GPIO5 = 1; // Configure GPIO5 as EPWM3B
|
||||
|
||||
EDIS;
|
||||
}
|
||||
|
||||
#if DSP28_EPWM4
|
||||
//
|
||||
// InitEPwm4Gpio - This function initializes GPIO pins to function as ePWM4
|
||||
//
|
||||
void
|
||||
InitEPwm4Gpio(void)
|
||||
{
|
||||
EALLOW;
|
||||
|
||||
//
|
||||
// Enable internal pull-up for the selected pins
|
||||
// Pull-ups can be enabled or disabled by the user.
|
||||
// This will enable the pullups for the specified pins.
|
||||
// Comment out other unwanted lines.
|
||||
//
|
||||
GpioCtrlRegs.GPAPUD.bit.GPIO6 = 0; // Enable pull-up on GPIO6 (EPWM4A)
|
||||
GpioCtrlRegs.GPAPUD.bit.GPIO7 = 0; // Enable pull-up on GPIO7 (EPWM4B)
|
||||
|
||||
//
|
||||
// Configure ePWM-4 pins using GPIO regs
|
||||
// This specifies which of the possible GPIO pins will be ePWM4 functional
|
||||
// pins. Comment out other unwanted lines.
|
||||
//
|
||||
GpioCtrlRegs.GPAMUX1.bit.GPIO6 = 1; // Configure GPIO6 as EPWM4A
|
||||
GpioCtrlRegs.GPAMUX1.bit.GPIO7 = 1; // Configure GPIO7 as EPWM4B
|
||||
|
||||
EDIS;
|
||||
}
|
||||
#endif // endif DSP28_EPWM4
|
||||
|
||||
#if DSP28_EPWM5
|
||||
//
|
||||
// InitEPwm5Gpio - This function initializes GPIO pins to function as ePWM5
|
||||
//
|
||||
void
|
||||
InitEPwm5Gpio(void)
|
||||
{
|
||||
EALLOW;
|
||||
|
||||
//
|
||||
// Enable internal pull-up for the selected pins
|
||||
// Pull-ups can be enabled or disabled by the user.
|
||||
// This will enable the pullups for the specified pins.
|
||||
// Comment out other unwanted lines.
|
||||
//
|
||||
GpioCtrlRegs.GPAPUD.bit.GPIO8 = 0; // Enable pull-up on GPIO8 (EPWM5A)
|
||||
GpioCtrlRegs.GPAPUD.bit.GPIO9 = 0; // Enable pull-up on GPIO9 (EPWM5B)
|
||||
|
||||
//
|
||||
// Configure ePWM-5 pins using GPIO regs
|
||||
// This specifies which of the possible GPIO pins will be ePWM5 functional
|
||||
// pins. Comment out other unwanted lines.
|
||||
//
|
||||
GpioCtrlRegs.GPAMUX1.bit.GPIO8 = 1; // Configure GPIO8 as EPWM5A
|
||||
GpioCtrlRegs.GPAMUX1.bit.GPIO9 = 1; // Configure GPIO9 as EPWM5B
|
||||
|
||||
EDIS;
|
||||
}
|
||||
#endif // endif DSP28_EPWM5
|
||||
|
||||
#if DSP28_EPWM6
|
||||
//
|
||||
// InitEPwm6Gpio - This function initializes GPIO pins to function as ePWM6
|
||||
//
|
||||
void
|
||||
InitEPwm6Gpio(void)
|
||||
{
|
||||
EALLOW;
|
||||
|
||||
//
|
||||
// Enable internal pull-up for the selected pins
|
||||
// Pull-ups can be enabled or disabled by the user.
|
||||
// This will enable the pullups for the specified pins.
|
||||
// Comment out other unwanted lines.
|
||||
//
|
||||
GpioCtrlRegs.GPAPUD.bit.GPIO10 = 0; // Enable pull-up on GPIO10 (EPWM6A)
|
||||
GpioCtrlRegs.GPAPUD.bit.GPIO11 = 0; // Enable pull-up on GPIO11 (EPWM6B)
|
||||
|
||||
//
|
||||
// Configure ePWM-6 pins using GPIO regs
|
||||
// This specifies which of the possible GPIO pins will be ePWM6 functional
|
||||
// pins. Comment out other unwanted lines.
|
||||
//
|
||||
GpioCtrlRegs.GPAMUX1.bit.GPIO10 = 1; // Configure GPIO10 as EPWM6A
|
||||
GpioCtrlRegs.GPAMUX1.bit.GPIO11 = 1; // Configure GPIO11 as EPWM6B
|
||||
|
||||
EDIS;
|
||||
}
|
||||
#endif // endif DSP28_EPWM6
|
||||
|
||||
//
|
||||
// InitEPwmSyncGpio - This function initializes GPIO pins to function as ePWM
|
||||
// Synch pins
|
||||
//
|
||||
void
|
||||
InitEPwmSyncGpio(void)
|
||||
{
|
||||
EALLOW;
|
||||
|
||||
//
|
||||
// Configure EPWMSYNCI
|
||||
//
|
||||
|
||||
//
|
||||
// Enable internal pull-up for the selected pins
|
||||
// Pull-ups can be enabled or disabled by the user.
|
||||
// This will enable the pullups for the specified pins.
|
||||
// Comment out other unwanted lines.
|
||||
//
|
||||
GpioCtrlRegs.GPAPUD.bit.GPIO6 = 0; //Enable pull-up on GPIO6 (EPWMSYNCI)
|
||||
//GpioCtrlRegs.GPBPUD.bit.GPIO32 = 0;//Enable pull-up on GPIO32 (EPWMSYNCI)
|
||||
|
||||
//
|
||||
// Set qualification for selected pins to asynch only
|
||||
// This will select synch to SYSCLKOUT for the selected pins.
|
||||
// Comment out other unwanted lines.
|
||||
//
|
||||
|
||||
//
|
||||
// Synch to SYSCLKOUT GPIO6 (EPWMSYNCI)
|
||||
//
|
||||
GpioCtrlRegs.GPAQSEL1.bit.GPIO6 = 0;
|
||||
|
||||
//
|
||||
//Synch to SYSCLKOUT GPIO32 (EPWMSYNCI)
|
||||
//
|
||||
//GpioCtrlRegs.GPBQSEL1.bit.GPIO32 = 0;
|
||||
|
||||
//
|
||||
// Configure EPwmSync pins using GPIO regs
|
||||
// This specifies which of the possible GPIO pins will be EPwmSync
|
||||
// functional pins. Comment out other unwanted lines.
|
||||
//
|
||||
GpioCtrlRegs.GPAMUX1.bit.GPIO6 = 2; //Enable pull-up on GPIO6(EPWMSYNCI)
|
||||
//GpioCtrlRegs.GPBMUX1.bit.GPIO32 = 2;//Enable pull-up on GPIO32(EPWMSYNCI)
|
||||
|
||||
//
|
||||
// Configure EPWMSYNC0
|
||||
//
|
||||
|
||||
//
|
||||
// Enable internal pull-up for the selected pins
|
||||
// Pull-ups can be enabled or disabled by the user.
|
||||
// This will enable the pullups for the specified pins.
|
||||
// Comment out other unwanted lines.
|
||||
//
|
||||
|
||||
//
|
||||
// Enable pull-up on GPIO6 (EPWMSYNC0)
|
||||
//
|
||||
//GpioCtrlRegs.GPAPUD.bit.GPIO6 = 0;
|
||||
|
||||
//
|
||||
// Enable pull-up on GPIO33 (EPWMSYNC0)
|
||||
//
|
||||
GpioCtrlRegs.GPBPUD.bit.GPIO33 = 0;
|
||||
|
||||
//
|
||||
// Enable pull-up on GPIO6 (EPWMSYNC0)
|
||||
//
|
||||
//GpioCtrlRegs.GPAMUX1.bit.GPIO6 = 3;
|
||||
|
||||
//
|
||||
// Enable pull-up on GPIO33 (EPWMSYNC0)
|
||||
//
|
||||
GpioCtrlRegs.GPBMUX1.bit.GPIO33 = 2;
|
||||
}
|
||||
|
||||
//
|
||||
// InitTzGpio - This function initializes GPIO pins to function as Trip Zone
|
||||
// (TZ) pins
|
||||
//
|
||||
// Each GPIO pin can be configured as a GPIO pin or up to 3 different
|
||||
// peripheral functional pins. By default all pins come up as GPIO
|
||||
// inputs after reset.
|
||||
//
|
||||
void
|
||||
InitTzGpio(void)
|
||||
{
|
||||
EALLOW;
|
||||
|
||||
//
|
||||
// Enable internal pull-up for the selected pins
|
||||
// Pull-ups can be enabled or disabled by the user.
|
||||
// This will enable the pullups for the specified pins.
|
||||
// Comment out other unwanted lines.
|
||||
//
|
||||
GpioCtrlRegs.GPAPUD.bit.GPIO12 = 0; // Enable pull-up on GPIO12 (TZ1)
|
||||
GpioCtrlRegs.GPAPUD.bit.GPIO13 = 0; // Enable pull-up on GPIO13 (TZ2)
|
||||
GpioCtrlRegs.GPAPUD.bit.GPIO14 = 0; // Enable pull-up on GPIO14 (TZ3)
|
||||
GpioCtrlRegs.GPAPUD.bit.GPIO15 = 0; // Enable pull-up on GPIO15 (TZ4)
|
||||
|
||||
GpioCtrlRegs.GPAPUD.bit.GPIO16 = 0; // Enable pull-up on GPIO16 (TZ5)
|
||||
//GpioCtrlRegs.GPAPUD.bit.GPIO28 = 0; // Enable pull-up on GPIO28 (TZ5)
|
||||
|
||||
GpioCtrlRegs.GPAPUD.bit.GPIO17 = 0; // Enable pull-up on GPIO17 (TZ6)
|
||||
//GpioCtrlRegs.GPAPUD.bit.GPIO29 = 0; // Enable pull-up on GPIO29 (TZ6)
|
||||
|
||||
//
|
||||
// Set qualification for selected pins to asynch only
|
||||
// Inputs are synchronized to SYSCLKOUT by default.
|
||||
// This will select asynch (no qualification) for the selected pins.
|
||||
// Comment out other unwanted lines.
|
||||
//
|
||||
GpioCtrlRegs.GPAQSEL1.bit.GPIO12 = 3; // Asynch input GPIO12 (TZ1)
|
||||
GpioCtrlRegs.GPAQSEL1.bit.GPIO13 = 3; // Asynch input GPIO13 (TZ2)
|
||||
GpioCtrlRegs.GPAQSEL1.bit.GPIO14 = 3; // Asynch input GPIO14 (TZ3)
|
||||
GpioCtrlRegs.GPAQSEL1.bit.GPIO15 = 3; // Asynch input GPIO15 (TZ4)
|
||||
|
||||
GpioCtrlRegs.GPAQSEL2.bit.GPIO16 = 3; // Asynch input GPIO16 (TZ5)
|
||||
//GpioCtrlRegs.GPAQSEL2.bit.GPIO28 = 3; // Asynch input GPIO28 (TZ5)
|
||||
|
||||
GpioCtrlRegs.GPAQSEL2.bit.GPIO17 = 3; // Asynch input GPIO17 (TZ6)
|
||||
//GpioCtrlRegs.GPAQSEL2.bit.GPIO29 = 3; // Asynch input GPIO29 (TZ6)
|
||||
|
||||
//
|
||||
// Configure TZ pins using GPIO regs
|
||||
// This specifies which of the possible GPIO pins will be TZ functional
|
||||
// pins. Comment out other unwanted lines.
|
||||
//
|
||||
GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 1; // Configure GPIO12 as TZ1
|
||||
GpioCtrlRegs.GPAMUX1.bit.GPIO13 = 1; // Configure GPIO13 as TZ2
|
||||
GpioCtrlRegs.GPAMUX1.bit.GPIO14 = 1; // Configure GPIO14 as TZ3
|
||||
GpioCtrlRegs.GPAMUX1.bit.GPIO15 = 1; // Configure GPIO15 as TZ4
|
||||
|
||||
GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 3; // Configure GPIO16 as TZ5
|
||||
//GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 3; // Configure GPIO28 as TZ5
|
||||
|
||||
GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 3; // Configure GPIO17 as TZ6
|
||||
//GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 3; // Configure GPIO29 as TZ6
|
||||
|
||||
EDIS;
|
||||
}
|
||||
|
||||
//
|
||||
// End of file
|
||||
//
|
||||
|
@ -0,0 +1,160 @@
|
||||
//###########################################################################
|
||||
//
|
||||
// FILE: DSP2833x_EQep.c
|
||||
//
|
||||
// TITLE: DSP2833x eQEP Initialization & Support Functions.
|
||||
//
|
||||
//###########################################################################
|
||||
// $TI Release: F2833x/F2823x Header Files and Peripheral Examples V142 $
|
||||
// $Release Date: November 1, 2016 $
|
||||
// $Copyright: Copyright (C) 2007-2016 Texas Instruments Incorporated -
|
||||
// http://www.ti.com/ ALL RIGHTS RESERVED $
|
||||
//###########################################################################
|
||||
|
||||
//
|
||||
// Included Files
|
||||
//
|
||||
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
|
||||
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File
|
||||
|
||||
//
|
||||
// InitEQep - This function initializes the eQEP(s) to a known state.
|
||||
//
|
||||
void
|
||||
InitEQep(void)
|
||||
{
|
||||
//
|
||||
// Initialize eQEP1/2
|
||||
//
|
||||
}
|
||||
|
||||
//
|
||||
// InitEQepGpio - This function initializes GPIO pins to function as eQEP pins
|
||||
//
|
||||
// Each GPIO pin can be configured as a GPIO pin or up to 3 different
|
||||
// peripheral functional pins. By default all pins come up as GPIO
|
||||
// inputs after reset.
|
||||
//
|
||||
// Caution:
|
||||
// For each eQEP peripheral
|
||||
// Only one GPIO pin should be enabled for EQEPxA operation.
|
||||
// Only one GPIO pin should be enabled for EQEPxB operation.
|
||||
// Only one GPIO pin should be enabled for EQEPxS operation.
|
||||
// Only one GPIO pin should be enabled for EQEPxI operation.
|
||||
// Comment out other unwanted lines.
|
||||
//
|
||||
void
|
||||
InitEQepGpio()
|
||||
{
|
||||
#if DSP28_EQEP1
|
||||
InitEQep1Gpio();
|
||||
#endif // endif DSP28_EQEP1
|
||||
#if DSP28_EQEP2
|
||||
InitEQep2Gpio();
|
||||
#endif // endif DSP28_EQEP2
|
||||
}
|
||||
|
||||
//
|
||||
// InitEQep1Gpio - This function initializes GPIO pins to function as eQEP1
|
||||
//
|
||||
#if DSP28_EQEP1
|
||||
void
|
||||
InitEQep1Gpio(void)
|
||||
{
|
||||
EALLOW;
|
||||
|
||||
//
|
||||
// Enable internal pull-up for the selected pins
|
||||
// Pull-ups can be enabled or disabled by the user.
|
||||
// This will enable the pullups for the specified pins.
|
||||
// Comment out other unwanted lines.
|
||||
//
|
||||
GpioCtrlRegs.GPAPUD.bit.GPIO20 = 0; // Enable pull-up on GPIO20 (EQEP1A)
|
||||
GpioCtrlRegs.GPAPUD.bit.GPIO21 = 0; // Enable pull-up on GPIO21 (EQEP1B)
|
||||
GpioCtrlRegs.GPAPUD.bit.GPIO22 = 0; // Enable pull-up on GPIO22 (EQEP1S)
|
||||
GpioCtrlRegs.GPAPUD.bit.GPIO23 = 0; // Enable pull-up on GPIO23 (EQEP1I)
|
||||
//GpioCtrlRegs.GPBPUD.bit.GPIO50 = 0; // Enable pull-up on GPIO50 (EQEP1A)
|
||||
//GpioCtrlRegs.GPBPUD.bit.GPIO51 = 0; // Enable pull-up on GPIO51 (EQEP1B)
|
||||
//GpioCtrlRegs.GPBPUD.bit.GPIO52 = 0; // Enable pull-up on GPIO52 (EQEP1S)
|
||||
//GpioCtrlRegs.GPBPUD.bit.GPIO53 = 0; // Enable pull-up on GPIO53 (EQEP1I)
|
||||
|
||||
//
|
||||
// Inputs are synchronized to SYSCLKOUT by default.
|
||||
// Comment out other unwanted lines.
|
||||
//
|
||||
GpioCtrlRegs.GPAQSEL2.bit.GPIO20 = 0; // Sync to SYSCLKOUT GPIO20 (EQEP1A)
|
||||
GpioCtrlRegs.GPAQSEL2.bit.GPIO21 = 0; // Sync to SYSCLKOUT GPIO21 (EQEP1B)
|
||||
GpioCtrlRegs.GPAQSEL2.bit.GPIO22 = 0; // Sync to SYSCLKOUT GPIO22 (EQEP1S)
|
||||
GpioCtrlRegs.GPAQSEL2.bit.GPIO23 = 0; // Sync to SYSCLKOUT GPIO23 (EQEP1I)
|
||||
|
||||
//GpioCtrlRegs.GPBQSEL2.bit.GPIO50 = 0; //Sync to SYSCLKOUT GPIO50(EQEP1A)
|
||||
//GpioCtrlRegs.GPBQSEL2.bit.GPIO51 = 0; //Sync to SYSCLKOUT GPIO51(EQEP1B)
|
||||
//GpioCtrlRegs.GPBQSEL2.bit.GPIO52 = 0; //Sync to SYSCLKOUT GPIO52(EQEP1S)
|
||||
//GpioCtrlRegs.GPBQSEL2.bit.GPIO53 = 0; //Sync to SYSCLKOUT GPIO53(EQEP1I)
|
||||
|
||||
//
|
||||
// Configure eQEP-1 pins using GPIO regs
|
||||
// This specifies which of the possible GPIO pins will be eQEP1 functional
|
||||
// pins. Comment out other unwanted lines.
|
||||
//
|
||||
GpioCtrlRegs.GPAMUX2.bit.GPIO20 = 1; // Configure GPIO20 as EQEP1A
|
||||
GpioCtrlRegs.GPAMUX2.bit.GPIO21 = 1; // Configure GPIO21 as EQEP1B
|
||||
GpioCtrlRegs.GPAMUX2.bit.GPIO22 = 1; // Configure GPIO22 as EQEP1S
|
||||
GpioCtrlRegs.GPAMUX2.bit.GPIO23 = 1; // Configure GPIO23 as EQEP1I
|
||||
|
||||
//GpioCtrlRegs.GPBMUX2.bit.GPIO50 = 1; // Configure GPIO50 as EQEP1A
|
||||
//GpioCtrlRegs.GPBMUX2.bit.GPIO51 = 1; // Configure GPIO51 as EQEP1B
|
||||
//GpioCtrlRegs.GPBMUX2.bit.GPIO52 = 1; // Configure GPIO52 as EQEP1S
|
||||
//GpioCtrlRegs.GPBMUX2.bit.GPIO53 = 1; // Configure GPIO53 as EQEP1I
|
||||
|
||||
EDIS;
|
||||
}
|
||||
#endif // if DSP28_EQEP1
|
||||
|
||||
//
|
||||
// InitEQep2Gpio - This function initializes GPIO pins to function as eQEP2
|
||||
//
|
||||
#if DSP28_EQEP2
|
||||
void
|
||||
InitEQep2Gpio(void)
|
||||
{
|
||||
EALLOW;
|
||||
|
||||
//
|
||||
// Enable internal pull-up for the selected pins
|
||||
// Pull-ups can be enabled or disabled by the user.
|
||||
// This will enable the pullups for the specified pins.
|
||||
// Comment out other unwanted lines.
|
||||
//
|
||||
GpioCtrlRegs.GPAPUD.bit.GPIO24 = 0; // Enable pull-up on GPIO24 (EQEP2A)
|
||||
GpioCtrlRegs.GPAPUD.bit.GPIO25 = 0; // Enable pull-up on GPIO25 (EQEP2B)
|
||||
GpioCtrlRegs.GPAPUD.bit.GPIO26 = 0; // Enable pull-up on GPIO26 (EQEP2I)
|
||||
GpioCtrlRegs.GPAPUD.bit.GPIO27 = 0; // Enable pull-up on GPIO27 (EQEP2S)
|
||||
|
||||
//
|
||||
// Inputs are synchronized to SYSCLKOUT by default.
|
||||
// Comment out other unwanted lines.
|
||||
//
|
||||
GpioCtrlRegs.GPAQSEL2.bit.GPIO24 = 0; // Sync to SYSCLKOUT GPIO24 (EQEP2A)
|
||||
GpioCtrlRegs.GPAQSEL2.bit.GPIO25 = 0; // Sync to SYSCLKOUT GPIO25 (EQEP2B)
|
||||
GpioCtrlRegs.GPAQSEL2.bit.GPIO26 = 0; // Sync to SYSCLKOUT GPIO26 (EQEP2I)
|
||||
GpioCtrlRegs.GPAQSEL2.bit.GPIO27 = 0; // Sync to SYSCLKOUT GPIO27 (EQEP2S)
|
||||
|
||||
//
|
||||
// Configure eQEP-2 pins using GPIO regs
|
||||
// This specifies which of the possible GPIO pins will be eQEP2 functional
|
||||
// pins. Comment out other unwanted lines.
|
||||
//
|
||||
GpioCtrlRegs.GPAMUX2.bit.GPIO24 = 2; // Configure GPIO24 as EQEP2A
|
||||
GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 2; // Configure GPIO25 as EQEP2B
|
||||
GpioCtrlRegs.GPAMUX2.bit.GPIO26 = 2; // Configure GPIO26 as EQEP2I
|
||||
GpioCtrlRegs.GPAMUX2.bit.GPIO27 = 2; // Configure GPIO27 as EQEP2S
|
||||
|
||||
EDIS;
|
||||
}
|
||||
#endif // endif DSP28_EQEP2
|
||||
|
||||
//
|
||||
// End of file
|
||||
//
|
||||
|
@ -0,0 +1,376 @@
|
||||
//###########################################################################
|
||||
//
|
||||
// FILE: DSP2833x_GlobalVariableDefs.c
|
||||
//
|
||||
// TITLE: DSP2833x Global Variables and Data Section Pragmas.
|
||||
//
|
||||
//###########################################################################
|
||||
// $TI Release: F2833x/F2823x Header Files and Peripheral Examples V142 $
|
||||
// $Release Date: November 1, 2016 $
|
||||
// $Copyright: Copyright (C) 2007-2016 Texas Instruments Incorporated -
|
||||
// http://www.ti.com/ ALL RIGHTS RESERVED $
|
||||
//###########################################################################
|
||||
|
||||
//
|
||||
// Included Files
|
||||
//
|
||||
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
|
||||
|
||||
//
|
||||
// Define Global Peripheral Variables
|
||||
//
|
||||
#ifdef __cplusplus
|
||||
#pragma DATA_SECTION("AdcRegsFile")
|
||||
#else
|
||||
#pragma DATA_SECTION(AdcRegs,"AdcRegsFile");
|
||||
#endif
|
||||
volatile struct ADC_REGS AdcRegs;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#pragma DATA_SECTION("AdcMirrorFile")
|
||||
#else
|
||||
#pragma DATA_SECTION(AdcMirror,"AdcMirrorFile");
|
||||
#endif
|
||||
volatile struct ADC_RESULT_MIRROR_REGS AdcMirror;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#pragma DATA_SECTION("CpuTimer0RegsFile")
|
||||
#else
|
||||
#pragma DATA_SECTION(CpuTimer0Regs,"CpuTimer0RegsFile");
|
||||
#endif
|
||||
volatile struct CPUTIMER_REGS CpuTimer0Regs;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#pragma DATA_SECTION("CpuTimer1RegsFile")
|
||||
#else
|
||||
#pragma DATA_SECTION(CpuTimer1Regs,"CpuTimer1RegsFile");
|
||||
#endif
|
||||
volatile struct CPUTIMER_REGS CpuTimer1Regs;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#pragma DATA_SECTION("CpuTimer2RegsFile")
|
||||
#else
|
||||
#pragma DATA_SECTION(CpuTimer2Regs,"CpuTimer2RegsFile");
|
||||
#endif
|
||||
volatile struct CPUTIMER_REGS CpuTimer2Regs;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#pragma DATA_SECTION("CsmPwlFile")
|
||||
#else
|
||||
#pragma DATA_SECTION(CsmPwl,"CsmPwlFile");
|
||||
#endif
|
||||
volatile struct CSM_PWL CsmPwl;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#pragma DATA_SECTION("CsmRegsFile")
|
||||
#else
|
||||
#pragma DATA_SECTION(CsmRegs,"CsmRegsFile");
|
||||
#endif
|
||||
volatile struct CSM_REGS CsmRegs;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#pragma DATA_SECTION("DevEmuRegsFile")
|
||||
#else
|
||||
#pragma DATA_SECTION(DevEmuRegs,"DevEmuRegsFile");
|
||||
#endif
|
||||
volatile struct DEV_EMU_REGS DevEmuRegs;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#pragma DATA_SECTION("DmaRegsFile")
|
||||
#else
|
||||
#pragma DATA_SECTION(DmaRegs,"DmaRegsFile");
|
||||
#endif
|
||||
volatile struct DMA_REGS DmaRegs;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#pragma DATA_SECTION("ECanaRegsFile")
|
||||
#else
|
||||
#pragma DATA_SECTION(ECanaRegs,"ECanaRegsFile");
|
||||
#endif
|
||||
volatile struct ECAN_REGS ECanaRegs;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#pragma DATA_SECTION("ECanaMboxesFile")
|
||||
#else
|
||||
#pragma DATA_SECTION(ECanaMboxes,"ECanaMboxesFile");
|
||||
#endif
|
||||
volatile struct ECAN_MBOXES ECanaMboxes;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#pragma DATA_SECTION("ECanaLAMRegsFile")
|
||||
#else
|
||||
#pragma DATA_SECTION(ECanaLAMRegs,"ECanaLAMRegsFile");
|
||||
#endif
|
||||
volatile struct LAM_REGS ECanaLAMRegs;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#pragma DATA_SECTION("ECanaMOTSRegsFile")
|
||||
#else
|
||||
#pragma DATA_SECTION(ECanaMOTSRegs,"ECanaMOTSRegsFile");
|
||||
#endif
|
||||
volatile struct MOTS_REGS ECanaMOTSRegs;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#pragma DATA_SECTION("ECanaMOTORegsFile")
|
||||
#else
|
||||
#pragma DATA_SECTION(ECanaMOTORegs,"ECanaMOTORegsFile");
|
||||
#endif
|
||||
volatile struct MOTO_REGS ECanaMOTORegs;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#pragma DATA_SECTION("ECanbRegsFile")
|
||||
#else
|
||||
#pragma DATA_SECTION(ECanbRegs,"ECanbRegsFile");
|
||||
#endif
|
||||
volatile struct ECAN_REGS ECanbRegs;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#pragma DATA_SECTION("ECanbMboxesFile")
|
||||
#else
|
||||
#pragma DATA_SECTION(ECanbMboxes,"ECanbMboxesFile");
|
||||
#endif
|
||||
volatile struct ECAN_MBOXES ECanbMboxes;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#pragma DATA_SECTION("ECanbLAMRegsFile")
|
||||
#else
|
||||
#pragma DATA_SECTION(ECanbLAMRegs,"ECanbLAMRegsFile");
|
||||
#endif
|
||||
volatile struct LAM_REGS ECanbLAMRegs;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#pragma DATA_SECTION("ECanbMOTSRegsFile")
|
||||
#else
|
||||
#pragma DATA_SECTION(ECanbMOTSRegs,"ECanbMOTSRegsFile");
|
||||
#endif
|
||||
volatile struct MOTS_REGS ECanbMOTSRegs;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#pragma DATA_SECTION("ECanbMOTORegsFile")
|
||||
#else
|
||||
#pragma DATA_SECTION(ECanbMOTORegs,"ECanbMOTORegsFile");
|
||||
#endif
|
||||
volatile struct MOTO_REGS ECanbMOTORegs;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#pragma DATA_SECTION("EPwm1RegsFile")
|
||||
#else
|
||||
#pragma DATA_SECTION(EPwm1Regs,"EPwm1RegsFile");
|
||||
#endif
|
||||
volatile struct EPWM_REGS EPwm1Regs;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#pragma DATA_SECTION("EPwm2RegsFile")
|
||||
#else
|
||||
#pragma DATA_SECTION(EPwm2Regs,"EPwm2RegsFile");
|
||||
#endif
|
||||
volatile struct EPWM_REGS EPwm2Regs;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#pragma DATA_SECTION("EPwm3RegsFile")
|
||||
#else
|
||||
#pragma DATA_SECTION(EPwm3Regs,"EPwm3RegsFile");
|
||||
#endif
|
||||
volatile struct EPWM_REGS EPwm3Regs;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#pragma DATA_SECTION("EPwm4RegsFile")
|
||||
#else
|
||||
#pragma DATA_SECTION(EPwm4Regs,"EPwm4RegsFile");
|
||||
#endif
|
||||
volatile struct EPWM_REGS EPwm4Regs;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#pragma DATA_SECTION("EPwm5RegsFile")
|
||||
#else
|
||||
#pragma DATA_SECTION(EPwm5Regs,"EPwm5RegsFile");
|
||||
#endif
|
||||
volatile struct EPWM_REGS EPwm5Regs;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#pragma DATA_SECTION("EPwm6RegsFile")
|
||||
#else
|
||||
#pragma DATA_SECTION(EPwm6Regs,"EPwm6RegsFile");
|
||||
#endif
|
||||
volatile struct EPWM_REGS EPwm6Regs;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#pragma DATA_SECTION("ECap1RegsFile")
|
||||
#else
|
||||
#pragma DATA_SECTION(ECap1Regs,"ECap1RegsFile");
|
||||
#endif
|
||||
volatile struct ECAP_REGS ECap1Regs;
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
#pragma DATA_SECTION("ECap2RegsFile")
|
||||
#else
|
||||
#pragma DATA_SECTION(ECap2Regs,"ECap2RegsFile");
|
||||
#endif
|
||||
volatile struct ECAP_REGS ECap2Regs;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#pragma DATA_SECTION("ECap3RegsFile")
|
||||
#else
|
||||
#pragma DATA_SECTION(ECap3Regs,"ECap3RegsFile");
|
||||
#endif
|
||||
volatile struct ECAP_REGS ECap3Regs;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#pragma DATA_SECTION("ECap4RegsFile")
|
||||
#else
|
||||
#pragma DATA_SECTION(ECap4Regs,"ECap4RegsFile");
|
||||
#endif
|
||||
volatile struct ECAP_REGS ECap4Regs;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#pragma DATA_SECTION("ECap5RegsFile")
|
||||
#else
|
||||
#pragma DATA_SECTION(ECap5Regs,"ECap5RegsFile");
|
||||
#endif
|
||||
volatile struct ECAP_REGS ECap5Regs;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#pragma DATA_SECTION("ECap6RegsFile")
|
||||
#else
|
||||
#pragma DATA_SECTION(ECap6Regs,"ECap6RegsFile");
|
||||
#endif
|
||||
volatile struct ECAP_REGS ECap6Regs;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#pragma DATA_SECTION("EQep1RegsFile")
|
||||
#else
|
||||
#pragma DATA_SECTION(EQep1Regs,"EQep1RegsFile");
|
||||
#endif
|
||||
volatile struct EQEP_REGS EQep1Regs;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#pragma DATA_SECTION("EQep2RegsFile")
|
||||
#else
|
||||
#pragma DATA_SECTION(EQep2Regs,"EQep2RegsFile");
|
||||
#endif
|
||||
volatile struct EQEP_REGS EQep2Regs;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#pragma DATA_SECTION("GpioCtrlRegsFile")
|
||||
#else
|
||||
#pragma DATA_SECTION(GpioCtrlRegs,"GpioCtrlRegsFile");
|
||||
#endif
|
||||
volatile struct GPIO_CTRL_REGS GpioCtrlRegs;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#pragma DATA_SECTION("GpioDataRegsFile")
|
||||
#else
|
||||
#pragma DATA_SECTION(GpioDataRegs,"GpioDataRegsFile");
|
||||
#endif
|
||||
volatile struct GPIO_DATA_REGS GpioDataRegs;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#pragma DATA_SECTION("GpioIntRegsFile")
|
||||
#else
|
||||
#pragma DATA_SECTION(GpioIntRegs,"GpioIntRegsFile");
|
||||
#endif
|
||||
volatile struct GPIO_INT_REGS GpioIntRegs;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#pragma DATA_SECTION("I2caRegsFile")
|
||||
#else
|
||||
#pragma DATA_SECTION(I2caRegs,"I2caRegsFile");
|
||||
#endif
|
||||
volatile struct I2C_REGS I2caRegs;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#pragma DATA_SECTION("McbspaRegsFile")
|
||||
#else
|
||||
#pragma DATA_SECTION(McbspaRegs,"McbspaRegsFile");
|
||||
#endif
|
||||
volatile struct MCBSP_REGS McbspaRegs;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#pragma DATA_SECTION("McbspbRegsFile")
|
||||
#else
|
||||
#pragma DATA_SECTION(McbspbRegs,"McbspbRegsFile");
|
||||
#endif
|
||||
volatile struct MCBSP_REGS McbspbRegs;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#pragma DATA_SECTION("PartIdRegsFile")
|
||||
#else
|
||||
#pragma DATA_SECTION(PartIdRegs,"PartIdRegsFile");
|
||||
#endif
|
||||
volatile struct PARTID_REGS PartIdRegs;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#pragma DATA_SECTION("PieCtrlRegsFile")
|
||||
#else
|
||||
#pragma DATA_SECTION(PieCtrlRegs,"PieCtrlRegsFile");
|
||||
#endif
|
||||
volatile struct PIE_CTRL_REGS PieCtrlRegs;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#pragma DATA_SECTION("PieVectTableFile")
|
||||
#else
|
||||
#pragma DATA_SECTION(PieVectTable,"PieVectTableFile");
|
||||
#endif
|
||||
volatile struct PIE_VECT_TABLE PieVectTable;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#pragma DATA_SECTION("SciaRegsFile")
|
||||
#else
|
||||
#pragma DATA_SECTION(SciaRegs,"SciaRegsFile");
|
||||
#endif
|
||||
volatile struct SCI_REGS SciaRegs;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#pragma DATA_SECTION("ScibRegsFile")
|
||||
#else
|
||||
#pragma DATA_SECTION(ScibRegs,"ScibRegsFile");
|
||||
#endif
|
||||
volatile struct SCI_REGS ScibRegs;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#pragma DATA_SECTION("ScicRegsFile")
|
||||
#else
|
||||
#pragma DATA_SECTION(ScicRegs,"ScicRegsFile");
|
||||
#endif
|
||||
volatile struct SCI_REGS ScicRegs;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#pragma DATA_SECTION("SpiaRegsFile")
|
||||
#else
|
||||
#pragma DATA_SECTION(SpiaRegs,"SpiaRegsFile");
|
||||
#endif
|
||||
volatile struct SPI_REGS SpiaRegs;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#pragma DATA_SECTION("SysCtrlRegsFile")
|
||||
#else
|
||||
#pragma DATA_SECTION(SysCtrlRegs,"SysCtrlRegsFile");
|
||||
#endif
|
||||
volatile struct SYS_CTRL_REGS SysCtrlRegs;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#pragma DATA_SECTION("FlashRegsFile")
|
||||
#else
|
||||
#pragma DATA_SECTION(FlashRegs,"FlashRegsFile");
|
||||
#endif
|
||||
volatile struct FLASH_REGS FlashRegs;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#pragma DATA_SECTION("XIntruptRegsFile")
|
||||
#else
|
||||
#pragma DATA_SECTION(XIntruptRegs,"XIntruptRegsFile");
|
||||
#endif
|
||||
volatile struct XINTRUPT_REGS XIntruptRegs;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#pragma DATA_SECTION("XintfRegsFile")
|
||||
#else
|
||||
#pragma DATA_SECTION(XintfRegs,"XintfRegsFile");
|
||||
#endif
|
||||
volatile struct XINTF_REGS XintfRegs;
|
||||
|
||||
//
|
||||
// End of file
|
||||
//
|
||||
|
@ -0,0 +1,77 @@
|
||||
//###########################################################################
|
||||
//
|
||||
// FILE: DSP2833x_Gpio.c
|
||||
//
|
||||
// TITLE: DSP2833x General Purpose I/O Initialization & Support Functions.
|
||||
//
|
||||
//###########################################################################
|
||||
// $TI Release: F2833x/F2823x Header Files and Peripheral Examples V142 $
|
||||
// $Release Date: November 1, 2016 $
|
||||
// $Copyright: Copyright (C) 2007-2016 Texas Instruments Incorporated -
|
||||
// http://www.ti.com/ ALL RIGHTS RESERVED $
|
||||
//###########################################################################
|
||||
|
||||
//
|
||||
// Included Files
|
||||
//
|
||||
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
|
||||
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File
|
||||
|
||||
//
|
||||
// InitGpio - This function initializes the Gpio to a known (default) state.
|
||||
//
|
||||
// For more details on configuring GPIO's as peripheral functions,
|
||||
// refer to the individual peripheral examples and/or GPIO setup example.
|
||||
//
|
||||
void
|
||||
InitGpio(void)
|
||||
{
|
||||
EALLOW;
|
||||
|
||||
//
|
||||
// Each GPIO pin can be:
|
||||
// a) a GPIO input/output
|
||||
// b) peripheral function 1
|
||||
// c) peripheral function 2
|
||||
// d) peripheral function 3
|
||||
// By default, all are GPIO Inputs
|
||||
//
|
||||
GpioCtrlRegs.GPAMUX1.all = 0x0000; // GPIO functionality GPIO0-GPIO15
|
||||
GpioCtrlRegs.GPAMUX2.all = 0x0000; // GPIO functionality GPIO16-GPIO31
|
||||
GpioCtrlRegs.GPBMUX1.all = 0x0000; // GPIO functionality GPIO32-GPIO39
|
||||
GpioCtrlRegs.GPBMUX2.all = 0x0000; // GPIO functionality GPIO48-GPIO63
|
||||
GpioCtrlRegs.GPCMUX1.all = 0x0000; // GPIO functionality GPIO64-GPIO79
|
||||
GpioCtrlRegs.GPCMUX2.all = 0x0000; // GPIO functionality GPIO80-GPIO95
|
||||
|
||||
GpioCtrlRegs.GPADIR.all = 0x0000; // GPIO0-GPIO31 are inputs
|
||||
GpioCtrlRegs.GPBDIR.all = 0x0000; // GPIO32-GPIO63 are inputs
|
||||
GpioCtrlRegs.GPCDIR.all = 0x0000; // GPI064-GPIO95 are inputs
|
||||
|
||||
//
|
||||
// Each input can have different qualification
|
||||
// a) input synchronized to SYSCLKOUT
|
||||
// b) input qualified by a sampling window
|
||||
// c) input sent asynchronously (valid for peripheral inputs only)
|
||||
//
|
||||
GpioCtrlRegs.GPAQSEL1.all = 0x0000; // GPIO0-GPIO15 Synch to SYSCLKOUT
|
||||
GpioCtrlRegs.GPAQSEL2.all = 0x0000; // GPIO16-GPIO31 Synch to SYSCLKOUT
|
||||
GpioCtrlRegs.GPBQSEL1.all = 0x0000; // GPIO32-GPIO39 Synch to SYSCLKOUT
|
||||
GpioCtrlRegs.GPBQSEL2.all = 0x0000; // GPIO48-GPIO63 Synch to SYSCLKOUT
|
||||
|
||||
//
|
||||
// Pull-ups can be enabled or disabled
|
||||
//
|
||||
GpioCtrlRegs.GPAPUD.all = 0x0000; // Pullup's enabled GPIO0-GPIO31
|
||||
GpioCtrlRegs.GPBPUD.all = 0x0000; // Pullup's enabled GPIO32-GPIO63
|
||||
GpioCtrlRegs.GPCPUD.all = 0x0000; // Pullup's enabled GPIO64-GPIO79
|
||||
//GpioCtrlRegs.GPAPUD.all = 0xFFFF; // Pullup's disabled GPIO0-GPIO31
|
||||
//GpioCtrlRegs.GPBPUD.all = 0xFFFF; // Pullup's disabled GPIO32-GPIO34
|
||||
//GpioCtrlRegs.GPCPUD.all = 0xFFFF; // Pullup's disabled GPIO64-GPIO79
|
||||
|
||||
EDIS;
|
||||
}
|
||||
|
||||
//
|
||||
// End of file
|
||||
//
|
||||
|
@ -0,0 +1,79 @@
|
||||
//###########################################################################
|
||||
//
|
||||
// FILE: DSP2833x_I2C.c
|
||||
//
|
||||
// TITLE: DSP2833x SCI Initialization & Support Functions.
|
||||
//
|
||||
//###########################################################################
|
||||
// $TI Release: F2833x/F2823x Header Files and Peripheral Examples V142 $
|
||||
// $Release Date: November 1, 2016 $
|
||||
// $Copyright: Copyright (C) 2007-2016 Texas Instruments Incorporated -
|
||||
// http://www.ti.com/ ALL RIGHTS RESERVED $
|
||||
//###########################################################################
|
||||
|
||||
//
|
||||
// Included Files
|
||||
//
|
||||
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
|
||||
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File
|
||||
|
||||
//
|
||||
// InitI2C - This function initializes the I2C to a known state.
|
||||
//
|
||||
void
|
||||
InitI2C(void)
|
||||
{
|
||||
//
|
||||
// Initialize I2C-A
|
||||
//
|
||||
}
|
||||
|
||||
//
|
||||
// InitI2CGpio - This function initializes GPIO pins to function as I2C pins
|
||||
//
|
||||
// Each GPIO pin can be configured as a GPIO pin or up to 3 different
|
||||
// peripheral functional pins. By default all pins come up as GPIO
|
||||
// inputs after reset.
|
||||
//
|
||||
// Caution:
|
||||
// Only one GPIO pin should be enabled for SDAA operation.
|
||||
// Only one GPIO pin shoudl be enabled for SCLA operation.
|
||||
// Comment out other unwanted lines.
|
||||
//
|
||||
void
|
||||
InitI2CGpio()
|
||||
{
|
||||
EALLOW;
|
||||
|
||||
//
|
||||
// Enable internal pull-up for the selected pins
|
||||
// Pull-ups can be enabled or disabled disabled by the user.
|
||||
// This will enable the pullups for the specified pins.
|
||||
// Comment out other unwanted lines.
|
||||
//
|
||||
GpioCtrlRegs.GPBPUD.bit.GPIO32 = 0; // Enable pull-up for GPIO32 (SDAA)
|
||||
GpioCtrlRegs.GPBPUD.bit.GPIO33 = 0; // Enable pull-up for GPIO33 (SCLA)
|
||||
|
||||
//
|
||||
// Set qualification for selected pins to asynch only
|
||||
// This will select asynch (no qualification) for the selected pins.
|
||||
// Comment out other unwanted lines.
|
||||
//
|
||||
GpioCtrlRegs.GPBQSEL1.bit.GPIO32 = 3; // Asynch input GPIO32 (SDAA)
|
||||
GpioCtrlRegs.GPBQSEL1.bit.GPIO33 = 3; // Asynch input GPIO33 (SCLA)
|
||||
|
||||
//
|
||||
// Configure SCI pins using GPIO regs
|
||||
// This specifies which of the possible GPIO pins will be I2C functional
|
||||
// pins. Comment out other unwanted lines.
|
||||
//
|
||||
GpioCtrlRegs.GPBMUX1.bit.GPIO32 = 1; // Configure GPIO32 to SDAA
|
||||
GpioCtrlRegs.GPBMUX1.bit.GPIO33 = 1; // Configure GPIO33 to SCLA
|
||||
|
||||
EDIS;
|
||||
}
|
||||
|
||||
//
|
||||
// End of file
|
||||
//
|
||||
|
@ -0,0 +1,50 @@
|
||||
//###########################################################################
|
||||
//
|
||||
// FILE: DSP2833x_MemCopy.c
|
||||
//
|
||||
// TITLE: Memory Copy Utility
|
||||
//
|
||||
// ASSUMPTIONS:
|
||||
//
|
||||
// DESCRIPTION:
|
||||
//
|
||||
// This function will copy the specified memory contents from
|
||||
// one location to another.
|
||||
//
|
||||
// Uint16 *SourceAddr Pointer to the first word to be moved
|
||||
// SourceAddr < SourceEndAddr
|
||||
// Uint16* SourceEndAddr Pointer to the last word to be moved
|
||||
// Uint16* DestAddr Pointer to the first destination word
|
||||
//
|
||||
// No checks are made for invalid memory locations or that the
|
||||
// end address is > then the first start address.
|
||||
//
|
||||
//###########################################################################
|
||||
// $TI Release: F2833x/F2823x Header Files and Peripheral Examples V142 $
|
||||
// $Release Date: November 1, 2016 $
|
||||
// $Copyright: Copyright (C) 2007-2016 Texas Instruments Incorporated -
|
||||
// http://www.ti.com/ ALL RIGHTS RESERVED $
|
||||
//###########################################################################
|
||||
|
||||
//
|
||||
// Included Files
|
||||
//
|
||||
#include "DSP2833x_Device.h"
|
||||
|
||||
//
|
||||
// MemCopy -
|
||||
//
|
||||
void
|
||||
MemCopy(Uint16 *SourceAddr, Uint16* SourceEndAddr, Uint16* DestAddr)
|
||||
{
|
||||
while(SourceAddr < SourceEndAddr)
|
||||
{
|
||||
*DestAddr++ = *SourceAddr++;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
// End of file
|
||||
//
|
||||
|
@ -0,0 +1,95 @@
|
||||
//###########################################################################
|
||||
//
|
||||
// FILE: DSP2833x_PieCtrl.c
|
||||
//
|
||||
// TITLE: DSP2833x Device PIE Control Register Initialization Functions.
|
||||
//
|
||||
//###########################################################################
|
||||
// $TI Release: F2833x/F2823x Header Files and Peripheral Examples V142 $
|
||||
// $Release Date: November 1, 2016 $
|
||||
// $Copyright: Copyright (C) 2007-2016 Texas Instruments Incorporated -
|
||||
// http://www.ti.com/ ALL RIGHTS RESERVED $
|
||||
//###########################################################################
|
||||
|
||||
//
|
||||
// Included Files
|
||||
//
|
||||
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
|
||||
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File
|
||||
|
||||
//
|
||||
// InitPieCtrl - This function initializes the PIE control registers to a known
|
||||
// state.
|
||||
//
|
||||
void
|
||||
InitPieCtrl(void)
|
||||
{
|
||||
//
|
||||
// Disable Interrupts at the CPU level
|
||||
//
|
||||
DINT;
|
||||
|
||||
//
|
||||
// Disable the PIE
|
||||
//
|
||||
PieCtrlRegs.PIECTRL.bit.ENPIE = 0;
|
||||
|
||||
//
|
||||
// Clear all PIEIER registers
|
||||
//
|
||||
PieCtrlRegs.PIEIER1.all = 0;
|
||||
PieCtrlRegs.PIEIER2.all = 0;
|
||||
PieCtrlRegs.PIEIER3.all = 0;
|
||||
PieCtrlRegs.PIEIER4.all = 0;
|
||||
PieCtrlRegs.PIEIER5.all = 0;
|
||||
PieCtrlRegs.PIEIER6.all = 0;
|
||||
PieCtrlRegs.PIEIER7.all = 0;
|
||||
PieCtrlRegs.PIEIER8.all = 0;
|
||||
PieCtrlRegs.PIEIER9.all = 0;
|
||||
PieCtrlRegs.PIEIER10.all = 0;
|
||||
PieCtrlRegs.PIEIER11.all = 0;
|
||||
PieCtrlRegs.PIEIER12.all = 0;
|
||||
|
||||
//
|
||||
// Clear all PIEIFR registers
|
||||
//
|
||||
PieCtrlRegs.PIEIFR1.all = 0;
|
||||
PieCtrlRegs.PIEIFR2.all = 0;
|
||||
PieCtrlRegs.PIEIFR3.all = 0;
|
||||
PieCtrlRegs.PIEIFR4.all = 0;
|
||||
PieCtrlRegs.PIEIFR5.all = 0;
|
||||
PieCtrlRegs.PIEIFR6.all = 0;
|
||||
PieCtrlRegs.PIEIFR7.all = 0;
|
||||
PieCtrlRegs.PIEIFR8.all = 0;
|
||||
PieCtrlRegs.PIEIFR9.all = 0;
|
||||
PieCtrlRegs.PIEIFR10.all = 0;
|
||||
PieCtrlRegs.PIEIFR11.all = 0;
|
||||
PieCtrlRegs.PIEIFR12.all = 0;
|
||||
}
|
||||
|
||||
//
|
||||
// EnableInterrupts - This function enables the PIE module and CPU interrupts
|
||||
//
|
||||
void
|
||||
EnableInterrupts()
|
||||
{
|
||||
//
|
||||
// Enable the PIE
|
||||
//
|
||||
PieCtrlRegs.PIECTRL.bit.ENPIE = 1;
|
||||
|
||||
//
|
||||
// Enables PIE to drive a pulse into the CPU
|
||||
//
|
||||
PieCtrlRegs.PIEACK.all = 0xFFFF;
|
||||
|
||||
//
|
||||
// Enable Interrupts at the CPU level
|
||||
//
|
||||
EINT;
|
||||
}
|
||||
|
||||
//
|
||||
// End of file
|
||||
//
|
||||
|
@ -0,0 +1,231 @@
|
||||
//###########################################################################
|
||||
//
|
||||
// FILE: DSP2833x_PieVect.c
|
||||
//
|
||||
// TITLE: DSP2833x Devices PIE Vector Table Initialization Functions.
|
||||
//
|
||||
//###########################################################################
|
||||
// $TI Release: F2833x/F2823x Header Files and Peripheral Examples V142 $
|
||||
// $Release Date: November 1, 2016 $
|
||||
// $Copyright: Copyright (C) 2007-2016 Texas Instruments Incorporated -
|
||||
// http://www.ti.com/ ALL RIGHTS RESERVED $
|
||||
//###########################################################################
|
||||
|
||||
//
|
||||
// Included Files
|
||||
//
|
||||
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
|
||||
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File
|
||||
|
||||
const struct PIE_VECT_TABLE PieVectTableInit =
|
||||
{
|
||||
PIE_RESERVED, // 0 Reserved space
|
||||
PIE_RESERVED, // 1 Reserved space
|
||||
PIE_RESERVED, // 2 Reserved space
|
||||
PIE_RESERVED, // 3 Reserved space
|
||||
PIE_RESERVED, // 4 Reserved space
|
||||
PIE_RESERVED, // 5 Reserved space
|
||||
PIE_RESERVED, // 6 Reserved space
|
||||
PIE_RESERVED, // 7 Reserved space
|
||||
PIE_RESERVED, // 8 Reserved space
|
||||
PIE_RESERVED, // 9 Reserved space
|
||||
PIE_RESERVED, // 10 Reserved space
|
||||
PIE_RESERVED, // 11 Reserved space
|
||||
PIE_RESERVED, // 12 Reserved space
|
||||
|
||||
//
|
||||
// Non-Peripheral Interrupts
|
||||
//
|
||||
INT13_ISR, // XINT13 or CPU-Timer 1
|
||||
INT14_ISR, // CPU-Timer2
|
||||
DATALOG_ISR, // Datalogging interrupt
|
||||
RTOSINT_ISR, // RTOS interrupt
|
||||
EMUINT_ISR, // Emulation interrupt
|
||||
NMI_ISR, // Non-maskable interrupt
|
||||
ILLEGAL_ISR, // Illegal operation TRAP
|
||||
USER1_ISR, // User Defined trap 1
|
||||
USER2_ISR, // User Defined trap 2
|
||||
USER3_ISR, // User Defined trap 3
|
||||
USER4_ISR, // User Defined trap 4
|
||||
USER5_ISR, // User Defined trap 5
|
||||
USER6_ISR, // User Defined trap 6
|
||||
USER7_ISR, // User Defined trap 7
|
||||
USER8_ISR, // User Defined trap 8
|
||||
USER9_ISR, // User Defined trap 9
|
||||
USER10_ISR, // User Defined trap 10
|
||||
USER11_ISR, // User Defined trap 11
|
||||
USER12_ISR, // User Defined trap 12
|
||||
|
||||
//
|
||||
// Group 1 PIE Vectors
|
||||
//
|
||||
SEQ1INT_ISR, // 1.1 ADC
|
||||
SEQ2INT_ISR, // 1.2 ADC
|
||||
rsvd_ISR, // 1.3
|
||||
XINT1_ISR, // 1.4
|
||||
XINT2_ISR, // 1.5
|
||||
ADCINT_ISR, // 1.6 ADC
|
||||
TINT0_ISR, // 1.7 Timer 0
|
||||
WAKEINT_ISR, // 1.8 WD, Low Power
|
||||
|
||||
//
|
||||
// Group 2 PIE Vectors
|
||||
//
|
||||
EPWM1_TZINT_ISR, // 2.1 EPWM-1 Trip Zone
|
||||
EPWM2_TZINT_ISR, // 2.2 EPWM-2 Trip Zone
|
||||
EPWM3_TZINT_ISR, // 2.3 EPWM-3 Trip Zone
|
||||
EPWM4_TZINT_ISR, // 2.4 EPWM-4 Trip Zone
|
||||
EPWM5_TZINT_ISR, // 2.5 EPWM-5 Trip Zone
|
||||
EPWM6_TZINT_ISR, // 2.6 EPWM-6 Trip Zone
|
||||
rsvd_ISR, // 2.7
|
||||
rsvd_ISR, // 2.8
|
||||
|
||||
//
|
||||
// Group 3 PIE Vectors
|
||||
//
|
||||
EPWM1_INT_ISR, // 3.1 EPWM-1 Interrupt
|
||||
EPWM2_INT_ISR, // 3.2 EPWM-2 Interrupt
|
||||
EPWM3_INT_ISR, // 3.3 EPWM-3 Interrupt
|
||||
EPWM4_INT_ISR, // 3.4 EPWM-4 Interrupt
|
||||
EPWM5_INT_ISR, // 3.5 EPWM-5 Interrupt
|
||||
EPWM6_INT_ISR, // 3.6 EPWM-6 Interrupt
|
||||
rsvd_ISR, // 3.7
|
||||
rsvd_ISR, // 3.8
|
||||
|
||||
//
|
||||
// Group 4 PIE Vectors
|
||||
//
|
||||
ECAP1_INT_ISR, // 4.1 ECAP-1
|
||||
ECAP2_INT_ISR, // 4.2 ECAP-2
|
||||
ECAP3_INT_ISR, // 4.3 ECAP-3
|
||||
ECAP4_INT_ISR, // 4.4 ECAP-4
|
||||
ECAP5_INT_ISR, // 4.5 ECAP-5
|
||||
ECAP6_INT_ISR, // 4.6 ECAP-6
|
||||
rsvd_ISR, // 4.7
|
||||
rsvd_ISR, // 4.8
|
||||
|
||||
//
|
||||
// Group 5 PIE Vectors
|
||||
//
|
||||
EQEP1_INT_ISR, // 5.1 EQEP-1
|
||||
EQEP2_INT_ISR, // 5.2 EQEP-2
|
||||
rsvd_ISR, // 5.3
|
||||
rsvd_ISR, // 5.4
|
||||
rsvd_ISR, // 5.5
|
||||
rsvd_ISR, // 5.6
|
||||
rsvd_ISR, // 5.7
|
||||
rsvd_ISR, // 5.8
|
||||
|
||||
//
|
||||
// Group 6 PIE Vectors
|
||||
//
|
||||
SPIRXINTA_ISR, // 6.1 SPI-A
|
||||
SPITXINTA_ISR, // 6.2 SPI-A
|
||||
MRINTA_ISR, // 6.3 McBSP-A
|
||||
MXINTA_ISR, // 6.4 McBSP-A
|
||||
MRINTB_ISR, // 6.5 McBSP-B
|
||||
MXINTB_ISR, // 6.6 McBSP-B
|
||||
rsvd_ISR, // 6.7
|
||||
rsvd_ISR, // 6.8
|
||||
|
||||
//
|
||||
// Group 7 PIE Vectors
|
||||
//
|
||||
DINTCH1_ISR, // 7.1 DMA channel 1
|
||||
DINTCH2_ISR, // 7.2 DMA channel 2
|
||||
DINTCH3_ISR, // 7.3 DMA channel 3
|
||||
DINTCH4_ISR, // 7.4 DMA channel 4
|
||||
DINTCH5_ISR, // 7.5 DMA channel 5
|
||||
DINTCH6_ISR, // 7.6 DMA channel 6
|
||||
rsvd_ISR, // 7.7
|
||||
rsvd_ISR, // 7.8
|
||||
|
||||
//
|
||||
// Group 8 PIE Vectors
|
||||
//
|
||||
I2CINT1A_ISR, // 8.1 I2C
|
||||
I2CINT2A_ISR, // 8.2 I2C
|
||||
rsvd_ISR, // 8.3
|
||||
rsvd_ISR, // 8.4
|
||||
SCIRXINTC_ISR, // 8.5 SCI-C
|
||||
SCITXINTC_ISR, // 8.6 SCI-C
|
||||
rsvd_ISR, // 8.7
|
||||
rsvd_ISR, // 8.8
|
||||
|
||||
//
|
||||
// Group 9 PIE Vectors
|
||||
//
|
||||
SCIRXINTA_ISR, // 9.1 SCI-A
|
||||
SCITXINTA_ISR, // 9.2 SCI-A
|
||||
SCIRXINTB_ISR, // 9.3 SCI-B
|
||||
SCITXINTB_ISR, // 9.4 SCI-B
|
||||
ECAN0INTA_ISR, // 9.5 eCAN-A
|
||||
ECAN1INTA_ISR, // 9.6 eCAN-A
|
||||
ECAN0INTB_ISR, // 9.7 eCAN-B
|
||||
ECAN1INTB_ISR, // 9.8 eCAN-B
|
||||
|
||||
//
|
||||
// Group 10 PIE Vectors
|
||||
//
|
||||
rsvd_ISR, // 10.1
|
||||
rsvd_ISR, // 10.2
|
||||
rsvd_ISR, // 10.3
|
||||
rsvd_ISR, // 10.4
|
||||
rsvd_ISR, // 10.5
|
||||
rsvd_ISR, // 10.6
|
||||
rsvd_ISR, // 10.7
|
||||
rsvd_ISR, // 10.8
|
||||
|
||||
//
|
||||
// Group 11 PIE Vectors
|
||||
//
|
||||
rsvd_ISR, // 11.1
|
||||
rsvd_ISR, // 11.2
|
||||
rsvd_ISR, // 11.3
|
||||
rsvd_ISR, // 11.4
|
||||
rsvd_ISR, // 11.5
|
||||
rsvd_ISR, // 11.6
|
||||
rsvd_ISR, // 11.7
|
||||
rsvd_ISR, // 11.8
|
||||
|
||||
//
|
||||
// Group 12 PIE Vectors
|
||||
//
|
||||
XINT3_ISR, // 12.1
|
||||
XINT4_ISR, // 12.2
|
||||
XINT5_ISR, // 12.3
|
||||
XINT6_ISR, // 12.4
|
||||
XINT7_ISR, // 12.5
|
||||
rsvd_ISR, // 12.6
|
||||
LVF_ISR, // 12.7
|
||||
LUF_ISR, // 12.8
|
||||
};
|
||||
|
||||
//
|
||||
// InitPieVectTable - This function initializes the PIE vector table to a known
|
||||
// state. This function must be executed after boot time.
|
||||
//
|
||||
void
|
||||
InitPieVectTable(void)
|
||||
{
|
||||
int16 i;
|
||||
Uint32 *Source = (void *) &PieVectTableInit;
|
||||
volatile Uint32 *Dest = (void *) &PieVectTable;
|
||||
|
||||
EALLOW;
|
||||
for(i=0; i < 128; i++)
|
||||
{
|
||||
*Dest++ = *Source++;
|
||||
}
|
||||
EDIS;
|
||||
|
||||
//
|
||||
// Enable the PIE Vector Table
|
||||
//
|
||||
PieCtrlRegs.PIECTRL.bit.ENPIE = 1;
|
||||
}
|
||||
|
||||
//
|
||||
// End of file
|
||||
//
|
||||
|
@ -0,0 +1,193 @@
|
||||
//###########################################################################
|
||||
//
|
||||
// FILE: DSP2833x_Sci.c
|
||||
//
|
||||
// TITLE: DSP2833x SCI Initialization & Support Functions.
|
||||
//
|
||||
//###########################################################################
|
||||
// $TI Release: F2833x/F2823x Header Files and Peripheral Examples V142 $
|
||||
// $Release Date: November 1, 2016 $
|
||||
// $Copyright: Copyright (C) 2007-2016 Texas Instruments Incorporated -
|
||||
// http://www.ti.com/ ALL RIGHTS RESERVED $
|
||||
//###########################################################################
|
||||
|
||||
//
|
||||
// Included Files
|
||||
//
|
||||
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
|
||||
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File
|
||||
|
||||
//
|
||||
// InitSci - This function initializes the SCI(s) to a known state.
|
||||
//
|
||||
void
|
||||
InitSci(void)
|
||||
{
|
||||
//
|
||||
// Initialize SCI-A
|
||||
//
|
||||
|
||||
//
|
||||
// Initialize SCI-B
|
||||
//
|
||||
|
||||
//
|
||||
// Initialize SCI-C
|
||||
//
|
||||
}
|
||||
|
||||
//
|
||||
// InitSciGpio - This function initializes GPIO to function as SCI-A, SCI-B, or
|
||||
// SCI-C
|
||||
//
|
||||
// Each GPIO pin can be configured as a GPIO pin or up to 3 different
|
||||
// peripheral functional pins. By default all pins come up as GPIO
|
||||
// inputs after reset.
|
||||
//
|
||||
// Caution:
|
||||
// Only one GPIO pin should be enabled for SCITXDA/B operation.
|
||||
// Only one GPIO pin shoudl be enabled for SCIRXDA/B operation.
|
||||
// Comment out other unwanted lines.
|
||||
//
|
||||
void
|
||||
InitSciGpio()
|
||||
{
|
||||
InitSciaGpio();
|
||||
#if DSP28_SCIB
|
||||
InitScibGpio();
|
||||
#endif // if DSP28_SCIB
|
||||
|
||||
#if DSP28_SCIC
|
||||
InitScicGpio();
|
||||
#endif // if DSP28_SCIC
|
||||
}
|
||||
|
||||
//
|
||||
// InitSciaGpio - This function initializes GPIO pins to function as SCI-A pins
|
||||
//
|
||||
void
|
||||
InitSciaGpio()
|
||||
{
|
||||
EALLOW;
|
||||
|
||||
//
|
||||
// Enable internal pull-up for the selected pins
|
||||
// Pull-ups can be enabled or disabled disabled by the user.
|
||||
// This will enable the pullups for the specified pins.
|
||||
//
|
||||
GpioCtrlRegs.GPAPUD.bit.GPIO28 = 0; // Enable pull-up for GPIO28 (SCIRXDA)
|
||||
GpioCtrlRegs.GPAPUD.bit.GPIO29 = 0; // Enable pull-up for GPIO29 (SCITXDA)
|
||||
|
||||
//
|
||||
// Set qualification for selected pins to asynch only
|
||||
// Inputs are synchronized to SYSCLKOUT by default.
|
||||
// This will select asynch (no qualification) for the selected pins.
|
||||
//
|
||||
GpioCtrlRegs.GPAQSEL2.bit.GPIO28 = 3; // Asynch input GPIO28 (SCIRXDA)
|
||||
|
||||
//
|
||||
// Configure SCI-A pins using GPIO regs
|
||||
// This specifies which of the possible GPIO pins will be SCI functional
|
||||
// pins.
|
||||
//
|
||||
GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 1; // Configure GPIO28 to SCIRXDA
|
||||
GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 1; // Configure GPIO29 to SCITXDA
|
||||
|
||||
EDIS;
|
||||
}
|
||||
|
||||
#if DSP28_SCIB
|
||||
//
|
||||
// InitScibGpio - This function initializes GPIO pins to function as SCI-B pins
|
||||
//
|
||||
void
|
||||
InitScibGpio()
|
||||
{
|
||||
EALLOW;
|
||||
|
||||
//
|
||||
// Enable internal pull-up for the selected pins
|
||||
// Pull-ups can be enabled or disabled disabled by the user.
|
||||
// This will enable the pullups for the specified pins.
|
||||
// Comment out other unwanted lines.
|
||||
//
|
||||
//GpioCtrlRegs.GPAPUD.bit.GPIO9 = 0; //Enable pull-up for GPIO9 (SCITXDB)
|
||||
//GpioCtrlRegs.GPAPUD.bit.GPIO14 = 0; //Enable pull-up for GPIO14 (SCITXDB)
|
||||
GpioCtrlRegs.GPAPUD.bit.GPIO18 = 0; //Enable pull-up for GPIO18 (SCITXDB)
|
||||
//GpioCtrlRegs.GPAPUD.bit.GPIO22 = 0; //Enable pull-up for GPIO22 (SCITXDB)
|
||||
|
||||
//GpioCtrlRegs.GPAPUD.bit.GPIO11 = 0; //Enable pull-up for GPIO11 (SCIRXDB)
|
||||
//GpioCtrlRegs.GPAPUD.bit.GPIO15 = 0; //Enable pull-up for GPIO15 (SCIRXDB)
|
||||
GpioCtrlRegs.GPAPUD.bit.GPIO19 = 0; //Enable pull-up for GPIO19 (SCIRXDB)
|
||||
//GpioCtrlRegs.GPAPUD.bit.GPIO23 = 0; //Enable pull-up for GPIO23 (SCIRXDB)
|
||||
|
||||
//
|
||||
// Set qualification for selected pins to asynch only
|
||||
// This will select asynch (no qualification) for the selected pins.
|
||||
// Comment out other unwanted lines.
|
||||
//
|
||||
//GpioCtrlRegs.GPAQSEL1.bit.GPIO11 = 3; // Asynch input GPIO11 (SCIRXDB)
|
||||
//GpioCtrlRegs.GPAQSEL1.bit.GPIO15 = 3; // Asynch input GPIO15 (SCIRXDB)
|
||||
GpioCtrlRegs.GPAQSEL2.bit.GPIO19 = 3; // Asynch input GPIO19 (SCIRXDB)
|
||||
//GpioCtrlRegs.GPAQSEL2.bit.GPIO23 = 3; // Asynch input GPIO23 (SCIRXDB)
|
||||
|
||||
//
|
||||
// Configure SCI-B pins using GPIO regs
|
||||
// This specifies which of the possible GPIO pins will be SCI functional
|
||||
// pins.
|
||||
// Comment out other unwanted lines.
|
||||
//
|
||||
//GpioCtrlRegs.GPAMUX1.bit.GPIO9 = 2; //Configure GPIO9 to SCITXDB
|
||||
//GpioCtrlRegs.GPAMUX1.bit.GPIO14 = 2; //Configure GPIO14 to SCITXDB
|
||||
GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 2; //Configure GPIO18 to SCITXDB
|
||||
//GpioCtrlRegs.GPAMUX2.bit.GPIO22 = 3; //Configure GPIO22 to SCITXDB
|
||||
|
||||
//GpioCtrlRegs.GPAMUX1.bit.GPIO11 = 2; //Configure GPIO11 for SCIRXDB
|
||||
//GpioCtrlRegs.GPAMUX1.bit.GPIO15 = 2; //Configure GPIO15 for SCIRXDB
|
||||
GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 2; //Configure GPIO19 for SCIRXDB
|
||||
//GpioCtrlRegs.GPAMUX2.bit.GPIO23 = 3; //Configure GPIO23 for SCIRXDB
|
||||
|
||||
EDIS;
|
||||
}
|
||||
#endif // if DSP28_SCIB
|
||||
|
||||
#if DSP28_SCIC
|
||||
//
|
||||
// InitScicGpio - This function initializes GPIO pins to function as SCI-C pins
|
||||
//
|
||||
void
|
||||
InitScicGpio()
|
||||
{
|
||||
EALLOW;
|
||||
|
||||
//
|
||||
// Enable internal pull-up for the selected pins
|
||||
// Pull-ups can be enabled or disabled disabled by the user.
|
||||
// This will enable the pullups for the specified pins.
|
||||
//
|
||||
GpioCtrlRegs.GPBPUD.bit.GPIO62 = 0; // Enable pull-up for GPIO62 (SCIRXDC)
|
||||
GpioCtrlRegs.GPBPUD.bit.GPIO63 = 0; // Enable pull-up for GPIO63 (SCITXDC)
|
||||
|
||||
//
|
||||
// Set qualification for selected pins to asynch only
|
||||
// Inputs are synchronized to SYSCLKOUT by default.
|
||||
// This will select asynch (no qualification) for the selected pins.
|
||||
//
|
||||
GpioCtrlRegs.GPBQSEL2.bit.GPIO62 = 3; // Asynch input GPIO62 (SCIRXDC)
|
||||
|
||||
//
|
||||
// Configure SCI-C pins using GPIO regs
|
||||
// This specifies which of the possible GPIO pins will be SCI functional
|
||||
// pins.
|
||||
//
|
||||
GpioCtrlRegs.GPBMUX2.bit.GPIO62 = 1; // Configure GPIO62 to SCIRXDC
|
||||
GpioCtrlRegs.GPBMUX2.bit.GPIO63 = 1; // Configure GPIO63 to SCITXDC
|
||||
|
||||
EDIS;
|
||||
}
|
||||
#endif // if DSP28_SCIC
|
||||
|
||||
//
|
||||
// End of file
|
||||
//
|
||||
|
@ -0,0 +1,113 @@
|
||||
//###########################################################################
|
||||
//
|
||||
// FILE: DSP2833x_Spi.c
|
||||
//
|
||||
// TITLE: DSP2833x SPI Initialization & Support Functions.
|
||||
//
|
||||
//###########################################################################
|
||||
// $TI Release: F2833x/F2823x Header Files and Peripheral Examples V142 $
|
||||
// $Release Date: November 1, 2016 $
|
||||
// $Copyright: Copyright (C) 2007-2016 Texas Instruments Incorporated -
|
||||
// http://www.ti.com/ ALL RIGHTS RESERVED $
|
||||
//###########################################################################
|
||||
|
||||
//
|
||||
// Included Files
|
||||
//
|
||||
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
|
||||
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File
|
||||
|
||||
//
|
||||
// InitSPI - This function initializes the SPI(s) to a known state.
|
||||
//
|
||||
void
|
||||
InitSpi(void)
|
||||
{
|
||||
//
|
||||
// Initialize SPI-A/B/C/D
|
||||
//
|
||||
}
|
||||
|
||||
//
|
||||
// InitSpiGpio - This function initializes GPIO pins to function as SPI pins
|
||||
//
|
||||
// Each GPIO pin can be configured as a GPIO pin or up to 3 different
|
||||
// peripheral functional pins. By default all pins come up as GPIO
|
||||
// inputs after reset.
|
||||
//
|
||||
// Caution:
|
||||
// For each SPI peripheral
|
||||
// Only one GPIO pin should be enabled for SPISOMO operation.
|
||||
// Only one GPIO pin should be enabled for SPISOMI operation.
|
||||
// Only one GPIO pin should be enabled for SPICLKA operation.
|
||||
// Only one GPIO pin should be enabled for SPISTEA operation.
|
||||
// Comment out other unwanted lines.
|
||||
//
|
||||
void
|
||||
InitSpiGpio()
|
||||
{
|
||||
InitSpiaGpio();
|
||||
}
|
||||
|
||||
//
|
||||
// InitSpiaGpio - This function initializes GPIO poins to function as SPI pins
|
||||
//
|
||||
void
|
||||
InitSpiaGpio()
|
||||
{
|
||||
EALLOW;
|
||||
|
||||
//
|
||||
// Enable internal pull-up for the selected pins
|
||||
// Pull-ups can be enabled or disabled by the user.
|
||||
// This will enable the pullups for the specified pins.
|
||||
// Comment out other unwanted lines.
|
||||
//
|
||||
GpioCtrlRegs.GPAPUD.bit.GPIO16 = 0; //Enable pull-up on GPIO16 (SPISIMOA)
|
||||
GpioCtrlRegs.GPAPUD.bit.GPIO17 = 0; //Enable pull-up on GPIO17 (SPISOMIA)
|
||||
GpioCtrlRegs.GPAPUD.bit.GPIO18 = 0; //Enable pull-up on GPIO18 (SPICLKA)
|
||||
GpioCtrlRegs.GPAPUD.bit.GPIO19 = 0; //Enable pull-up on GPIO19 (SPISTEA)
|
||||
|
||||
//GpioCtrlRegs.GPBPUD.bit.GPIO54 = 0; //Enable pull-up on GPIO54 (SPISIMOA)
|
||||
//GpioCtrlRegs.GPBPUD.bit.GPIO55 = 0; //Enable pull-up on GPIO55 (SPISOMIA)
|
||||
//GpioCtrlRegs.GPBPUD.bit.GPIO56 = 0; //Enable pull-up on GPIO56 (SPICLKA)
|
||||
//GpioCtrlRegs.GPBPUD.bit.GPIO57 = 0; //Enable pull-up on GPIO57 (SPISTEA)
|
||||
|
||||
//
|
||||
// Set qualification for selected pins to asynch only
|
||||
// This will select asynch (no qualification) for the selected pins.
|
||||
// Comment out other unwanted lines.
|
||||
//
|
||||
GpioCtrlRegs.GPAQSEL2.bit.GPIO16 = 3; // Asynch input GPIO16 (SPISIMOA)
|
||||
GpioCtrlRegs.GPAQSEL2.bit.GPIO17 = 3; // Asynch input GPIO17 (SPISOMIA)
|
||||
GpioCtrlRegs.GPAQSEL2.bit.GPIO18 = 3; // Asynch input GPIO18 (SPICLKA)
|
||||
GpioCtrlRegs.GPAQSEL2.bit.GPIO19 = 3; // Asynch input GPIO19 (SPISTEA)
|
||||
|
||||
//GpioCtrlRegs.GPBQSEL2.bit.GPIO54 = 3; // Asynch input GPIO16 (SPISIMOA)
|
||||
//GpioCtrlRegs.GPBQSEL2.bit.GPIO55 = 3; // Asynch input GPIO17 (SPISOMIA)
|
||||
//GpioCtrlRegs.GPBQSEL2.bit.GPIO56 = 3; // Asynch input GPIO18 (SPICLKA)
|
||||
//GpioCtrlRegs.GPBQSEL2.bit.GPIO57 = 3; // Asynch input GPIO19 (SPISTEA)
|
||||
|
||||
//
|
||||
// Configure SPI-A pins using GPIO regs
|
||||
// This specifies which of the possible GPIO pins will be SPI
|
||||
// functional pins.
|
||||
// Comment out other unwanted lines.
|
||||
//
|
||||
GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 1; // Configure GPIO16 as SPISIMOA
|
||||
GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 1; // Configure GPIO17 as SPISOMIA
|
||||
GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 1; // Configure GPIO18 as SPICLKA
|
||||
GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 1; // Configure GPIO19 as SPISTEA
|
||||
|
||||
//GpioCtrlRegs.GPBMUX2.bit.GPIO54 = 1; // Configure GPIO54 as SPISIMOA
|
||||
//GpioCtrlRegs.GPBMUX2.bit.GPIO55 = 1; // Configure GPIO55 as SPISOMIA
|
||||
//GpioCtrlRegs.GPBMUX2.bit.GPIO56 = 1; // Configure GPIO56 as SPICLKA
|
||||
//GpioCtrlRegs.GPBMUX2.bit.GPIO57 = 1; // Configure GPIO57 as SPISTEA
|
||||
|
||||
EDIS;
|
||||
}
|
||||
|
||||
//
|
||||
// End of file
|
||||
//
|
||||
|
@ -0,0 +1,422 @@
|
||||
//###########################################################################
|
||||
//
|
||||
// FILE: DSP2833x_SysCtrl.c
|
||||
//
|
||||
// TITLE: DSP2833x Device System Control Initialization & Support Functions.
|
||||
//
|
||||
// DESCRIPTION: Example initialization of system resources.
|
||||
//
|
||||
//###########################################################################
|
||||
// $TI Release: F2833x/F2823x Header Files and Peripheral Examples V142 $
|
||||
// $Release Date: November 1, 2016 $
|
||||
// $Copyright: Copyright (C) 2007-2016 Texas Instruments Incorporated -
|
||||
// http://www.ti.com/ ALL RIGHTS RESERVED $
|
||||
//###########################################################################
|
||||
|
||||
//
|
||||
// Included Files
|
||||
//
|
||||
#include "DSP2833x_Device.h" // Headerfile Include File
|
||||
#include "DSP2833x_Examples.h" // Examples Include File
|
||||
|
||||
//
|
||||
// Functions that will be run from RAM need to be assigned to
|
||||
// a different section. This section will then be mapped to a load and
|
||||
// run address using the linker cmd file.
|
||||
//
|
||||
#pragma CODE_SECTION(InitFlash, "ramfuncs");
|
||||
|
||||
//
|
||||
// InitSysCtrl - This function initializes the System Control registers to a
|
||||
// known state.
|
||||
// - Disables the watchdog
|
||||
// - Set the PLLCR for proper SYSCLKOUT frequency
|
||||
// - Set the pre-scaler for the high and low frequency peripheral clocks
|
||||
// - Enable the clocks to the peripherals
|
||||
//
|
||||
void
|
||||
InitSysCtrl(void)
|
||||
{
|
||||
//
|
||||
// Disable the watchdog
|
||||
//
|
||||
DisableDog();
|
||||
|
||||
//
|
||||
// Initialize the PLL control: PLLCR and DIVSEL
|
||||
// DSP28_PLLCR and DSP28_DIVSEL are defined in DSP2833x_Examples.h
|
||||
//
|
||||
InitPll(DSP28_PLLCR,DSP28_DIVSEL);
|
||||
|
||||
//
|
||||
// Initialize the peripheral clocks
|
||||
//
|
||||
InitPeripheralClocks();
|
||||
}
|
||||
|
||||
//
|
||||
// InitFlash - This function initializes the Flash Control registers
|
||||
// CAUTION
|
||||
// This function MUST be executed out of RAM. Executing it
|
||||
// out of OTP/Flash will yield unpredictable results
|
||||
//
|
||||
void
|
||||
InitFlash(void)
|
||||
{
|
||||
EALLOW;
|
||||
|
||||
//
|
||||
// Enable Flash Pipeline mode to improve performance
|
||||
// of code executed from Flash.
|
||||
//
|
||||
FlashRegs.FOPT.bit.ENPIPE = 1;
|
||||
|
||||
//
|
||||
// CAUTION
|
||||
// Minimum waitstates required for the flash operating
|
||||
// at a given CPU rate must be characterized by TI.
|
||||
// Refer to the datasheet for the latest information.
|
||||
//
|
||||
#if CPU_FRQ_150MHZ
|
||||
//
|
||||
// Set the Paged Waitstate for the Flash
|
||||
//
|
||||
FlashRegs.FBANKWAIT.bit.PAGEWAIT = 5;
|
||||
|
||||
//
|
||||
// Set the Random Waitstate for the Flash
|
||||
//
|
||||
FlashRegs.FBANKWAIT.bit.RANDWAIT = 5;
|
||||
|
||||
//
|
||||
// Set the Waitstate for the OTP
|
||||
//
|
||||
FlashRegs.FOTPWAIT.bit.OTPWAIT = 8;
|
||||
#endif
|
||||
|
||||
#if CPU_FRQ_100MHZ
|
||||
//
|
||||
// Set the Paged Waitstate for the Flash
|
||||
//
|
||||
FlashRegs.FBANKWAIT.bit.PAGEWAIT = 3;
|
||||
|
||||
//
|
||||
// Set the Random Waitstate for the Flash
|
||||
//
|
||||
FlashRegs.FBANKWAIT.bit.RANDWAIT = 3;
|
||||
|
||||
//
|
||||
// Set the Waitstate for the OTP
|
||||
//
|
||||
FlashRegs.FOTPWAIT.bit.OTPWAIT = 5;
|
||||
#endif
|
||||
//
|
||||
// CAUTION
|
||||
// ONLY THE DEFAULT VALUE FOR THESE 2 REGISTERS SHOULD BE USED
|
||||
//
|
||||
FlashRegs.FSTDBYWAIT.bit.STDBYWAIT = 0x01FF;
|
||||
FlashRegs.FACTIVEWAIT.bit.ACTIVEWAIT = 0x01FF;
|
||||
EDIS;
|
||||
|
||||
//
|
||||
// Force a pipeline flush to ensure that the write to
|
||||
// the last register configured occurs before returning.
|
||||
//
|
||||
asm(" RPT #7 || NOP");
|
||||
}
|
||||
|
||||
//
|
||||
// ServiceDog - This function resets the watchdog timer.
|
||||
// Enable this function for using ServiceDog in the application
|
||||
//
|
||||
void
|
||||
ServiceDog(void)
|
||||
{
|
||||
EALLOW;
|
||||
SysCtrlRegs.WDKEY = 0x0055;
|
||||
SysCtrlRegs.WDKEY = 0x00AA;
|
||||
EDIS;
|
||||
}
|
||||
|
||||
//
|
||||
// DisableDog - This function disables the watchdog timer.
|
||||
//
|
||||
void
|
||||
DisableDog(void)
|
||||
{
|
||||
EALLOW;
|
||||
SysCtrlRegs.WDCR= 0x0068;
|
||||
EDIS;
|
||||
}
|
||||
|
||||
//
|
||||
// InitPll - This function initializes the PLLCR register.
|
||||
//
|
||||
void
|
||||
InitPll(Uint16 val, Uint16 divsel)
|
||||
{
|
||||
//
|
||||
// Make sure the PLL is not running in limp mode
|
||||
//
|
||||
if (SysCtrlRegs.PLLSTS.bit.MCLKSTS != 0)
|
||||
{
|
||||
//
|
||||
// Missing external clock has been detected
|
||||
// Replace this line with a call to an appropriate
|
||||
// SystemShutdown(); function.
|
||||
//
|
||||
asm(" ESTOP0");
|
||||
}
|
||||
|
||||
//
|
||||
// DIVSEL MUST be 0 before PLLCR can be changed from
|
||||
// 0x0000. It is set to 0 by an external reset XRSn
|
||||
// This puts us in 1/4
|
||||
//
|
||||
if (SysCtrlRegs.PLLSTS.bit.DIVSEL != 0)
|
||||
{
|
||||
EALLOW;
|
||||
SysCtrlRegs.PLLSTS.bit.DIVSEL = 0;
|
||||
EDIS;
|
||||
}
|
||||
|
||||
//
|
||||
// Change the PLLCR
|
||||
//
|
||||
if (SysCtrlRegs.PLLCR.bit.DIV != val)
|
||||
{
|
||||
EALLOW;
|
||||
|
||||
//
|
||||
// Before setting PLLCR turn off missing clock detect logic
|
||||
//
|
||||
SysCtrlRegs.PLLSTS.bit.MCLKOFF = 1;
|
||||
SysCtrlRegs.PLLCR.bit.DIV = val;
|
||||
EDIS;
|
||||
|
||||
//
|
||||
// Optional: Wait for PLL to lock.
|
||||
// During this time the CPU will switch to OSCCLK/2 until
|
||||
// the PLL is stable. Once the PLL is stable the CPU will
|
||||
// switch to the new PLL value.
|
||||
//
|
||||
// This time-to-lock is monitored by a PLL lock counter.
|
||||
//
|
||||
// Code is not required to sit and wait for the PLL to lock.
|
||||
// However, if the code does anything that is timing critical,
|
||||
// and requires the correct clock be locked, then it is best to
|
||||
// wait until this switching has completed.
|
||||
//
|
||||
|
||||
//
|
||||
// Wait for the PLL lock bit to be set.
|
||||
//
|
||||
|
||||
//
|
||||
// The watchdog should be disabled before this loop, or fed within
|
||||
// the loop via ServiceDog().
|
||||
//
|
||||
|
||||
//
|
||||
// Uncomment to disable the watchdog
|
||||
//
|
||||
DisableDog();
|
||||
|
||||
while(SysCtrlRegs.PLLSTS.bit.PLLLOCKS != 1)
|
||||
{
|
||||
//
|
||||
// Uncomment to service the watchdog
|
||||
//
|
||||
//ServiceDog();
|
||||
}
|
||||
|
||||
EALLOW;
|
||||
SysCtrlRegs.PLLSTS.bit.MCLKOFF = 0;
|
||||
EDIS;
|
||||
}
|
||||
|
||||
//
|
||||
// If switching to 1/2
|
||||
//
|
||||
if((divsel == 1)||(divsel == 2))
|
||||
{
|
||||
EALLOW;
|
||||
SysCtrlRegs.PLLSTS.bit.DIVSEL = divsel;
|
||||
EDIS;
|
||||
}
|
||||
|
||||
//
|
||||
// NOTE: ONLY USE THIS SETTING IF PLL IS BYPASSED (I.E. PLLCR = 0) OR OFF
|
||||
// If switching to 1/1
|
||||
// * First go to 1/2 and let the power settle
|
||||
// The time required will depend on the system, this is only an example
|
||||
// * Then switch to 1/1
|
||||
//
|
||||
if(divsel == 3)
|
||||
{
|
||||
EALLOW;
|
||||
SysCtrlRegs.PLLSTS.bit.DIVSEL = 2;
|
||||
DELAY_US(50L);
|
||||
SysCtrlRegs.PLLSTS.bit.DIVSEL = 3;
|
||||
EDIS;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// InitPeripheralClocks - This function initializes the clocks to the
|
||||
// peripheral modules. First the high and low clock prescalers are set
|
||||
// Second the clocks are enabled to each peripheral. To reduce power, leave
|
||||
// clocks to unused peripherals disabled
|
||||
//
|
||||
// Note: If a peripherals clock is not enabled then you cannot
|
||||
// read or write to the registers for that peripheral
|
||||
//
|
||||
void
|
||||
InitPeripheralClocks(void)
|
||||
{
|
||||
EALLOW;
|
||||
|
||||
//
|
||||
// HISPCP/LOSPCP prescale register settings, normally it will be set to
|
||||
// default values
|
||||
//
|
||||
SysCtrlRegs.HISPCP.all = 0x0001;
|
||||
SysCtrlRegs.LOSPCP.all = 0x0002;
|
||||
|
||||
//
|
||||
// XCLKOUT to SYSCLKOUT ratio. By default XCLKOUT = 1/4 SYSCLKOUT
|
||||
// XTIMCLK = SYSCLKOUT/2
|
||||
//
|
||||
XintfRegs.XINTCNF2.bit.XTIMCLK = 1;
|
||||
|
||||
//
|
||||
// XCLKOUT = XTIMCLK/2
|
||||
//
|
||||
XintfRegs.XINTCNF2.bit.CLKMODE = 1;
|
||||
|
||||
//
|
||||
// Enable XCLKOUT
|
||||
//
|
||||
XintfRegs.XINTCNF2.bit.CLKOFF = 0;
|
||||
|
||||
//
|
||||
// Peripheral clock enables set for the selected peripherals.
|
||||
// If you are not using a peripheral leave the clock off
|
||||
// to save on power.
|
||||
//
|
||||
// Note: not all peripherals are available on all 2833x derivates.
|
||||
// Refer to the datasheet for your particular device.
|
||||
//
|
||||
// This function is not written to be an example of efficient code.
|
||||
//
|
||||
SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1; // ADC
|
||||
|
||||
//
|
||||
// *IMPORTANT*
|
||||
// The ADC_cal function, which copies the ADC calibration values from TI
|
||||
// reserved OTP into the ADCREFSEL and ADCOFFTRIM registers, occurs
|
||||
// automatically in the Boot ROM. If the boot ROM code is bypassed during
|
||||
// the debug process, the following function MUST be called for the ADC to
|
||||
// function according to specification. The clocks to the ADC MUST be
|
||||
// enabled before calling this function.
|
||||
// See the device data manual and/or the ADC Reference
|
||||
// Manual for more information.
|
||||
//
|
||||
ADC_cal();
|
||||
|
||||
SysCtrlRegs.PCLKCR0.bit.I2CAENCLK = 1; // I2C
|
||||
SysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1; // SCI-A
|
||||
SysCtrlRegs.PCLKCR0.bit.SCIBENCLK = 1; // SCI-B
|
||||
SysCtrlRegs.PCLKCR0.bit.SCICENCLK = 1; // SCI-C
|
||||
SysCtrlRegs.PCLKCR0.bit.SPIAENCLK = 1; // SPI-A
|
||||
SysCtrlRegs.PCLKCR0.bit.MCBSPAENCLK = 1; // McBSP-A
|
||||
SysCtrlRegs.PCLKCR0.bit.MCBSPBENCLK = 1; // McBSP-B
|
||||
SysCtrlRegs.PCLKCR0.bit.ECANAENCLK=1; // eCAN-A
|
||||
SysCtrlRegs.PCLKCR0.bit.ECANBENCLK=1; // eCAN-B
|
||||
|
||||
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0; // Disable TBCLK within the ePWM
|
||||
SysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK = 1; // ePWM1
|
||||
SysCtrlRegs.PCLKCR1.bit.EPWM2ENCLK = 1; // ePWM2
|
||||
SysCtrlRegs.PCLKCR1.bit.EPWM3ENCLK = 1; // ePWM3
|
||||
SysCtrlRegs.PCLKCR1.bit.EPWM4ENCLK = 1; // ePWM4
|
||||
SysCtrlRegs.PCLKCR1.bit.EPWM5ENCLK = 1; // ePWM5
|
||||
SysCtrlRegs.PCLKCR1.bit.EPWM6ENCLK = 1; // ePWM6
|
||||
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1; // Enable TBCLK within the ePWM
|
||||
|
||||
SysCtrlRegs.PCLKCR1.bit.ECAP3ENCLK = 1; // eCAP3
|
||||
SysCtrlRegs.PCLKCR1.bit.ECAP4ENCLK = 1; // eCAP4
|
||||
SysCtrlRegs.PCLKCR1.bit.ECAP5ENCLK = 1; // eCAP5
|
||||
SysCtrlRegs.PCLKCR1.bit.ECAP6ENCLK = 1; // eCAP6
|
||||
SysCtrlRegs.PCLKCR1.bit.ECAP1ENCLK = 1; // eCAP1
|
||||
SysCtrlRegs.PCLKCR1.bit.ECAP2ENCLK = 1; // eCAP2
|
||||
SysCtrlRegs.PCLKCR1.bit.EQEP1ENCLK = 1; // eQEP1
|
||||
SysCtrlRegs.PCLKCR1.bit.EQEP2ENCLK = 1; // eQEP2
|
||||
|
||||
SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1; // CPU Timer 0
|
||||
SysCtrlRegs.PCLKCR3.bit.CPUTIMER1ENCLK = 1; // CPU Timer 1
|
||||
SysCtrlRegs.PCLKCR3.bit.CPUTIMER2ENCLK = 1; // CPU Timer 2
|
||||
|
||||
SysCtrlRegs.PCLKCR3.bit.DMAENCLK = 1; // DMA Clock
|
||||
SysCtrlRegs.PCLKCR3.bit.XINTFENCLK = 1; // XTIMCLK
|
||||
SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1; // GPIO input clock
|
||||
|
||||
EDIS;
|
||||
}
|
||||
|
||||
//
|
||||
// CsmUnlock - This function unlocks the CSM. User must replace 0xFFFF's with
|
||||
// current password for the DSP. Returns 1 if unlock is successful.
|
||||
//
|
||||
#define STATUS_FAIL 0
|
||||
#define STATUS_SUCCESS 1
|
||||
Uint16
|
||||
CsmUnlock()
|
||||
{
|
||||
volatile Uint16 temp;
|
||||
|
||||
//
|
||||
// Load the key registers with the current password. The 0xFFFF's are dummy
|
||||
// passwords. User should replace them with the correct password for the
|
||||
// DSP.
|
||||
//
|
||||
EALLOW;
|
||||
CsmRegs.KEY0 = 0xFFFF;
|
||||
CsmRegs.KEY1 = 0xFFFF;
|
||||
CsmRegs.KEY2 = 0xFFFF;
|
||||
CsmRegs.KEY3 = 0xFFFF;
|
||||
CsmRegs.KEY4 = 0xFFFF;
|
||||
CsmRegs.KEY5 = 0xFFFF;
|
||||
CsmRegs.KEY6 = 0xFFFF;
|
||||
CsmRegs.KEY7 = 0xFFFF;
|
||||
EDIS;
|
||||
|
||||
//
|
||||
// Perform a dummy read of the password locations if they match the key
|
||||
// values, the CSM will unlock
|
||||
//
|
||||
temp = CsmPwl.PSWD0;
|
||||
temp = CsmPwl.PSWD1;
|
||||
temp = CsmPwl.PSWD2;
|
||||
temp = CsmPwl.PSWD3;
|
||||
temp = CsmPwl.PSWD4;
|
||||
temp = CsmPwl.PSWD5;
|
||||
temp = CsmPwl.PSWD6;
|
||||
temp = CsmPwl.PSWD7;
|
||||
|
||||
//
|
||||
// If the CSM unlocked, return succes, otherwise return failure.
|
||||
//
|
||||
if (CsmRegs.CSMSCR.bit.SECURE == 0)
|
||||
{
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
else
|
||||
{
|
||||
return STATUS_FAIL;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// End of file
|
||||
//
|
||||
|
@ -0,0 +1,303 @@
|
||||
//###########################################################################
|
||||
//
|
||||
// FILE: DSP2833x_Xintf.c
|
||||
//
|
||||
// TITLE: DSP2833x Device External Interface Init & Support Functions.
|
||||
//
|
||||
// DESCRIPTION:
|
||||
//
|
||||
// Example initialization function for the external interface (XINTF).
|
||||
// This example configures the XINTF to its default state. For an
|
||||
// example of how this function being used refer to the
|
||||
// examples/run_from_xintf project.
|
||||
//
|
||||
//###########################################################################
|
||||
// $TI Release: F2833x/F2823x Header Files and Peripheral Examples V142 $
|
||||
// $Release Date: November 1, 2016 $
|
||||
// $Copyright: Copyright (C) 2007-2016 Texas Instruments Incorporated -
|
||||
// http://www.ti.com/ ALL RIGHTS RESERVED $
|
||||
//###########################################################################
|
||||
|
||||
//
|
||||
// Included Files
|
||||
//
|
||||
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
|
||||
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File
|
||||
|
||||
//
|
||||
// InitXINTF - This function initializes the External Interface the default
|
||||
// reset state.
|
||||
//
|
||||
// Do not modify the timings of the XINTF while running from the XINTF. Doing
|
||||
// so can yield unpredictable results
|
||||
//
|
||||
void
|
||||
InitXintf(void)
|
||||
{
|
||||
//
|
||||
// This shows how to write to the XINTF registers. The
|
||||
// values used here are the default state after reset.
|
||||
// Different hardware will require a different configuration.
|
||||
//
|
||||
|
||||
//
|
||||
// For an example of an XINTF configuration used with the
|
||||
// F28335 eZdsp, refer to the examples/run_from_xintf project.
|
||||
//
|
||||
|
||||
//
|
||||
// Any changes to XINTF timing should only be made by code
|
||||
// running outside of the XINTF.
|
||||
//
|
||||
|
||||
//
|
||||
// All Zones
|
||||
// Timing for all zones based on XTIMCLK = 1/2 SYSCLKOUT
|
||||
//
|
||||
EALLOW;
|
||||
XintfRegs.XINTCNF2.bit.XTIMCLK = 1;
|
||||
|
||||
//
|
||||
// No write buffering
|
||||
//
|
||||
XintfRegs.XINTCNF2.bit.WRBUFF = 0;
|
||||
|
||||
//
|
||||
// XCLKOUT is enabled
|
||||
//
|
||||
XintfRegs.XINTCNF2.bit.CLKOFF = 0;
|
||||
|
||||
//
|
||||
// XCLKOUT = XTIMCLK/2
|
||||
//
|
||||
XintfRegs.XINTCNF2.bit.CLKMODE = 1;
|
||||
|
||||
//
|
||||
// Zone 0
|
||||
// When using ready, ACTIVE must be 1 or greater
|
||||
// Lead must always be 1 or greater
|
||||
// Zone write timing
|
||||
//
|
||||
XintfRegs.XTIMING0.bit.XWRLEAD = 3;
|
||||
XintfRegs.XTIMING0.bit.XWRACTIVE = 5;
|
||||
XintfRegs.XTIMING0.bit.XWRTRAIL = 1;
|
||||
|
||||
//
|
||||
// Zone read timing
|
||||
//
|
||||
XintfRegs.XTIMING0.bit.XRDLEAD = 3;
|
||||
XintfRegs.XTIMING0.bit.XRDACTIVE = 5;
|
||||
XintfRegs.XTIMING0.bit.XRDTRAIL = 1;
|
||||
|
||||
//
|
||||
// double all Zone read/write lead/active/trail timing
|
||||
//
|
||||
XintfRegs.XTIMING0.bit.X2TIMING = 1;
|
||||
|
||||
//
|
||||
// Zone will sample XREADY signal
|
||||
//
|
||||
XintfRegs.XTIMING0.bit.USEREADY = 1;
|
||||
XintfRegs.XTIMING0.bit.READYMODE = 1; // sample asynchronous
|
||||
|
||||
//
|
||||
// Size must be either:
|
||||
// 0,1 = x32 or
|
||||
// 1,1 = x16 other values are reserved
|
||||
//
|
||||
XintfRegs.XTIMING0.bit.XSIZE = 3;
|
||||
|
||||
//
|
||||
// Zone 6
|
||||
// When using ready, ACTIVE must be 1 or greater
|
||||
// Lead must always be 1 or greater
|
||||
// Zone write timing
|
||||
//
|
||||
XintfRegs.XTIMING6.bit.XWRLEAD = 3;
|
||||
XintfRegs.XTIMING6.bit.XWRACTIVE = 5;
|
||||
XintfRegs.XTIMING6.bit.XWRTRAIL = 1;
|
||||
|
||||
//
|
||||
// Zone read timing
|
||||
//
|
||||
XintfRegs.XTIMING6.bit.XRDLEAD = 3;
|
||||
XintfRegs.XTIMING6.bit.XRDACTIVE = 5;
|
||||
XintfRegs.XTIMING6.bit.XRDTRAIL = 1;
|
||||
|
||||
//
|
||||
// double all Zone read/write lead/active/trail timing
|
||||
//
|
||||
XintfRegs.XTIMING6.bit.X2TIMING = 1;
|
||||
|
||||
//
|
||||
// Zone will sample XREADY signal
|
||||
//
|
||||
XintfRegs.XTIMING6.bit.USEREADY = 0;
|
||||
XintfRegs.XTIMING6.bit.READYMODE = 0; // sample asynchronous
|
||||
|
||||
//
|
||||
// Size must be either:
|
||||
// 0,1 = x32 or
|
||||
// 1,1 = x16 other values are reserved
|
||||
//
|
||||
XintfRegs.XTIMING6.bit.XSIZE = 3;
|
||||
|
||||
//
|
||||
// Zone 7
|
||||
// When using ready, ACTIVE must be 1 or greater
|
||||
// Lead must always be 1 or greater
|
||||
// Zone write timing
|
||||
//
|
||||
XintfRegs.XTIMING7.bit.XWRLEAD = 3;
|
||||
XintfRegs.XTIMING7.bit.XWRACTIVE = 7;
|
||||
XintfRegs.XTIMING7.bit.XWRTRAIL = 3;
|
||||
|
||||
//
|
||||
// Zone read timing
|
||||
//
|
||||
XintfRegs.XTIMING7.bit.XRDLEAD = 3;
|
||||
XintfRegs.XTIMING7.bit.XRDACTIVE = 7;
|
||||
XintfRegs.XTIMING7.bit.XRDTRAIL = 3;
|
||||
|
||||
//
|
||||
// double all Zone read/write lead/active/trail timing
|
||||
//
|
||||
XintfRegs.XTIMING7.bit.X2TIMING = 1;
|
||||
|
||||
//
|
||||
// Zone will sample XREADY signal
|
||||
//
|
||||
XintfRegs.XTIMING7.bit.USEREADY = 1;
|
||||
XintfRegs.XTIMING7.bit.READYMODE = 1; // sample asynchronous
|
||||
|
||||
//
|
||||
// Size must be either:
|
||||
// 0,1 = x32 or
|
||||
// 1,1 = x16 other values are reserved
|
||||
//
|
||||
XintfRegs.XTIMING7.bit.XSIZE = 3;
|
||||
|
||||
//
|
||||
// Bank switching
|
||||
// Assume Zone 7 is slow, so add additional BCYC cycles
|
||||
// when ever switching from Zone 7 to another Zone.
|
||||
// This will help avoid bus contention.
|
||||
//
|
||||
XintfRegs.XBANK.bit.BANK = 7;
|
||||
XintfRegs.XBANK.bit.BCYC = 7;
|
||||
EDIS;
|
||||
|
||||
//
|
||||
// Force a pipeline flush to ensure that the write to the last register
|
||||
// configured occurs before returning.
|
||||
//
|
||||
InitXintf16Gpio();
|
||||
//InitXintf32Gpio();
|
||||
|
||||
asm(" RPT #7 || NOP");
|
||||
}
|
||||
|
||||
//
|
||||
// InitXintf32Gpio -
|
||||
//
|
||||
void
|
||||
InitXintf32Gpio()
|
||||
{
|
||||
EALLOW;
|
||||
GpioCtrlRegs.GPBMUX2.bit.GPIO48 = 3; // XD31
|
||||
GpioCtrlRegs.GPBMUX2.bit.GPIO49 = 3; // XD30
|
||||
GpioCtrlRegs.GPBMUX2.bit.GPIO50 = 3; // XD29
|
||||
GpioCtrlRegs.GPBMUX2.bit.GPIO51 = 3; // XD28
|
||||
GpioCtrlRegs.GPBMUX2.bit.GPIO52 = 3; // XD27
|
||||
GpioCtrlRegs.GPBMUX2.bit.GPIO53 = 3; // XD26
|
||||
GpioCtrlRegs.GPBMUX2.bit.GPIO54 = 3; // XD25
|
||||
GpioCtrlRegs.GPBMUX2.bit.GPIO55 = 3; // XD24
|
||||
GpioCtrlRegs.GPBMUX2.bit.GPIO56 = 3; // XD23
|
||||
GpioCtrlRegs.GPBMUX2.bit.GPIO57 = 3; // XD22
|
||||
GpioCtrlRegs.GPBMUX2.bit.GPIO58 = 3; // XD21
|
||||
GpioCtrlRegs.GPBMUX2.bit.GPIO59 = 3; // XD20
|
||||
GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 3; // XD19
|
||||
GpioCtrlRegs.GPBMUX2.bit.GPIO61 = 3; // XD18
|
||||
GpioCtrlRegs.GPBMUX2.bit.GPIO62 = 3; // XD17
|
||||
GpioCtrlRegs.GPBMUX2.bit.GPIO63 = 3; // XD16
|
||||
|
||||
GpioCtrlRegs.GPBQSEL2.bit.GPIO48 = 3; // XD31 asynchronous input
|
||||
GpioCtrlRegs.GPBQSEL2.bit.GPIO49 = 3; // XD30 asynchronous input
|
||||
GpioCtrlRegs.GPBQSEL2.bit.GPIO50 = 3; // XD29 asynchronous input
|
||||
GpioCtrlRegs.GPBQSEL2.bit.GPIO51 = 3; // XD28 asynchronous input
|
||||
GpioCtrlRegs.GPBQSEL2.bit.GPIO52 = 3; // XD27 asynchronous input
|
||||
GpioCtrlRegs.GPBQSEL2.bit.GPIO53 = 3; // XD26 asynchronous input
|
||||
GpioCtrlRegs.GPBQSEL2.bit.GPIO54 = 3; // XD25 asynchronous input
|
||||
GpioCtrlRegs.GPBQSEL2.bit.GPIO55 = 3; // XD24 asynchronous input
|
||||
GpioCtrlRegs.GPBQSEL2.bit.GPIO56 = 3; // XD23 asynchronous input
|
||||
GpioCtrlRegs.GPBQSEL2.bit.GPIO57 = 3; // XD22 asynchronous input
|
||||
GpioCtrlRegs.GPBQSEL2.bit.GPIO58 = 3; // XD21 asynchronous input
|
||||
GpioCtrlRegs.GPBQSEL2.bit.GPIO59 = 3; // XD20 asynchronous input
|
||||
GpioCtrlRegs.GPBQSEL2.bit.GPIO60 = 3; // XD19 asynchronous input
|
||||
GpioCtrlRegs.GPBQSEL2.bit.GPIO61 = 3; // XD18 asynchronous input
|
||||
GpioCtrlRegs.GPBQSEL2.bit.GPIO62 = 3; // XD17 asynchronous input
|
||||
GpioCtrlRegs.GPBQSEL2.bit.GPIO63 = 3; // XD16 asynchronous input
|
||||
|
||||
InitXintf16Gpio();
|
||||
}
|
||||
|
||||
//
|
||||
// InitXintf16Gpio -
|
||||
//
|
||||
void
|
||||
InitXintf16Gpio()
|
||||
{
|
||||
EALLOW;
|
||||
GpioCtrlRegs.GPCMUX1.bit.GPIO64 = 3; // XD15
|
||||
GpioCtrlRegs.GPCMUX1.bit.GPIO65 = 3; // XD14
|
||||
GpioCtrlRegs.GPCMUX1.bit.GPIO66 = 3; // XD13
|
||||
GpioCtrlRegs.GPCMUX1.bit.GPIO67 = 3; // XD12
|
||||
GpioCtrlRegs.GPCMUX1.bit.GPIO68 = 3; // XD11
|
||||
GpioCtrlRegs.GPCMUX1.bit.GPIO69 = 3; // XD10
|
||||
GpioCtrlRegs.GPCMUX1.bit.GPIO70 = 3; // XD19
|
||||
GpioCtrlRegs.GPCMUX1.bit.GPIO71 = 3; // XD8
|
||||
GpioCtrlRegs.GPCMUX1.bit.GPIO72 = 3; // XD7
|
||||
GpioCtrlRegs.GPCMUX1.bit.GPIO73 = 3; // XD6
|
||||
GpioCtrlRegs.GPCMUX1.bit.GPIO74 = 3; // XD5
|
||||
GpioCtrlRegs.GPCMUX1.bit.GPIO75 = 3; // XD4
|
||||
GpioCtrlRegs.GPCMUX1.bit.GPIO76 = 3; // XD3
|
||||
GpioCtrlRegs.GPCMUX1.bit.GPIO77 = 3; // XD2
|
||||
GpioCtrlRegs.GPCMUX1.bit.GPIO78 = 3; // XD1
|
||||
GpioCtrlRegs.GPCMUX1.bit.GPIO79 = 3; // XD0
|
||||
|
||||
GpioCtrlRegs.GPBMUX1.bit.GPIO40 = 3; // XA0/XWE1n
|
||||
GpioCtrlRegs.GPBMUX1.bit.GPIO41 = 3; // XA1
|
||||
GpioCtrlRegs.GPBMUX1.bit.GPIO42 = 3; // XA2
|
||||
GpioCtrlRegs.GPBMUX1.bit.GPIO43 = 3; // XA3
|
||||
GpioCtrlRegs.GPBMUX1.bit.GPIO44 = 3; // XA4
|
||||
GpioCtrlRegs.GPBMUX1.bit.GPIO45 = 3; // XA5
|
||||
GpioCtrlRegs.GPBMUX1.bit.GPIO46 = 3; // XA6
|
||||
GpioCtrlRegs.GPBMUX1.bit.GPIO47 = 3; // XA7
|
||||
|
||||
GpioCtrlRegs.GPCMUX2.bit.GPIO80 = 3; // XA8
|
||||
GpioCtrlRegs.GPCMUX2.bit.GPIO81 = 3; // XA9
|
||||
GpioCtrlRegs.GPCMUX2.bit.GPIO82 = 3; // XA10
|
||||
GpioCtrlRegs.GPCMUX2.bit.GPIO83 = 3; // XA11
|
||||
GpioCtrlRegs.GPCMUX2.bit.GPIO84 = 3; // XA12
|
||||
GpioCtrlRegs.GPCMUX2.bit.GPIO85 = 3; // XA13
|
||||
GpioCtrlRegs.GPCMUX2.bit.GPIO86 = 3; // XA14
|
||||
GpioCtrlRegs.GPCMUX2.bit.GPIO87 = 3; // XA15
|
||||
GpioCtrlRegs.GPBMUX1.bit.GPIO39 = 3; // XA16
|
||||
GpioCtrlRegs.GPAMUX2.bit.GPIO31 = 3; // XA17
|
||||
GpioCtrlRegs.GPAMUX2.bit.GPIO30 = 3; // XA18
|
||||
GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 3; // XA19
|
||||
|
||||
GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 3; // XREADY
|
||||
GpioCtrlRegs.GPBMUX1.bit.GPIO35 = 3; // XRNW
|
||||
GpioCtrlRegs.GPBMUX1.bit.GPIO38 = 3; // XWE0
|
||||
|
||||
GpioCtrlRegs.GPBMUX1.bit.GPIO36 = 3; // XZCS0
|
||||
GpioCtrlRegs.GPBMUX1.bit.GPIO37 = 3; // XZCS7
|
||||
GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 3; // XZCS6
|
||||
EDIS;
|
||||
}
|
||||
|
||||
//
|
||||
// End of File
|
||||
//
|
||||
|
@ -0,0 +1,78 @@
|
||||
;// TI File $Revision: /main/4 $
|
||||
;// Checkin $Date: July 30, 2007 10:28:57 $
|
||||
;//###########################################################################
|
||||
;//
|
||||
;// FILE: DSP2833x_usDelay.asm
|
||||
;//
|
||||
;// TITLE: Simple delay function
|
||||
;//
|
||||
;// DESCRIPTION:
|
||||
;//
|
||||
;// This is a simple delay function that can be used to insert a specified
|
||||
;// delay into code.
|
||||
;//
|
||||
;// This function is only accurate if executed from internal zero-waitstate
|
||||
;// SARAM. If it is executed from waitstate memory then the delay will be
|
||||
;// longer then specified.
|
||||
;//
|
||||
;// To use this function:
|
||||
;//
|
||||
;// 1 - update the CPU clock speed in the DSP2833x_Examples.h
|
||||
;// file. For example:
|
||||
;// #define CPU_RATE 6.667L // for a 150MHz CPU clock speed
|
||||
;// or #define CPU_RATE 10.000L // for a 100MHz CPU clock speed
|
||||
;//
|
||||
;// 2 - Call this function by using the DELAY_US(A) macro
|
||||
;// that is defined in the DSP2833x_Examples.h file. This macro
|
||||
;// will convert the number of microseconds specified
|
||||
;// into a loop count for use with this function.
|
||||
;// This count will be based on the CPU frequency you specify.
|
||||
;//
|
||||
;// 3 - For the most accurate delay
|
||||
;// - Execute this function in 0 waitstate RAM.
|
||||
;// - Disable interrupts before calling the function
|
||||
;// If you do not disable interrupts, then think of
|
||||
;// this as an "at least" delay function as the actual
|
||||
;// delay may be longer.
|
||||
;//
|
||||
;// The C assembly call from the DELAY_US(time) macro will
|
||||
;// look as follows:
|
||||
;//
|
||||
;// extern void Delay(long LoopCount);
|
||||
;//
|
||||
;// MOV AL,#LowLoopCount
|
||||
;// MOV AH,#HighLoopCount
|
||||
;// LCR _Delay
|
||||
;//
|
||||
;// Or as follows (if count is less then 16-bits):
|
||||
;//
|
||||
;// MOV ACC,#LoopCount
|
||||
;// LCR _Delay
|
||||
;//
|
||||
;//
|
||||
;//###########################################################################
|
||||
;// $TI Release: F2833x/F2823x Header Files and Peripheral Examples V142 $
|
||||
;// $Release Date: November 1, 2016 $
|
||||
;// $Copyright: Copyright (C) 2007-2016 Texas Instruments Incorporated -
|
||||
;// http://www.ti.com/ ALL RIGHTS RESERVED $
|
||||
;//###########################################################################
|
||||
|
||||
.def _DSP28x_usDelay
|
||||
.sect "ramfuncs"
|
||||
|
||||
.global __DSP28x_usDelay
|
||||
_DSP28x_usDelay:
|
||||
SUB ACC,#1
|
||||
BF _DSP28x_usDelay,GEQ ;; Loop if ACC >= 0
|
||||
LRETR
|
||||
|
||||
;There is a 9/10 cycle overhead and each loop
|
||||
;takes five cycles. The LoopCount is given by
|
||||
;the following formula:
|
||||
; DELAY_CPU_CYCLES = 9 + 5*LoopCount
|
||||
; LoopCount = (DELAY_CPU_CYCLES - 9) / 5
|
||||
; The macro DELAY_US(A) performs this calculation for you
|
||||
;
|
||||
;//===========================================================================
|
||||
;// End of file.
|
||||
;//===========================================================================
|
@ -0,0 +1,89 @@
|
||||
#include "DSP2833x_Device.h"
|
||||
#include "DSP28x_Project.h"
|
||||
#include "Protocol/CAN.h"
|
||||
#include "Protocol/CAN_data.h"
|
||||
#include "Protocol/DigitalIO.h"
|
||||
#include "Protocol/MemoryMap.h"
|
||||
#include "Periphery.h"
|
||||
|
||||
Periphery::Periphery() :
|
||||
_canb(canSpace::CANA),
|
||||
_digitalIO(),
|
||||
_zone6_ptr(reinterpret_cast<Uint16*>(0x100000)),
|
||||
_modbusSettingsMsg(),
|
||||
_modbusInit(false)
|
||||
{
|
||||
_softVersion.DSP = 202;
|
||||
_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(_zone6_ptr);
|
||||
_digitalIO.setMemoryOffset(interface::DISCRETE_DATA_OFFSET);
|
||||
|
||||
}
|
||||
|
||||
|
||||
Uint16 Periphery::getVersionFPGA(){
|
||||
Uint16 data;
|
||||
data = *_zone6_ptr + interface::SOFT_VERSION_OFFSET;
|
||||
return data;
|
||||
}
|
||||
|
||||
|
||||
void Periphery::updateVersionFPGA(){
|
||||
_softVersion.CPLD = getVersionFPGA() & 0x3FF; // no more than 1023 (9.9.9) should be limit
|
||||
_message.mdl.word.LOW_WORD = _softVersion.DSP;
|
||||
_message.mdl.word.HI_WORD = _softVersion.CPLD;
|
||||
_canb.updateTXMessage(canSpace::COMM_VERSION_MBOX, _message);
|
||||
}
|
||||
|
||||
|
||||
void Periphery::processDigitalInput(){
|
||||
Uint16 data = 0;
|
||||
_digitalIO.readDigitalIO(data);
|
||||
_canb.transmitMsg(canSpace::DIGITAL_INPUT_MBOX, (data));
|
||||
}
|
||||
|
||||
|
||||
void Periphery::processDigitalOutput(){
|
||||
if(_canb.isNewMessage(canSpace::DIGITAL_OUTPUT_MBOX)){
|
||||
_canb.receiveMsg(canSpace::DIGITAL_OUTPUT_MBOX, _message);
|
||||
Uint16 data = _message.mdl.word.LOW_WORD;
|
||||
_digitalIO.writeDigitalIO(data);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Periphery::initExternalModbus(){
|
||||
if (!_modbusInit && (_canb.isNewMessage(canSpace::MODBUS_SETTINGS_MBOX))) {
|
||||
_canb.receiveMsg(canSpace::MODBUS_SETTINGS_MBOX, _modbusSettingsMsg);
|
||||
_modbusInit = true; // TODO modbus init function must be here
|
||||
}
|
||||
}
|
@ -0,0 +1,40 @@
|
||||
#pragma once
|
||||
|
||||
#include "DSP28x_Project.h"
|
||||
#include "DSP2833x_Device.h"
|
||||
#include "Protocol/CAN.h"
|
||||
#include "Protocol/CAN_data.h"
|
||||
#include "Protocol/DigitalIO.h"
|
||||
#include "Protocol/MemoryMap.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* _zone6_ptr;
|
||||
|
||||
SoftwareVersion _softVersion;
|
||||
canSpace::CANMessage _modbusSettingsMsg;
|
||||
canSpace::CANMessage _message;
|
||||
bool _modbusInit;
|
||||
|
||||
Uint16 tempIn;
|
||||
Uint16 tempOut;
|
||||
};
|
@ -0,0 +1,285 @@
|
||||
#include "CAN.h"
|
||||
#include "DSP2833x_Device.h"
|
||||
#include "DSP2833x_ECan.h"
|
||||
|
||||
namespace canSpace {
|
||||
|
||||
void CAN::transmitMsg(Uint16 boxNumber, const CANMessage& message){
|
||||
if (boxNumber > 31) return;
|
||||
|
||||
Uint32 mboxControl(0);
|
||||
mboxControl = 1ul << boxNumber;
|
||||
|
||||
volatile MBOX* p_MailBox(0);
|
||||
p_MailBox = &(p_CanMBoxes_->MBOX0) + boxNumber;
|
||||
|
||||
p_MailBox->MDH.all = 0x0;
|
||||
p_MailBox->MDL.all = 0x0;
|
||||
|
||||
// p_MailBox->MSGCTRL.bit.DLC = message.dataLength;
|
||||
p_MailBox->MDH.all = message.mdh.all;
|
||||
p_MailBox->MDL.all = message.mdl.all;
|
||||
|
||||
// Set TRS for mailbox
|
||||
CanShadow_.CANTRS.all = 0;
|
||||
CanShadow_.CANTRS.all |= mboxControl;
|
||||
p_CanRegs_->CANTRS.all = CanShadow_.CANTRS.all;
|
||||
|
||||
// Wait for TA bit to be set
|
||||
// do { CanShadow_.CANTA.all = p_CanRegs_->CANTA.all; }
|
||||
// while((CanShadow_.CANTA.all & mboxControl) == 0 );
|
||||
|
||||
// // Clear TA (transmit acknowledge bit)
|
||||
// CanShadow_.CANTA.all = 0;
|
||||
// CanShadow_.CANTA.all |= mboxControl;
|
||||
// p_CanRegs_->CANTA.all = CanShadow_.CANTA.all;
|
||||
}
|
||||
|
||||
|
||||
void CAN::transmitMsg(Uint16 boxNumber, const Uint64& message){
|
||||
if (boxNumber > 31) return;
|
||||
|
||||
Uint32 mboxControl(0);
|
||||
mboxControl = 1ul << boxNumber;
|
||||
|
||||
volatile MBOX* p_MailBox(0);
|
||||
p_MailBox = &(p_CanMBoxes_->MBOX0) + boxNumber;
|
||||
|
||||
p_MailBox->MDH.all = 0x0;
|
||||
p_MailBox->MDL.all = 0x0;
|
||||
|
||||
p_MailBox->MDH.all = message >> 32;
|
||||
p_MailBox->MDL.all = message;
|
||||
|
||||
// Set TRS for mailbox
|
||||
CanShadow_.CANTRS.all = 0;
|
||||
CanShadow_.CANTRS.all |= mboxControl;
|
||||
p_CanRegs_->CANTRS.all = CanShadow_.CANTRS.all;
|
||||
|
||||
// Wait for TA bit to be set
|
||||
// do { CanShadow_.CANTA.all = p_CanRegs_->CANTA.all; }
|
||||
// while((CanShadow_.CANTA.all & mboxControl) == 0 );
|
||||
|
||||
// Clear TA (transmit acknowledge bit)
|
||||
// CanShadow_.CANTA.all = 0;
|
||||
// CanShadow_.CANTA.all |= mboxControl;
|
||||
// p_CanRegs_->CANTA.all = CanShadow_.CANTA.all;
|
||||
}
|
||||
|
||||
|
||||
void CAN::transmitMsg(Uint16 boxNumber, const Uint64& message, const Uint16 dlc){
|
||||
if (boxNumber > 31) return;
|
||||
|
||||
Uint32 mboxControl(0);
|
||||
mboxControl = 1ul << boxNumber;
|
||||
|
||||
volatile MBOX* p_MailBox(0);
|
||||
p_MailBox = &(p_CanMBoxes_->MBOX0) + boxNumber;
|
||||
|
||||
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;
|
||||
|
||||
// Set TRS for mailbox
|
||||
CanShadow_.CANTRS.all = 0;
|
||||
CanShadow_.CANTRS.all |= mboxControl;
|
||||
p_CanRegs_->CANTRS.all = CanShadow_.CANTRS.all;
|
||||
|
||||
// Wait for TA bit to be set
|
||||
// do { CanShadow_.CANTA.all = p_CanRegs_->CANTA.all; }
|
||||
// while((CanShadow_.CANTA.all & mboxControl) == 0 );
|
||||
|
||||
// Clear TA (transmit acknowledge bit)
|
||||
// CanShadow_.CANTA.all = 0;
|
||||
// CanShadow_.CANTA.all |= mboxControl;
|
||||
// p_CanRegs_->CANTA.all = CanShadow_.CANTA.all;
|
||||
}
|
||||
|
||||
|
||||
void CAN::updateTXMessage(Uint16 boxNumber, const CANMessage& 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.mdl.all;
|
||||
p_MailBox->MDH.all = message.mdh.all;
|
||||
|
||||
CanShadow_.CANMC.all = p_CanRegs_->CANMC.all;
|
||||
CanShadow_.CANMC.bit.CDR = 0;
|
||||
p_CanRegs_->CANMC.all = CanShadow_.CANMC.all;
|
||||
}
|
||||
|
||||
|
||||
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;
|
||||
|
||||
volatile MBOX* p_MailBox(0);
|
||||
p_MailBox = &(p_CanMBoxes_->MBOX0) + boxNumber;
|
||||
|
||||
Uint32 mboxControl(0);
|
||||
mboxControl = 1ul << boxNumber;
|
||||
|
||||
// Mailbox disable
|
||||
CanShadow_.CANME.all = p_CanRegs_->CANME.all;
|
||||
CanShadow_.CANME.all &= ~(mboxControl);
|
||||
p_CanRegs_->CANME.all = CanShadow_.CANME.all;
|
||||
|
||||
p_MailBox->MSGCTRL.bit.RTR = 1;
|
||||
|
||||
// Mailbox enable
|
||||
CanShadow_.CANME.all = p_CanRegs_->CANME.all;
|
||||
CanShadow_.CANME.all |= mboxControl;
|
||||
p_CanRegs_->CANME.all = CanShadow_.CANME.all;
|
||||
|
||||
// Set TRS for mailbox
|
||||
CanShadow_.CANTRS.all = 0;
|
||||
CanShadow_.CANTRS.all |= mboxControl;
|
||||
p_CanRegs_->CANTRS.all = CanShadow_.CANTRS.all;
|
||||
}
|
||||
|
||||
|
||||
int16 CAN::receiveMsg(Uint16 boxNumber, CANMessage& 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.dataLength = p_MailBox->MSGCTRL.all;
|
||||
rxMessage.mdl.all = p_MailBox->MDL.all;
|
||||
rxMessage.mdh.all = p_MailBox->MDH.all;
|
||||
|
||||
bool newMessage;
|
||||
bool lostMessage;
|
||||
|
||||
newMessage = p_CanRegs_->CANRMP.all & mboxControl;
|
||||
lostMessage = p_CanRegs_->CANRML.all & mboxControl;
|
||||
|
||||
if(newMessage || lostMessage) {
|
||||
return -3;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
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<bool>(p_CanRegs_->CANRMP.all);
|
||||
}
|
||||
|
||||
|
||||
bool CAN::isNewMessage(Uint16 boxNumber){
|
||||
if (boxNumber > 31) { return 0; }
|
||||
|
||||
Uint32 mboxControl(0);
|
||||
mboxControl = 1ul << boxNumber;
|
||||
|
||||
bool isNewMessageInBox = p_CanRegs_->CANRMP.all & mboxControl;
|
||||
return isNewMessageInBox;
|
||||
}
|
||||
|
||||
|
||||
void CAN::resetTimeStampCounter(){
|
||||
EALLOW;
|
||||
ECanbRegs.CANTSC = 0;
|
||||
EDIS;
|
||||
}
|
||||
|
||||
|
||||
void CAN::setTimeOutValue(Uint16 boxNumber, Uint32 canBitsNumber){
|
||||
if (boxNumber > 31) { return; }
|
||||
|
||||
volatile Uint32* p_MailBox(0);
|
||||
p_MailBox = &(p_CanMotoRegs_->MOTO0) + boxNumber;
|
||||
|
||||
*p_MailBox = canBitsNumber;
|
||||
}
|
||||
|
||||
|
||||
bool CAN::isTimeOut(Uint16 boxNumber){
|
||||
bool mBOXTimeOut = false;
|
||||
mBOXTimeOut = p_CanRegs_->CANTOS.all & (1ul << boxNumber);
|
||||
return mBOXTimeOut;
|
||||
}
|
||||
|
||||
|
||||
void CAN::clearTimeOutFlag(Uint16 boxNumber){
|
||||
Uint32 clearFlag = 0;
|
||||
clearFlag = 1ul << boxNumber;
|
||||
p_CanRegs_->CANTOS.all = clearFlag;
|
||||
}
|
||||
|
||||
|
||||
} // canSpace
|
@ -0,0 +1,142 @@
|
||||
#pragma once
|
||||
|
||||
#include "F28335/DSP28x_Project.h"
|
||||
#include "F28335/DSP2833x_Device.h"
|
||||
|
||||
namespace canSpace {
|
||||
|
||||
enum CAN_VARIANT{
|
||||
CANA,
|
||||
CANB
|
||||
};
|
||||
|
||||
enum configFlags{
|
||||
NONE = 0,
|
||||
MSB_ENABLE = 1u << 0,
|
||||
STM_ENABLE = 1u << 1
|
||||
};
|
||||
|
||||
|
||||
enum configSystemIsrFlags{
|
||||
I0EN_ENABLE = 1ul,
|
||||
I1EN_ENABLE = 1ul << 1,
|
||||
GIL_ENABLE = 1ul << 2,
|
||||
WLIM_ENABLE = 1ul << 8,
|
||||
EPIM_ENABLE = 1ul << 9,
|
||||
BOIM_ENABLE = 1ul << 10,
|
||||
RMLIM_ENABLE = 1ul << 11,
|
||||
WUIM_ENABLE = 1ul << 12,
|
||||
WDIM_ENABLE = 1ul << 13,
|
||||
AAIM_ENABLE = 1ul << 14,
|
||||
TCOM_ENABLE = 1ul << 16,
|
||||
MTOM_ENABLE = 1ul << 17
|
||||
};
|
||||
|
||||
|
||||
// eCAN Message Control Register (MSGCTRL) bit definitions
|
||||
struct MsgCtrlBits { // bits description
|
||||
Uint16 DLC:4; // 0:3
|
||||
Uint16 RTR:1; // 4
|
||||
Uint16 OPC:1; // 1
|
||||
Uint16 rsvd1:2; // 7:6 reserved
|
||||
Uint16 TPL:5; // 12:8
|
||||
Uint16 rsvd2:3; // 15:13 reserved
|
||||
};
|
||||
|
||||
|
||||
union MsgCtrlReg {
|
||||
Uint16 all;
|
||||
struct MsgCtrlBits bit;
|
||||
|
||||
MsgCtrlReg(Uint16 configData = 0){
|
||||
all = configData;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
struct MsgID_Bits { // bits description
|
||||
Uint16 EXTMSGID_L:16; // 0:15
|
||||
Uint16 EXTMSGID_H:2; // 16:17
|
||||
Uint16 STDMSGID:11; // 18:28
|
||||
Uint16 AAM:1; // 29
|
||||
Uint16 AME:1; // 30
|
||||
Uint16 IDE:1; // 31
|
||||
};
|
||||
|
||||
// Allow access to the bit fields or entire register
|
||||
union MsgID {
|
||||
Uint32 all;
|
||||
struct MsgID_Bits bit;
|
||||
|
||||
MsgID(Uint32 boxID = 0xAAA, bool isExtendedID = false, bool isAAM = false, bool isAME = false) {
|
||||
if(!isExtendedID){
|
||||
bit.STDMSGID = boxID;
|
||||
bit.EXTMSGID_H = 0;
|
||||
bit.EXTMSGID_L = 0;
|
||||
}
|
||||
else{ all = boxID; }
|
||||
|
||||
bit.IDE = isExtendedID;
|
||||
bit.AAM = isAAM;
|
||||
bit.AME = isAME;
|
||||
}
|
||||
|
||||
MsgID(const MsgID& init) {
|
||||
all = init.all;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
struct CANMessage {
|
||||
Uint16 dataLength;
|
||||
union CANMDL_REG mdl;
|
||||
union CANMDH_REG mdh;
|
||||
|
||||
CANMessage(){
|
||||
mdl.all = 0;
|
||||
mdh.all = 0;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
class CAN{
|
||||
public:
|
||||
CAN(CAN_VARIANT canVariant);
|
||||
|
||||
void initGpio();
|
||||
void config(Uint16 baudrate = 1000, Uint16 flags = 0);
|
||||
void configTxMBox(Uint16 boxNumber, const MsgID& configID, const MsgCtrlReg& configCtrlReg);
|
||||
void configRxMBox(Uint16 boxNumber, const MsgID& configID, const MsgCtrlReg& configCtrlReg);
|
||||
void configSystemIsr(Uint32 flags);
|
||||
void configMBoxIsr(Uint16 boxNumber);
|
||||
|
||||
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 Uint64& message, const Uint16 dlc);
|
||||
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);
|
||||
void resetTimeStampCounter();
|
||||
void setTimeOutValue(Uint16 boxNumber, Uint32 canBitsNumber);
|
||||
bool isTimeOut(Uint16 boxNumber);
|
||||
void clearTimeOutFlag(Uint16 boxNumber);
|
||||
|
||||
private:
|
||||
CAN_VARIANT canPort;
|
||||
volatile ECAN_REGS* p_CanRegs_;
|
||||
ECAN_REGS CanShadow_;
|
||||
volatile ECAN_MBOXES* p_CanMBoxes_;
|
||||
volatile MOTO_REGS* p_CanMotoRegs_;
|
||||
volatile MOTS_REGS* p_CanMotsRegs_;
|
||||
};
|
||||
|
||||
|
||||
} // canSpace
|
@ -0,0 +1,17 @@
|
||||
#pragma once
|
||||
|
||||
namespace canSpace {
|
||||
|
||||
enum MBOX_NUMBERS {
|
||||
MODBUS_SETTINGS_MBOX = 0,
|
||||
COMM_VERSION_MBOX = 1,
|
||||
MODBUS_DATA_COMM_TO_CPU_RSV2_MBOX = 26,
|
||||
MODBUS_DATA_COMM_TO_CPU_RSV1_MBOX = 27,
|
||||
MODBUS_DATA_CPU_TO_COMM_MBOX = 28,
|
||||
MODBUS_DATA_COMM_TO_CPU_MBOX = 29,
|
||||
DIGITAL_INPUT_MBOX = 30,
|
||||
DIGITAL_OUTPUT_MBOX = 31
|
||||
};
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,41 @@
|
||||
#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){
|
||||
asm(" NOP");
|
||||
asm(" NOP");
|
||||
asm(" NOP");
|
||||
data = *m_pointer;
|
||||
asm(" NOP");
|
||||
asm(" NOP");
|
||||
asm(" NOP");
|
||||
}
|
||||
|
||||
|
||||
void DigitalIO::writeDigitalIO(Uint16& data) const{
|
||||
asm(" NOP");
|
||||
asm(" NOP");
|
||||
asm(" NOP");
|
||||
*m_pointer = data;
|
||||
asm(" NOP");
|
||||
asm(" NOP");
|
||||
asm(" NOP");
|
||||
}
|
||||
|
||||
} // 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,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)
|
||||
};
|
||||
|
||||
}
|
@ -0,0 +1,177 @@
|
||||
/*
|
||||
//###########################################################################
|
||||
//
|
||||
// FILE: 28335_RAM_lnk.cmd
|
||||
//
|
||||
// TITLE: Linker Command File For 28335 examples that run out of RAM
|
||||
//
|
||||
// This ONLY includes all SARAM blocks on the 28335 device.
|
||||
// This does not include flash or OTP.
|
||||
//
|
||||
// Keep in mind that L0 and L1 are protected by the code
|
||||
// security module.
|
||||
//
|
||||
// What this means is in most cases you will want to move to
|
||||
// another memory map file which has more memory defined.
|
||||
//
|
||||
//###########################################################################
|
||||
// $TI Release: F2833x/F2823x Header Files and Peripheral Examples V142 $
|
||||
// $Release Date: November 1, 2016 $
|
||||
// $Copyright: Copyright (C) 2007-2016 Texas Instruments Incorporated -
|
||||
// http://www.ti.com/ ALL RIGHTS RESERVED $
|
||||
//###########################################################################
|
||||
*/
|
||||
|
||||
/* ======================================================
|
||||
// For Code Composer Studio V2.2 and later
|
||||
// ---------------------------------------
|
||||
// In addition to this memory linker command file,
|
||||
// add the header linker command file directly to the project.
|
||||
// The header linker command file is required to link the
|
||||
// peripheral structures to the proper locations within
|
||||
// the memory map.
|
||||
//
|
||||
// The header linker files are found in <base>\DSP2833x_Headers\cmd
|
||||
//
|
||||
// For BIOS applications add: DSP2833x_Headers_BIOS.cmd
|
||||
// For nonBIOS applications add: DSP2833x_Headers_nonBIOS.cmd
|
||||
========================================================= */
|
||||
|
||||
/* ======================================================
|
||||
// For Code Composer Studio prior to V2.2
|
||||
// --------------------------------------
|
||||
// 1) Use one of the following -l statements to include the
|
||||
// header linker command file in the project. The header linker
|
||||
// file is required to link the peripheral structures to the proper
|
||||
// locations within the memory map */
|
||||
|
||||
/* Uncomment this line to include file only for non-BIOS applications */
|
||||
/* -l DSP2833x_Headers_nonBIOS.cmd */
|
||||
|
||||
/* Uncomment this line to include file only for BIOS applications */
|
||||
/* -l DSP2833x_Headers_BIOS.cmd */
|
||||
|
||||
/* 2) In your project add the path to <base>\DSP2833x_headers\cmd to the
|
||||
library search path under project->build options, linker tab,
|
||||
library search path (-i).
|
||||
/*========================================================= */
|
||||
|
||||
/* Define the memory block start/length for the F28335
|
||||
PAGE 0 will be used to organize program sections
|
||||
PAGE 1 will be used to organize data sections
|
||||
|
||||
Notes:
|
||||
Memory blocks on F28335 are uniform (ie same
|
||||
physical memory) in both PAGE 0 and PAGE 1.
|
||||
That is the same memory region should not be
|
||||
defined for both PAGE 0 and PAGE 1.
|
||||
Doing so will result in corruption of program
|
||||
and/or data.
|
||||
|
||||
L0/L1/L2 and L3 memory blocks are mirrored - that is
|
||||
they can be accessed in high memory or low memory.
|
||||
For simplicity only one instance is used in this
|
||||
linker file.
|
||||
|
||||
Contiguous SARAM memory blocks can be combined
|
||||
if required to create a larger memory block.
|
||||
*/
|
||||
|
||||
|
||||
MEMORY
|
||||
{
|
||||
PAGE 0 :
|
||||
/* BEGIN is used for the "boot to SARAM" bootloader mode */
|
||||
|
||||
BEGIN : origin = 0x000000, length = 0x000002 /* Boot to M0 will go here */
|
||||
RAMM0 : origin = 0x000050, length = 0x0003B0
|
||||
RAML0 : origin = 0x008000, length = 0x001000
|
||||
RAML1 : origin = 0x009000, length = 0x001000
|
||||
RAML2 : origin = 0x00A000, length = 0x001000
|
||||
RAML3 : origin = 0x00B000, length = 0x001000
|
||||
ZONE7A : origin = 0x200000, length = 0x00FC00 /* XINTF zone 7 - program space */
|
||||
CSM_RSVD : origin = 0x33FF80, length = 0x000076 /* Part of FLASHA. Program with all 0x0000 when CSM is in use. */
|
||||
CSM_PWL : origin = 0x33FFF8, length = 0x000008 /* Part of FLASHA. CSM password locations in FLASHA */
|
||||
ADC_CAL : origin = 0x380080, length = 0x000009
|
||||
RESET : origin = 0x3FFFC0, length = 0x000002
|
||||
IQTABLES : origin = 0x3FE000, length = 0x000b50
|
||||
IQTABLES2 : origin = 0x3FEB50, length = 0x00008c
|
||||
FPUTABLES : origin = 0x3FEBDC, length = 0x0006A0
|
||||
BOOTROM : origin = 0x3FF27C, length = 0x000D44
|
||||
|
||||
|
||||
PAGE 1 :
|
||||
/* BOOT_RSVD is used by the boot ROM for stack. */
|
||||
/* This section is only reserved to keep the BOOT ROM from */
|
||||
/* corrupting this area during the debug process */
|
||||
|
||||
BOOT_RSVD : origin = 0x000002, length = 0x00004E /* Part of M0, BOOT rom will use this for stack */
|
||||
RAMM1 : origin = 0x000400, length = 0x000400 /* on-chip RAM block M1 */
|
||||
RAML4 : origin = 0x00C000, length = 0x001000
|
||||
RAML5 : origin = 0x00D000, length = 0x001000
|
||||
RAML6 : origin = 0x00E000, length = 0x001000
|
||||
RAML7 : origin = 0x00F000, length = 0x001000
|
||||
ZONE7B : origin = 0x20FC00, length = 0x000400 /* XINTF zone 7 - data space */
|
||||
}
|
||||
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
/* Setup for "boot to SARAM" mode:
|
||||
The codestart section (found in DSP28_CodeStartBranch.asm)
|
||||
re-directs execution to the start of user code. */
|
||||
codestart : > BEGIN, PAGE = 0
|
||||
ramfuncs : > RAML0, PAGE = 0
|
||||
.text : > RAML1, PAGE = 0
|
||||
.InitBoot : > RAML1, PAGE = 0
|
||||
.cinit : > RAML0, PAGE = 0
|
||||
.pinit : > RAML0, PAGE = 0
|
||||
.switch : > RAML0, PAGE = 0
|
||||
|
||||
.stack : > RAMM1, PAGE = 1
|
||||
.ebss : > RAML4, PAGE = 1
|
||||
.econst : > RAML5, PAGE = 1
|
||||
.esysmem : > RAMM1, PAGE = 1
|
||||
|
||||
IQmath : > RAML1, PAGE = 0
|
||||
IQmathTables : > IQTABLES, PAGE = 0, TYPE = NOLOAD
|
||||
|
||||
/* Uncomment the section below if calling the IQNexp() or IQexp()
|
||||
functions from the IQMath.lib library in order to utilize the
|
||||
relevant IQ Math table in Boot ROM (This saves space and Boot ROM
|
||||
is 1 wait-state). If this section is not uncommented, IQmathTables2
|
||||
will be loaded into other memory (SARAM, Flash, etc.) and will take
|
||||
up space, but 0 wait-state is possible.
|
||||
*/
|
||||
/*
|
||||
IQmathTables2 : > IQTABLES2, PAGE = 0, TYPE = NOLOAD
|
||||
{
|
||||
|
||||
IQmath.lib<IQNexpTable.obj> (IQmathTablesRam)
|
||||
|
||||
}
|
||||
*/
|
||||
|
||||
FPUmathTables : > FPUTABLES, PAGE = 0, TYPE = NOLOAD
|
||||
|
||||
DMARAML4 : > RAML4, PAGE = 1
|
||||
DMARAML5 : > RAML5, PAGE = 1
|
||||
DMARAML6 : > RAML6, PAGE = 1
|
||||
DMARAML7 : > RAML7, PAGE = 1
|
||||
|
||||
ZONE7DATA : > ZONE7B, PAGE = 1
|
||||
|
||||
.reset : > RESET, PAGE = 0, TYPE = DSECT /* not used */
|
||||
csm_rsvd : > CSM_RSVD PAGE = 0, TYPE = DSECT /* not used for SARAM examples */
|
||||
csmpasswds : > CSM_PWL PAGE = 0, TYPE = DSECT /* not used for SARAM examples */
|
||||
|
||||
/* Allocate ADC_cal function (pre-programmed by factory into TI reserved memory) */
|
||||
.adc_cal : load = ADC_CAL, PAGE = 0, TYPE = NOLOAD
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
//===========================================================================
|
||||
// End of file.
|
||||
//===========================================================================
|
||||
*/
|
@ -0,0 +1,183 @@
|
||||
/*
|
||||
//###########################################################################
|
||||
//
|
||||
// FILE: DSP2833x_Headers_nonBIOS.cmd
|
||||
//
|
||||
// TITLE: DSP2833x Peripheral registers linker command file
|
||||
//
|
||||
// DESCRIPTION:
|
||||
//
|
||||
// This file is for use in Non-BIOS applications.
|
||||
//
|
||||
// Linker command file to place the peripheral structures
|
||||
// used within the DSP2833x headerfiles into the correct memory
|
||||
// mapped locations.
|
||||
//
|
||||
// This version of the file includes the PieVectorTable structure.
|
||||
// For BIOS applications, please use the DSP2833x_Headers_BIOS.cmd file
|
||||
// which does not include the PieVectorTable structure.
|
||||
//
|
||||
//###########################################################################
|
||||
// $TI Release: F2833x/F2823x Header Files and Peripheral Examples V142 $
|
||||
// $Release Date: November 1, 2016 $
|
||||
// $Copyright: Copyright (C) 2007-2016 Texas Instruments Incorporated -
|
||||
// http://www.ti.com/ ALL RIGHTS RESERVED $
|
||||
//###########################################################################
|
||||
*/
|
||||
|
||||
MEMORY
|
||||
{
|
||||
PAGE 0: /* Program Memory */
|
||||
|
||||
PAGE 1: /* Data Memory */
|
||||
|
||||
DEV_EMU : origin = 0x000880, length = 0x000180 /* device emulation registers */
|
||||
FLASH_REGS : origin = 0x000A80, length = 0x000060 /* FLASH registers */
|
||||
CSM : origin = 0x000AE0, length = 0x000010 /* code security module registers */
|
||||
|
||||
ADC_MIRROR : origin = 0x000B00, length = 0x000010 /* ADC Results register mirror */
|
||||
|
||||
XINTF : origin = 0x000B20, length = 0x000020 /* external interface registers */
|
||||
|
||||
CPU_TIMER0 : origin = 0x000C00, length = 0x000008 /* CPU Timer0 registers */
|
||||
CPU_TIMER1 : origin = 0x000C08, length = 0x000008 /* CPU Timer0 registers (CPU Timer1 & Timer2 reserved TI use)*/
|
||||
CPU_TIMER2 : origin = 0x000C10, length = 0x000008 /* CPU Timer0 registers (CPU Timer1 & Timer2 reserved TI use)*/
|
||||
|
||||
PIE_CTRL : origin = 0x000CE0, length = 0x000020 /* PIE control registers */
|
||||
PIE_VECT : origin = 0x000D00, length = 0x000100 /* PIE Vector Table */
|
||||
|
||||
DMA : origin = 0x001000, length = 0x000200 /* DMA registers */
|
||||
|
||||
MCBSPA : origin = 0x005000, length = 0x000040 /* McBSP-A registers */
|
||||
MCBSPB : origin = 0x005040, length = 0x000040 /* McBSP-B registers */
|
||||
|
||||
ECANA : origin = 0x006000, length = 0x000040 /* eCAN-A control and status registers */
|
||||
ECANA_LAM : origin = 0x006040, length = 0x000040 /* eCAN-A local acceptance masks */
|
||||
ECANA_MOTS : origin = 0x006080, length = 0x000040 /* eCAN-A message object time stamps */
|
||||
ECANA_MOTO : origin = 0x0060C0, length = 0x000040 /* eCAN-A object time-out registers */
|
||||
ECANA_MBOX : origin = 0x006100, length = 0x000100 /* eCAN-A mailboxes */
|
||||
|
||||
ECANB : origin = 0x006200, length = 0x000040 /* eCAN-B control and status registers */
|
||||
ECANB_LAM : origin = 0x006240, length = 0x000040 /* eCAN-B local acceptance masks */
|
||||
ECANB_MOTS : origin = 0x006280, length = 0x000040 /* eCAN-B message object time stamps */
|
||||
ECANB_MOTO : origin = 0x0062C0, length = 0x000040 /* eCAN-B object time-out registers */
|
||||
ECANB_MBOX : origin = 0x006300, length = 0x000100 /* eCAN-B mailboxes */
|
||||
|
||||
EPWM1 : origin = 0x006800, length = 0x000022 /* Enhanced PWM 1 registers */
|
||||
EPWM2 : origin = 0x006840, length = 0x000022 /* Enhanced PWM 2 registers */
|
||||
EPWM3 : origin = 0x006880, length = 0x000022 /* Enhanced PWM 3 registers */
|
||||
EPWM4 : origin = 0x0068C0, length = 0x000022 /* Enhanced PWM 4 registers */
|
||||
EPWM5 : origin = 0x006900, length = 0x000022 /* Enhanced PWM 5 registers */
|
||||
EPWM6 : origin = 0x006940, length = 0x000022 /* Enhanced PWM 6 registers */
|
||||
|
||||
ECAP1 : origin = 0x006A00, length = 0x000020 /* Enhanced Capture 1 registers */
|
||||
ECAP2 : origin = 0x006A20, length = 0x000020 /* Enhanced Capture 2 registers */
|
||||
ECAP3 : origin = 0x006A40, length = 0x000020 /* Enhanced Capture 3 registers */
|
||||
ECAP4 : origin = 0x006A60, length = 0x000020 /* Enhanced Capture 4 registers */
|
||||
ECAP5 : origin = 0x006A80, length = 0x000020 /* Enhanced Capture 5 registers */
|
||||
ECAP6 : origin = 0x006AA0, length = 0x000020 /* Enhanced Capture 6 registers */
|
||||
|
||||
EQEP1 : origin = 0x006B00, length = 0x000040 /* Enhanced QEP 1 registers */
|
||||
EQEP2 : origin = 0x006B40, length = 0x000040 /* Enhanced QEP 2 registers */
|
||||
|
||||
GPIOCTRL : origin = 0x006F80, length = 0x000040 /* GPIO control registers */
|
||||
GPIODAT : origin = 0x006FC0, length = 0x000020 /* GPIO data registers */
|
||||
GPIOINT : origin = 0x006FE0, length = 0x000020 /* GPIO interrupt/LPM registers */
|
||||
|
||||
SYSTEM : origin = 0x007010, length = 0x000020 /* System control registers */
|
||||
SPIA : origin = 0x007040, length = 0x000010 /* SPI-A registers */
|
||||
SCIA : origin = 0x007050, length = 0x000010 /* SCI-A registers */
|
||||
XINTRUPT : origin = 0x007070, length = 0x000010 /* external interrupt registers */
|
||||
|
||||
ADC : origin = 0x007100, length = 0x000020 /* ADC registers */
|
||||
|
||||
SCIB : origin = 0x007750, length = 0x000010 /* SCI-B registers */
|
||||
|
||||
SCIC : origin = 0x007770, length = 0x000010 /* SCI-C registers */
|
||||
|
||||
I2CA : origin = 0x007900, length = 0x000040 /* I2C-A registers */
|
||||
|
||||
CSM_PWL : origin = 0x33FFF8, length = 0x000008 /* Part of FLASHA. CSM password locations. */
|
||||
|
||||
PARTID : origin = 0x380090, length = 0x000001 /* Part ID register location */
|
||||
}
|
||||
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
PieVectTableFile : > PIE_VECT, PAGE = 1
|
||||
|
||||
/*** Peripheral Frame 0 Register Structures ***/
|
||||
DevEmuRegsFile : > DEV_EMU, PAGE = 1
|
||||
FlashRegsFile : > FLASH_REGS, PAGE = 1
|
||||
CsmRegsFile : > CSM, PAGE = 1
|
||||
AdcMirrorFile : > ADC_MIRROR, PAGE = 1
|
||||
XintfRegsFile : > XINTF, PAGE = 1
|
||||
CpuTimer0RegsFile : > CPU_TIMER0, PAGE = 1
|
||||
CpuTimer1RegsFile : > CPU_TIMER1, PAGE = 1
|
||||
CpuTimer2RegsFile : > CPU_TIMER2, PAGE = 1
|
||||
PieCtrlRegsFile : > PIE_CTRL, PAGE = 1
|
||||
DmaRegsFile : > DMA, PAGE = 1
|
||||
|
||||
/*** Peripheral Frame 3 Register Structures ***/
|
||||
McbspaRegsFile : > MCBSPA, PAGE = 1
|
||||
McbspbRegsFile : > MCBSPB, PAGE = 1
|
||||
|
||||
/*** Peripheral Frame 1 Register Structures ***/
|
||||
ECanaRegsFile : > ECANA, PAGE = 1
|
||||
ECanaLAMRegsFile : > ECANA_LAM PAGE = 1
|
||||
ECanaMboxesFile : > ECANA_MBOX PAGE = 1
|
||||
ECanaMOTSRegsFile : > ECANA_MOTS PAGE = 1
|
||||
ECanaMOTORegsFile : > ECANA_MOTO PAGE = 1
|
||||
|
||||
ECanbRegsFile : > ECANB, PAGE = 1
|
||||
ECanbLAMRegsFile : > ECANB_LAM PAGE = 1
|
||||
ECanbMboxesFile : > ECANB_MBOX PAGE = 1
|
||||
ECanbMOTSRegsFile : > ECANB_MOTS PAGE = 1
|
||||
ECanbMOTORegsFile : > ECANB_MOTO PAGE = 1
|
||||
|
||||
EPwm1RegsFile : > EPWM1 PAGE = 1
|
||||
EPwm2RegsFile : > EPWM2 PAGE = 1
|
||||
EPwm3RegsFile : > EPWM3 PAGE = 1
|
||||
EPwm4RegsFile : > EPWM4 PAGE = 1
|
||||
EPwm5RegsFile : > EPWM5 PAGE = 1
|
||||
EPwm6RegsFile : > EPWM6 PAGE = 1
|
||||
|
||||
ECap1RegsFile : > ECAP1 PAGE = 1
|
||||
ECap2RegsFile : > ECAP2 PAGE = 1
|
||||
ECap3RegsFile : > ECAP3 PAGE = 1
|
||||
ECap4RegsFile : > ECAP4 PAGE = 1
|
||||
ECap5RegsFile : > ECAP5 PAGE = 1
|
||||
ECap6RegsFile : > ECAP6 PAGE = 1
|
||||
|
||||
EQep1RegsFile : > EQEP1 PAGE = 1
|
||||
EQep2RegsFile : > EQEP2 PAGE = 1
|
||||
|
||||
GpioCtrlRegsFile : > GPIOCTRL PAGE = 1
|
||||
GpioDataRegsFile : > GPIODAT PAGE = 1
|
||||
GpioIntRegsFile : > GPIOINT PAGE = 1
|
||||
|
||||
/*** Peripheral Frame 2 Register Structures ***/
|
||||
SysCtrlRegsFile : > SYSTEM, PAGE = 1
|
||||
SpiaRegsFile : > SPIA, PAGE = 1
|
||||
SciaRegsFile : > SCIA, PAGE = 1
|
||||
XIntruptRegsFile : > XINTRUPT, PAGE = 1
|
||||
AdcRegsFile : > ADC, PAGE = 1
|
||||
ScibRegsFile : > SCIB, PAGE = 1
|
||||
ScicRegsFile : > SCIC, PAGE = 1
|
||||
I2caRegsFile : > I2CA, PAGE = 1
|
||||
|
||||
/*** Code Security Module Register Structures ***/
|
||||
CsmPwlFile : > CSM_PWL, PAGE = 1
|
||||
|
||||
/*** Device Part ID Register Structures ***/
|
||||
PartIdRegsFile : > PARTID, PAGE = 1
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
//===========================================================================
|
||||
// End of file.
|
||||
//===========================================================================
|
||||
*/
|
@ -0,0 +1,204 @@
|
||||
/*
|
||||
//###########################################################################
|
||||
//
|
||||
// FILE: F28335.cmd
|
||||
//
|
||||
// TITLE: Linker Command File For F28335 Device
|
||||
//
|
||||
//###########################################################################
|
||||
// $TI Release: F2833x/F2823x Header Files and Peripheral Examples V142 $
|
||||
// $Release Date: November 1, 2016 $
|
||||
// $Copyright: Copyright (C) 2007-2016 Texas Instruments Incorporated -
|
||||
// http://www.ti.com/ ALL RIGHTS RESERVED $
|
||||
//###########################################################################
|
||||
*/
|
||||
|
||||
/* ======================================================
|
||||
// For Code Composer Studio V2.2 and later
|
||||
// ---------------------------------------
|
||||
// In addition to this memory linker command file,
|
||||
// add the header linker command file directly to the project.
|
||||
// The header linker command file is required to link the
|
||||
// peripheral structures to the proper locations within
|
||||
// the memory map.
|
||||
//
|
||||
// The header linker files are found in <base>\DSP2833x_Headers\cmd
|
||||
//
|
||||
// For BIOS applications add: DSP2833x_Headers_BIOS.cmd
|
||||
// For nonBIOS applications add: DSP2833x_Headers_nonBIOS.cmd
|
||||
========================================================= */
|
||||
|
||||
/* ======================================================
|
||||
// For Code Composer Studio prior to V2.2
|
||||
// --------------------------------------
|
||||
// 1) Use one of the following -l statements to include the
|
||||
// header linker command file in the project. The header linker
|
||||
// file is required to link the peripheral structures to the proper
|
||||
// locations within the memory map */
|
||||
|
||||
/* Uncomment this line to include file only for non-BIOS applications */
|
||||
/* -l DSP2833x_Headers_nonBIOS.cmd */
|
||||
|
||||
/* Uncomment this line to include file only for BIOS applications */
|
||||
/* -l DSP2833x_Headers_BIOS.cmd */
|
||||
|
||||
/* 2) In your project add the path to <base>\DSP2833x_headers\cmd to the
|
||||
library search path under project->build options, linker tab,
|
||||
library search path (-i).
|
||||
/*========================================================= */
|
||||
|
||||
/* Define the memory block start/length for the F28335
|
||||
PAGE 0 will be used to organize program sections
|
||||
PAGE 1 will be used to organize data sections
|
||||
|
||||
Notes:
|
||||
Memory blocks on F28335 are uniform (ie same
|
||||
physical memory) in both PAGE 0 and PAGE 1.
|
||||
That is the same memory region should not be
|
||||
defined for both PAGE 0 and PAGE 1.
|
||||
Doing so will result in corruption of program
|
||||
and/or data.
|
||||
|
||||
L0/L1/L2 and L3 memory blocks are mirrored - that is
|
||||
they can be accessed in high memory or low memory.
|
||||
For simplicity only one instance is used in this
|
||||
linker file.
|
||||
|
||||
Contiguous SARAM memory blocks can be combined
|
||||
if required to create a larger memory block.
|
||||
*/
|
||||
|
||||
|
||||
MEMORY
|
||||
{
|
||||
PAGE 0: /* Program Memory */
|
||||
/* Memory (RAM/FLASH/OTP) blocks can be moved to PAGE1 for data allocation */
|
||||
|
||||
ZONE0 : origin = 0x004000, length = 0x001000 /* XINTF zone 0 */
|
||||
RAML0 : origin = 0x008000, length = 0x001000 /* on-chip RAM block L0 */
|
||||
RAML1 : origin = 0x009000, length = 0x001000 /* on-chip RAM block L1 */
|
||||
RAML2 : origin = 0x00A000, length = 0x001000 /* on-chip RAM block L2 */
|
||||
RAML3 : origin = 0x00B000, length = 0x001000 /* on-chip RAM block L3 */
|
||||
ZONE6 : origin = 0x0100000, length = 0x100000 /* XINTF zone 6 */
|
||||
ZONE7A : origin = 0x0200000, length = 0x00FC00 /* XINTF zone 7 - program space */
|
||||
FLASHH : origin = 0x300000, length = 0x008000 /* on-chip FLASH */
|
||||
FLASHG : origin = 0x308000, length = 0x008000 /* on-chip FLASH */
|
||||
FLASHF : origin = 0x310000, length = 0x008000 /* on-chip FLASH */
|
||||
FLASHE : origin = 0x318000, length = 0x008000 /* on-chip FLASH */
|
||||
FLASHD : origin = 0x320000, length = 0x008000 /* on-chip FLASH */
|
||||
FLASHC : origin = 0x328000, length = 0x008000 /* on-chip FLASH */
|
||||
FLASHA : origin = 0x338000, length = 0x007F80 /* on-chip FLASH */
|
||||
CSM_RSVD : origin = 0x33FF80, length = 0x000076 /* Part of FLASHA. Program with all 0x0000 when CSM is in use. */
|
||||
BEGIN : origin = 0x33FFF6, length = 0x000002 /* Part of FLASHA. Used for "boot to Flash" bootloader mode. */
|
||||
CSM_PWL : origin = 0x33FFF8, length = 0x000008 /* Part of FLASHA. CSM password locations in FLASHA */
|
||||
OTP : origin = 0x380400, length = 0x000400 /* on-chip OTP */
|
||||
ADC_CAL : origin = 0x380080, length = 0x000009 /* ADC_cal function in Reserved memory */
|
||||
|
||||
IQTABLES : origin = 0x3FE000, length = 0x000b50 /* IQ Math Tables in Boot ROM */
|
||||
IQTABLES2 : origin = 0x3FEB50, length = 0x00008c /* IQ Math Tables in Boot ROM */
|
||||
FPUTABLES : origin = 0x3FEBDC, length = 0x0006A0 /* FPU Tables in Boot ROM */
|
||||
ROM : origin = 0x3FF27C, length = 0x000D44 /* Boot ROM */
|
||||
RESET : origin = 0x3FFFC0, length = 0x000002 /* part of boot ROM */
|
||||
VECTORS : origin = 0x3FFFC2, length = 0x00003E /* part of boot ROM */
|
||||
|
||||
PAGE 1 : /* Data Memory */
|
||||
/* Memory (RAM/FLASH/OTP) blocks can be moved to PAGE0 for program allocation */
|
||||
/* Registers remain on PAGE1 */
|
||||
|
||||
BOOT_RSVD : origin = 0x000000, length = 0x000050 /* Part of M0, BOOT rom will use this for stack */
|
||||
RAMM0 : origin = 0x000050, length = 0x0003B0 /* on-chip RAM block M0 */
|
||||
RAMM1 : origin = 0x000400, length = 0x000400 /* on-chip RAM block M1 */
|
||||
RAML4 : origin = 0x00C000, length = 0x001000 /* on-chip RAM block L1 */
|
||||
RAML5 : origin = 0x00D000, length = 0x001000 /* on-chip RAM block L1 */
|
||||
RAML6 : origin = 0x00E000, length = 0x001000 /* on-chip RAM block L1 */
|
||||
RAML7 : origin = 0x00F000, length = 0x001000 /* on-chip RAM block L1 */
|
||||
ZONE7B : origin = 0x20FC00, length = 0x000400 /* XINTF zone 7 - data space */
|
||||
FLASHB : origin = 0x330000, length = 0x008000 /* on-chip FLASH */
|
||||
}
|
||||
|
||||
/* Allocate sections to memory blocks.
|
||||
Note:
|
||||
codestart user defined section in DSP28_CodeStartBranch.asm used to redirect code
|
||||
execution when booting to flash
|
||||
ramfuncs user defined section to store functions that will be copied from Flash into RAM
|
||||
*/
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
|
||||
/* Allocate program areas: */
|
||||
.cinit : > FLASHA PAGE = 0
|
||||
.pinit : > FLASHA, PAGE = 0
|
||||
.text : > FLASHA PAGE = 0
|
||||
codestart : > BEGIN PAGE = 0
|
||||
ramfuncs : LOAD = FLASHD,
|
||||
RUN = RAML0,
|
||||
LOAD_START(_RamfuncsLoadStart),
|
||||
LOAD_END(_RamfuncsLoadEnd),
|
||||
RUN_START(_RamfuncsRunStart),
|
||||
LOAD_SIZE(_RamfuncsLoadSize),
|
||||
PAGE = 0
|
||||
|
||||
csmpasswds : > CSM_PWL PAGE = 0
|
||||
csm_rsvd : > CSM_RSVD PAGE = 0
|
||||
|
||||
/* Allocate uninitalized data sections: */
|
||||
.stack : > RAML7 PAGE = 1 // CHANGES RAMM1 was here. Also 0x400 was added in linker general options (in -heap) and 0x300 at stack was changed to 0x400
|
||||
.ebss : > RAML4 PAGE = 1
|
||||
.esysmem : > RAMM1 PAGE = 1
|
||||
|
||||
/* Initalized sections go in Flash */
|
||||
/* For SDFlash to program these, they must be allocated to page 0 */
|
||||
.econst : > FLASHA PAGE = 0
|
||||
.switch : > FLASHA PAGE = 0
|
||||
|
||||
/* Allocate IQ math areas: */
|
||||
IQmath : > FLASHC PAGE = 0 /* Math Code */
|
||||
IQmathTables : > IQTABLES, PAGE = 0, TYPE = NOLOAD
|
||||
|
||||
/* Uncomment the section below if calling the IQNexp() or IQexp()
|
||||
functions from the IQMath.lib library in order to utilize the
|
||||
relevant IQ Math table in Boot ROM (This saves space and Boot ROM
|
||||
is 1 wait-state). If this section is not uncommented, IQmathTables2
|
||||
will be loaded into other memory (SARAM, Flash, etc.) and will take
|
||||
up space, but 0 wait-state is possible.
|
||||
*/
|
||||
/*
|
||||
IQmathTables2 : > IQTABLES2, PAGE = 0, TYPE = NOLOAD
|
||||
{
|
||||
|
||||
IQmath.lib<IQNexpTable.obj> (IQmathTablesRam)
|
||||
|
||||
}
|
||||
*/
|
||||
|
||||
FPUmathTables : > FPUTABLES, PAGE = 0, TYPE = NOLOAD
|
||||
|
||||
/* Allocate DMA-accessible RAM sections: */
|
||||
DMARAML4 : > RAML4, PAGE = 1
|
||||
DMARAML5 : > RAML5, PAGE = 1
|
||||
DMARAML6 : > RAML6, PAGE = 1
|
||||
DMARAML7 : > RAML7, PAGE = 1
|
||||
|
||||
/* Allocate 0x400 of XINTF Zone 7 to storing data */
|
||||
ZONE7DATA : > ZONE7B, PAGE = 1
|
||||
|
||||
/* .reset is a standard section used by the compiler. It contains the */
|
||||
/* the address of the start of _c_int00 for C Code. /*
|
||||
/* When using the boot ROM this section and the CPU vector */
|
||||
/* table is not needed. Thus the default type is set here to */
|
||||
/* DSECT */
|
||||
.reset : > RESET, PAGE = 0, TYPE = DSECT
|
||||
vectors : > VECTORS PAGE = 0, TYPE = DSECT
|
||||
|
||||
/* Allocate ADC_cal function (pre-programmed by factory into TI reserved memory) */
|
||||
.adc_cal : load = ADC_CAL, PAGE = 0, TYPE = NOLOAD
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
//===========================================================================
|
||||
// End of file.
|
||||
//===========================================================================
|
||||
*/
|
||||
|
@ -0,0 +1,229 @@
|
||||
// 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"
|
||||
|
||||
|
||||
//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);
|
||||
|
||||
canSpace::CAN canTest(canSpace::CANB);
|
||||
|
||||
interface::DigitalIO digitalIO;
|
||||
interface::DigitalIODataRegister digitalInputReg;
|
||||
interface::DigitalIODataRegister digitalOutputReg;
|
||||
|
||||
// RX
|
||||
canSpace::CANMessage DOMessage;
|
||||
canSpace::CANMessage messageSettings;
|
||||
canSpace::CANMessage MODBUS_CPU_COMM_Message;
|
||||
|
||||
// TX
|
||||
canSpace::CANMessage DIMessage;
|
||||
canSpace::CANMessage MODBUS_COMM_CPU_Message;
|
||||
canSpace::CANMessage SoftVersionMessage;
|
||||
Uint32 array[25] = {0};
|
||||
|
||||
struct SoftwareVersion{
|
||||
Uint16 DSP;
|
||||
Uint16 CPLD;
|
||||
};
|
||||
|
||||
SoftwareVersion softVersion = { .DSP = 101, .CPLD = 202 };
|
||||
|
||||
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;
|
||||
|
||||
canTest.initGpio();
|
||||
canTest.config();
|
||||
canTest.configTxMBox(canSpace::DIGITAL_INPUT_MBOX, canSpace::MsgID(0x30), canSpace::MsgCtrlReg(0x3));
|
||||
|
||||
DIMessage.dataLength = 3;
|
||||
DIMessage.mdl.byte.BYTE0 = 0x11;
|
||||
DIMessage.mdl.byte.BYTE1 = 0x22;
|
||||
DIMessage.mdl.byte.BYTE2 = 0x33;
|
||||
|
||||
MODBUS_COMM_CPU_Message.dataLength = 6;
|
||||
MODBUS_COMM_CPU_Message.mdl.byte.BYTE0 = 0xA;
|
||||
MODBUS_COMM_CPU_Message.mdl.byte.BYTE1 = 0xB;
|
||||
MODBUS_COMM_CPU_Message.mdl.byte.BYTE2 = 0xC;
|
||||
MODBUS_COMM_CPU_Message.mdl.byte.BYTE3 = 0xD;
|
||||
MODBUS_COMM_CPU_Message.mdh.byte.BYTE4 = 0xE;
|
||||
MODBUS_COMM_CPU_Message.mdh.byte.BYTE5 = 0xF;
|
||||
|
||||
SoftVersionMessage.dataLength = 2;
|
||||
SoftVersionMessage.mdl.byte.BYTE0 = softVersion.DSP;
|
||||
SoftVersionMessage.mdl.byte.BYTE0 = softVersion.CPLD;
|
||||
|
||||
digitalIO.setup((Uint16*)0x4000);
|
||||
|
||||
// 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++;
|
||||
|
||||
// ожидать получения данных при remote frame
|
||||
// get cpld version with xintf here
|
||||
// if (init){
|
||||
// init = false;
|
||||
// // в main положить
|
||||
// canTest.updateTXMessage(canSpace::COMM_VERSION_MBOX, SoftVersionMessage);
|
||||
// }
|
||||
|
||||
// if (canTest.isNewMessage(canSpace::MODBUS_SETTINGS_MBOX)){
|
||||
// canTest.receiveMsg(canSpace::MODBUS_SETTINGS_MBOX, messageSettings);
|
||||
// modbusInit++;
|
||||
// }
|
||||
|
||||
}//end while
|
||||
|
||||
}//end idle_loop()
|
||||
|
||||
|
||||
interrupt void cpu_timer0_isr(void)
|
||||
{
|
||||
CpuTimer0.InterruptCount++;
|
||||
// if(canTest.isNewMessage()){
|
||||
// canTest.receiveMsg(canSpace::DIGITAL_OUTPUT_MBOX, DOMessage);
|
||||
// canTest.receiveMsg(canSpace::MODBUS_DATA_CPU_TO_COMM_MBOX, MODBUS_CPU_COMM_Message);
|
||||
// testCounter++;
|
||||
// }
|
||||
|
||||
// digitalOutputReg.all = digitalOutputReg.all;
|
||||
// digitalIO.writeDigitalIO(digitalOutputReg.all);
|
||||
|
||||
PieCtrlRegs.PIEACK.all |= PIEACK_GROUP1;
|
||||
}//end
|
||||
|
||||
|
||||
interrupt void cpu_timer1_isr(){
|
||||
CpuTimer1.InterruptCount++;
|
||||
|
||||
// digitalIO.readDigitalIO(DIMessage.mdl.all);
|
||||
// digitalIO.readDigitalIO(digitalInputReg.all);
|
||||
// DIMessage.mdl.all = digitalInputReg.all;
|
||||
canTest.transmitMsg(canSpace::DIGITAL_INPUT_MBOX, DIMessage);
|
||||
}
|
||||
|
||||
|
||||
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;
|
||||
}
|
@ -0,0 +1,166 @@
|
||||
// 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;
|
||||
}
|
@ -0,0 +1,28 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<configurations XML_version="1.2" id="configurations_0">
|
||||
|
||||
|
||||
<configuration XML_version="1.2" id="Texas Instruments XDS100v3 USB Debug Probe_0">
|
||||
|
||||
<instance XML_version="1.2" desc="Texas Instruments XDS100v3 USB Debug Probe_0" href="connections/TIXDS100v3_Dot7_Connection.xml" id="Texas Instruments XDS100v3 USB Debug Probe_0" xml="TIXDS100v3_Dot7_Connection.xml" xmlpath="connections"/>
|
||||
|
||||
<connection XML_version="1.2" id="Texas Instruments XDS100v3 USB Debug Probe_0">
|
||||
|
||||
<instance XML_version="1.2" href="drivers/tixds100v2c28x.xml" id="drivers" xml="tixds100v2c28x.xml" xmlpath="drivers"/>
|
||||
|
||||
<property Type="choicelist" Value="1" id="Emulator Selection">
|
||||
<choice Name="Select by serial number" value="0">
|
||||
<property Type="stringfield" Value="FT57N1L8" id="-- Enter the serial number"/>
|
||||
</choice>
|
||||
</property>
|
||||
<platform XML_version="1.2" id="platform_0">
|
||||
|
||||
<instance XML_version="1.2" desc="TMS320F28335_0" href="devices/f28335.xml" id="TMS320F28335_0" xml="f28335.xml" xmlpath="devices"/>
|
||||
|
||||
</platform>
|
||||
|
||||
</connection>
|
||||
|
||||
</configuration>
|
||||
|
||||
</configurations>
|
@ -0,0 +1,28 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<configurations XML_version="1.2" id="configurations_0">
|
||||
|
||||
|
||||
<configuration XML_version="1.2" id="Texas Instruments XDS100v3 USB Debug Probe_0">
|
||||
|
||||
<instance XML_version="1.2" desc="Texas Instruments XDS100v3 USB Debug Probe_0" href="connections/TIXDS100v3_Dot7_Connection.xml" id="Texas Instruments XDS100v3 USB Debug Probe_0" xml="TIXDS100v3_Dot7_Connection.xml" xmlpath="connections"/>
|
||||
|
||||
<connection XML_version="1.2" id="Texas Instruments XDS100v3 USB Debug Probe_0">
|
||||
|
||||
<instance XML_version="1.2" href="drivers/tixds100v2c28x.xml" id="drivers" xml="tixds100v2c28x.xml" xmlpath="drivers"/>
|
||||
|
||||
<property Type="choicelist" Value="1" id="Emulator Selection">
|
||||
<choice Name="Select by serial number" value="0">
|
||||
<property Type="stringfield" Value="TI7EZCHI" id="-- Enter the serial number"/>
|
||||
</choice>
|
||||
</property>
|
||||
<platform XML_version="1.2" id="platform_0">
|
||||
|
||||
<instance XML_version="1.2" desc="TMS320F28335_0" href="devices/f28335.xml" id="TMS320F28335_0" xml="f28335.xml" xmlpath="devices"/>
|
||||
|
||||
</platform>
|
||||
|
||||
</connection>
|
||||
|
||||
</configuration>
|
||||
|
||||
</configurations>
|
@ -0,0 +1,42 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<configurations XML_version="1.2" id="configurations_0">
|
||||
|
||||
|
||||
|
||||
<configuration XML_version="1.2" id="configuration_0">
|
||||
|
||||
|
||||
|
||||
<instance XML_version="1.2" desc="Texas Instruments XDS100v3 USB Debug Probe" href="connections/TIXDS100v3_Dot7_Connection.xml" id="Texas Instruments XDS100v3 USB Debug Probe" xml="TIXDS100v3_Dot7_Connection.xml" xmlpath="connections"/>
|
||||
|
||||
|
||||
|
||||
<connection XML_version="1.2" id="Texas Instruments XDS100v3 USB Debug Probe">
|
||||
|
||||
|
||||
|
||||
<instance XML_version="1.2" href="drivers/tixds100v2c28x.xml" id="drivers" xml="tixds100v2c28x.xml" xmlpath="drivers"/>
|
||||
|
||||
|
||||
|
||||
<platform XML_version="1.2" id="platform_0">
|
||||
|
||||
|
||||
|
||||
<instance XML_version="1.2" desc="TMS320F28335" href="devices/f28335.xml" id="TMS320F28335" xml="f28335.xml" xmlpath="devices"/>
|
||||
|
||||
|
||||
|
||||
</platform>
|
||||
|
||||
|
||||
|
||||
</connection>
|
||||
|
||||
|
||||
|
||||
</configuration>
|
||||
|
||||
|
||||
|
||||
</configurations>
|
@ -0,0 +1,9 @@
|
||||
The 'targetConfigs' folder contains target-configuration (.ccxml) files, automatically generated based
|
||||
on the device and connection settings specified in your project on the Properties > General page.
|
||||
|
||||
Please note that in automatic target-configuration management, changes to the project's device and/or
|
||||
connection settings will either modify an existing or generate a new target-configuration file. Thus,
|
||||
if you manually edit these auto-generated files, you may need to re-apply your changes. Alternatively,
|
||||
you may create your own target-configuration file for this project and manage it manually. You can
|
||||
always switch back to automatic target-configuration management by checking the "Manage the project's
|
||||
target-configuration automatically" checkbox on the project's Properties > General page.
|
Loading…
Reference in New Issue