The code on this repository runs on the Cortex-M3 core embedded on the SmartFusion2 FPGA.
Most of the code is under main.c
, in the while (1)
loop:
REQ_HK
data is prepared once a second; the second counting is handled
by Timer1_IRQHandler
;REQ_PAYLOAD
data is prepared once the DAQ has finished; note that this
is a lenghty process (several hundreds of microseconds), especially if
histogram binning is performed;if
/else if
statements:
if (has_send)
for MSP send commands (from CUBES to OBC);else if (has_rcvd)
for MSP receive commands (by CUBES from OBC);else if (has_syscommand)
for MSP system commands (for CUBES from OBC).MSP callbacks functions and main I2C ISR are also present at the bottom of
main.c
.
msp_expsend_start
is where the MSP send buffer is assigned to the data to
be sent; the has_send
variable is also assigned, which informs the main
loop to update with new send data based on MSP command;msp_expsend_data
(msp_expsend_complete
only
clears the REQ_PAYLOAD
buffer so it doesn't contain stale data in case of a
new REQ_PAYLOAD
being issued);msp_exprecv_start
clears the MSP receive buffer for new data;msp_exprecv_data
buffers in data retrieved in MSP framesmsp_exprecv_complete
informs the main loop the data is ready to be processedI2C1_SlaveWriteHandler
,
which essentially (1) waits for an MSP frame from the OBC, msp_recv_callback
;
and (2) sends a reply MSP frame to the OBC, msp_send_callback
.msp_expsend_start
or msp_exprecv_data
), then click Open Call Hierarchy.Other folders under cubes-fw
contain various APIs for handling devices
on the CUBES board.
cubes-fw
firmware // Code generated from Libero
hk_adc // API to handle the ADS1015 ADC
hvps // API to handle the C11204-02 HVPS module
mem // API to handle CUBES memory accesses
msp // MSP API functions, generated using the Python script supplied with MSP
utils // Various utilitary APIs, e.g., to handle the on-board LED
firmware
foldermsp
foldercubes-fw
repository, obtain the MSP repository from GitLab:
git clone https://gitlab.com/kth-mist/msp msp-repo
cubes-fw/msp/msp_configuration.h
to somewhere you know; this
file will need to replace whatever gets generated by the MSP conf.py
script!cubes-fw/msp/
folder;msp-repo/conf.py
to generate a new set of MSP files;msp-repo/target/
to cubes-fw/msp/
.msp_configuration.h
file you saved earlier over that generated by
the conf.py
script.CUBES should be programmed using a FlashPro5 programmer from Microchip. The standard 10-pin JTAG connector supplied with the FlashPro5 should be adapted to the 1.27-mm pitch programming port on the CUBES board using a 2.54-to-1.27-mm adapter:
One such adapter can be found in AlbaNova, in the "PoGO lab" on the bottom floor of the building. The adaptor should be located in the plastic box labeled "CUBES".
Each CUBES board has its own ID, labeled on the top side of CUBES boards, corresponding to
the -Z face of the satellite. The number on this label corresponds to the second character
in the BOARD_ID
macro, defined via a -D
compiler flag (see programming sections below):
BOARD_ID = C<number-on-label>
(C
stands for CUBES, <number-on-label>
corresponds to
board number, 1
through 5
)Board IDs:
BOARD_ID = C3
for CUBES-1 on MISTBOARD_ID = C4
for CUBES-2 on MISTOpen the Properties window for the cubes-fw
project by either right-clicking
the project in SoftConsole and pressing Properties in the pop-up menu, or
selecting the project in SoftConsole and hitting Alt+Enter on your keyboard.
Navigate to C/C++ Build > Settings > GNU ARM Cross C Linker > General and double-click the script file:
Ensure the esram
linker script is used for programming:
Still in the Properties window, C/C++ Build > Settings, navigate to GNU ARM Cross C Compiler > Preprocessor.
Change the BOARD_ID
macro for the board you are programming as outlined in
the Board ID section above (note the escape characters before each
double quote):
BOARD_ID = \"C3\"
orBOARD_ID = \"C4\"
Change the MSP_EXP_ADDR
macro for the board according to the i2c.h
config file
under the obcsw
GitLab repository, nominally:
MSP_EXP_ADDR = 0x35
for CUBES-1MSP_EXP_ADDR = 0x36
for CUBES-2Press the Apply and Close button in the Properties dialog.
Connect the FlashPro5 programmer to the CUBES PCB of interest.
Press the Debug (bug) button on the SoftConsole interface.
The code should now be programmed to CUBES volatile memory; HK can be read out from CUBES and checked if it "makes sense".
Open the Properties window for the cubes-fw
project by either right-clicking
the project in SoftConsole and pressing Properties in the pop-up menu, or
selecting the project in SoftConsole and hitting Alt+Enter on your keyboard.
Navigate to C/C++ Build > Settings > GNU ARM Cross C Linker > General and double-click the linker script file:
To ensure the code is programmed to non-volatile memory, change esram
to envm
at the very end of the text line in the dialog that appears:
Still in the Properties window, C/C++ Build > Settings, navigate to GNU ARM Cross C Compiler > Preprocessor.
Change the BOARD_ID
macro for the board you are programming as outlined in
the Board ID section above (note the escape characters before each
double quote):
Change the MSP_EXP_ADDR
macro for the board according to the i2c.h
config file
under the obcsw
GitLab repository, nominally:
MSP_EXP_ADDR = 0x35
for CUBES-1MSP_EXP_ADDR = 0x36
for CUBES-2Click the Debug (yes -- Debug!) button in the SoftConsole main window to program the board. The Console window should display information about it programming to NVM. Programming should also take longer than in the case of RAM.
End the debug session from SoftConsole's Debug perspective.
Move the FlashPro5 programmer from the board you just programmed to the next one you want to program.
Repeat steps 4-7.
BOARD_ID
and MSP_EXP_ADDR
macros need to be different.Reset the CUBES stackup by power-cycling the 5V_CUBES
power rail.
Perform a REQ_HK
MSP command from each of the two CUBES boards and ensure the
readouts "make sense".
IMPORTANT:
Revert the .cproject
file back to its original contents, to ensure you are not
unnecessarily programming to NVM next time:
git restore .cproject