summaryrefslogtreecommitdiff
path: root/SPI.h
diff options
context:
space:
mode:
authorJoshua Drake <joshua.ellis.drake@gmail.com>2023-11-03 06:07:59 -0500
committerJoshua Drake <joshua.ellis.drake@gmail.com>2023-11-03 06:07:59 -0500
commitb8cf25e2ba80c484846437059563779d9ca923cc (patch)
tree3ed486583d3291ddb2463180c12af87061aba05d /SPI.h
Initial commit.
Diffstat (limited to 'SPI.h')
-rw-r--r--SPI.h495
1 files changed, 495 insertions, 0 deletions
diff --git a/SPI.h b/SPI.h
new file mode 100644
index 0000000..3c7cf70
--- /dev/null
+++ b/SPI.h
@@ -0,0 +1,495 @@
+/*
+ * File: SPI.h
+ * Author: Joshua Ellis Drake
+ */
+
+// This is a guard condition so that contents of this file are not included
+// more than once.
+#ifndef XC_SPI_H
+#define XC_SPI_H
+
+#include "mssp1_spi.h"
+
+#define MY_BUFFER_SIZE 6 //3 Devices, each of which is 16 bit. (16/8)*3=6
+
+ enum messages
+ {
+ OUT = 0, //Output control On or Off
+ BIM, //Sets Latch off or Auto Restart Mode
+ MAPIN0, //Mapping of IN0 to OUTx
+ MAPIN1, //Mapping of IN1 to OUTx
+ INST, //Reports Transmission Bit Errors and Reports INx pin Status
+ OLDCC, //Open Load Diagnostic Current Control
+ OSM, //Output Status Monitor | Reports open circuit conditions in OFF sate | Reports output status in the ON state.
+ OLOM, //Open Load On Monitor
+ HWCR, //Hardware Configuration Register | HWCR.ACT Active Mode Transitions | HWCR.RST SPI Register Reset | HWCR.PAR Sets Parallel Channel Operation
+ OCL, //Output Clear Latch | Clears the error latch for a selected output
+ PWMCR, //PWM Configuration Register | HWCR_PWM.ADJ Base PWM frequency adjust | HWCR_PWM.PWM1 PWM Generator 1 Activation | HWCR_PWM.PWM0 PWM Generator 0 Activation
+ PWMGC0, //PWM_CR0.FREQ Sets internal divide by clock of PWM generator for Gen 0 | PWM_CR0.DC Sets PWM Generator 0 duty cycle
+ PWMGC1, //PWM_CR1.FREQ Sets internal divide by clock of PWM generator for Gen 1 | PWM_CR1.DC Sets PWM Generator 1 duty cycle
+ PWMOC, //Selects the active PWM generator for OUTx
+ PWMMAP //Selects one of the two PWM generators
+ };
+
+ void Message_OUT(uint8_t Ohm_150, uint8_t Ohm_68, bool testLED);
+/**
+ @Summary
+ Enables a selected quantity of 150 ohm resistors and 68 ohm resistors.
+
+ @Description
+ In 400V mode the user can select a certain quantity of both 68 and 150 ohm resistors to be enabled,
+ while in 550V mode the user can only access the 150ohm resistors. A test LED can also be enabled.
+
+ @Preconditions
+ The MSSP1_SPI_Initialize routine must have been called for the specified
+ MSSP1_SPI driver instance. System must be in 400V mode for 68 ohm resistors to be accessible.
+
+ @Param
+ 150Ohm - Number of 150 ohm resistors to enable (up to 15).
+ 68Ohm - Number of 68 ohm resistors to enable (up to 5).
+ testLED - True enables the test LED.
+
+ @Returns
+ Void.
+
+ @Example
+ Message_OUT(15, 5, false); //Max Load with testLED turned off.
+
+*/
+ void Message_BIM(uint8_t outputs[3]);
+/**
+ @Summary
+ Chooses whether an output pin will latch off in the event of an overload or restart.
+
+ @Description
+Bulb Inrush Mode bits (BIM.OUTn)
+0B (default) Output latches off with overload
+1B Output restarts with overload
+DATA = Channel number 7 to 0 (7:0)
+
+ @Preconditions
+ The MSSP1_SPI_Initialize routine must have been called for the specified
+ MSSP1_SPI driver instance.
+
+ @Param
+ outputs[] - An array containing the data to be written to each of the three registers.
+
+ @Returns
+ Void.
+
+ @Example
+ Message_BIM({0xFF, 0x11, 0x00}); //All outputs of the first chip will restart with overload, two of the second chip's outputs will restart on overload,
+ and all of the remaining pins will latch off with overload.
+
+*/
+ void Message_MAPIN0(uint8_t outputs[3]);
+/**
+ @Summary
+ Chooses which output pins are controlled by IN0.
+
+ @Description
+Input Mapping (IN0) bits (MAPIN0.OUTn)
+0B (default) No connection to input pin
+1B Output is connected to the input pin
+DATA = Channel number 7 to 0 (7:0)
+Note ? Channel 2 has the corresponding bit set to ?1? by default
+
+ @Preconditions
+ The MSSP1_SPI_Initialize routine must have been called for the specified
+ MSSP1_SPI driver instance.
+
+ @Param
+ outputs[] - An array containing the data to be written to each of the three registers.
+
+ @Returns
+ Void.
+
+ @Example
+ Message_MAPIN0({0x00, 0x00, 0x00}); //All outputs of each of the three driver ICs are not connected to IN0.
+
+*/
+
+ void Message_MAPIN1(uint8_t outputs[3]);
+/**
+ @Summary
+ Chooses which output pins are controlled by IN0.
+
+ @Description
+Input Mapping (IN1) bits (MAPIN1.OUTn)
+0B (default) No connection to input pin
+1B Output is connected to the input pin
+DATA = Channel number 7 to 0 (7:0)
+Note ? Channel 3 has the corresponding bit set to ?1? by default
+
+ @Preconditions
+ The MSSP1_SPI_Initialize routine must have been called for the specified
+ MSSP1_SPI driver instance.
+
+ @Param
+ outputs[] - An array containing the data to be written to each of the three registers.
+
+ @Returns
+ Void.
+
+ @Example
+ Message_MAPIN1({0x00, 0x00, 0x00}); //All outputs of each of the three driver ICs are not connected to IN1.
+
+*/
+ void Message_INST(void);
+/**
+ @Summary
+ Retrieves data regarding the input pins and TER bit.
+
+ @Description
+Input Status Monitor
+TER bit bit (TER) (7)
+0B Previous transmission was successful
+1B (default) Previous transmission failed
+ *
+Inx Bit bits (INST.RES) (6:2) ? reserved, bits (INST.INn) (1:0)
+0B (default) The input pin is set low
+1B The input pin is set high
+
+ @Preconditions
+ The MSSP1_SPI_Initialize routine must have been called for the specified
+ MSSP1_SPI driver instance.
+
+ @Param
+ Void.
+
+ @Returns
+ Void.
+
+ @Example
+ Message_INST(void); // :)
+
+*/
+ void Message_DAGIOL(uint8_t outputs[3]);
+/**
+ @Summary
+ Open Load Diagnostic Current Control
+
+ @Description
+bits (DIAG_IOL.OUTn)
+0B (default) Diagnostic current is not enabled
+1B Diagnostic current is enabled
+DATA = Channel number 7 to 0 (7:0)
+
+ @Preconditions
+ The MSSP1_SPI_Initialize routine must have been called for the specified
+ MSSP1_SPI driver instance.
+
+ @Param
+ outputs[] - An array containing the channel numbers from which to write or obtain information.
+
+ @Returns
+ Void.
+
+ @Example
+ Message_DAGIOL({0xFF, 0xFF, 0xFF}); //Obtains information from all channels of the three connected devices.
+
+*/
+ void Message_DAGOSM(void);
+/**
+ @Summary
+ Output Status Monitor Bits (DIAG_OSM.OUTn)
+
+ @Description
+0B (default) Voutx is less than the Output Status Monitor Threshold Voltage 3.3 V (typ)
+1B Voutx is more than the Output Status Monitor Threshold Voltage 3.3 V (typ)
+DATA = Channel number 7 to 0 (7:0)
+
+ @Preconditions
+ The MSSP1_SPI_Initialize routine must have been called for the specified
+ MSSP1_SPI driver instance.
+
+ @Param
+ Void.
+
+ @Returns
+ Void.
+
+ @Example
+ Message_DAGOSM(void);
+
+*/
+ void Message_DAGOLON(void);
+/**
+ @Summary
+ Open Load On Monitor Bits (DIAG_OLON.OUTn)
+
+ @Description
+0B (default) Normal operation or diagnostic performed with channel off
+1B Open load On detected
+DATA = Channel number 7 to 0 (7:0)
+
+ @Preconditions
+ The MSSP1_SPI_Initialize routine must have been called for the specified
+ MSSP1_SPI driver instance.
+
+ @Param
+ Void.
+
+ @Returns
+ Void.
+
+ @Example
+ Message_DAGOLON(void);
+
+*/
+ void Message_DAGOLONEN(uint8_t outputs[3]);
+/**
+ @Summary
+ Open Load On Diagnostic Control
+
+ @Description
+bits (7:4) ? reserved,
+bits 1000B , 1001B , 1011B , 1100B , 1101B , 1100B ? reserved
+bits (DIAG_OLONEN.MUX) (3:0)
+0000B Open Load ON active channel 0
+0001B Open Load ON active channel 1
+0010B Open Load ON active channel 2
+0011B Open Load ON active channel 3
+0100B Open Load ON active channel 4
+0101B Open Load ON active channel 5
+0110B Open Load ON active channel 6
+0111B Open Load ON active channel 7
+1010B Open Load ON Diagnostic Loop Start
+1111B (default) Open Load ON not active
+
+ @Preconditions
+ The MSSP1_SPI_Initialize routine must have been called for the specified
+ MSSP1_SPI driver instance.
+
+ @Param
+ outputs[] - An array containing the status of the specified channel of each of the three ICs.
+
+ @Returns
+ Void.
+
+ @Example
+ Message_DAGOLONEN({0b00000000, 0xFF, 0xFF}); //Open Load ON active on channel 0 of the first IC.
+
+*/
+ void Message_HWCR(uint8_t outputs[3]);
+/**
+ @Summary
+ Hardware Configuration Register Bits
+
+ @Description
+Active Mode bits (HWCR.ACT) (7)
+0B (default) Normal operation
+or device leaves Active Mode
+1B Device enters Active Mode
+ *
+SPI Register Reset bits (HWCR.RST) (6)
+0B (default) Normal operation
+1B Reset command executed
+ERRn bits are not cleared by a reset command for safety reasons
+ *
+Channels Operating in Parallel bits (HWCR.PAR) (3:0)
+0B (default) Normal operation
+1B Two neighboring channels have overload and overtemperature
+synchronized. See section ?Outputs in Parallel? for output combinations
+
+ @Preconditions
+ The MSSP1_SPI_Initialize routine must have been called for the specified
+ MSSP1_SPI driver instance.
+
+ @Param
+ outputs[] - An array containing the Active Mode, SPI Register, and "Channels Operating in Parallel" bits for each device.
+
+ @Returns
+ Void.
+
+ @Example
+ Message_DAGOLONEN({0b11xx0000, 0b00xx0000, 0b00xx0000}); //Device 1 enters active mode, resets SPI operation, and maintains normal latch operation.
+
+*/
+ void Message_HWCROCL(uint8_t outputs[3]);
+/**
+ @Summary
+ Output Latch (ERRn) Clear bits (HWCR_OCL.OUTn)
+
+ @Description
+0B (default) Normal operation
+1B Clear the error latch for the selected output
+The HWCR_OCL.OUTn bit is set back to ?0? internally after de?latching the
+channel
+DATA = 7 to 0 (7:0)
+
+ @Preconditions
+ The MSSP1_SPI_Initialize routine must have been called for the specified
+ MSSP1_SPI driver instance.
+
+ @Param
+ outputs[] - An array containing bits corresponding to the latch error reset of each channel.
+
+ @Returns
+ Void.
+
+ @Example
+ Message_DAGOLONEN({0xFF, 0xFF, 0xFF}); //Reset Latch Errors are reset.
+
+*/
+ void Message_HWCRPWM(uint8_t outputs[3]);
+/**
+ @Summary
+ Hardware Clear for all PWM registers.
+
+ @Description
+PWM Configuration Register (HWCR_PWM.RES) (3:2) (reserved)
+PWM Adjustment bits (HWCR_PWM.ADJ) (7:4)
+HWCR_PWM.ADJ Bit
+Absolute delta for fINT Relative delta between steps
+0000B (reserved)
+0001B Base Frequency ?35.0% ?35.0% (66.3 kHz[typ])
+0010B Base Frequency ?30.0%
+0011B Base Frequency ?25.0%
+0100B Base Frequency ?20.0%
+0101B Base Frequency ?15.0%
+0110B Base Frequency ?10.0%
+0111B Base Frequency ?5.0%
+1000B Base Frequency fINT (102 kHz [typ])(default)
+1001B Base Frequency +5.0%
+1010B Base Frequency +10.0%
+1011B Base Frequency +15.0%
+1100B Base Frequency +20.0%
+1101B Base Frequency +25.0%
+1110B Base Frequency +30.0%
+1111B Base Frequency +35.0% +35.0 (137.7 kHz[typ])
+
+PWM1 Active bits (HWCR_PWM.PWM1) (1)
+0B (default) PWM Generator 1 not active
+1B PWM Generator 1 active
+PWM0 Active (HWCR_PWM.PWM0) (0)
+0B (default) PWM Generator 0 not active
+1B PWM Generator 0 active
+
+ @Preconditions
+ The MSSP1_SPI_Initialize routine must have been called for the specified
+ MSSP1_SPI driver instance.
+
+ @Param
+ outputs[] - An array containing bits corresponding to the PWM Hardware.
+
+ @Returns
+ Void.
+
+ @Example
+ Message_HWCRPWM({0b1000xx00, 0b1000xx00, 0b1000xx00}); //Set all three ICs to typical base frequency and disable both PWM Generators.
+
+*/
+ void Message_PWMCR0(uint16_t outputs[3]);
+/**
+ @Summary
+ PWM Generator 0 Configuration
+
+ @Description
+CR0 Frequency (PWM_CR0.FREQ) (9:8)
+00B Internal clock divided by 1024 (100 Hz) (default)
+01B Internal clock divided by 512 (200 Hz)
+10B Internal clock divided by 256 (400 Hz)
+11B 100% Duty Cycle.
+CR0 generator on/off control (PWM_CRO.DC) (7:0)
+00000000B PWM generator is off. (default)
+11111111B PWM generator is On (99.61% DC).
+
+ @Preconditions
+ The MSSP1_SPI_Initialize routine must have been called for the specified
+ MSSP1_SPI driver instance.
+
+ @Param
+ outputs[] - A 16 bit array containing bits which adjust the PWM0 frequency as well as enable/disable the generator itself.
+
+ @Returns
+ Void.
+
+ @Example
+ Message_PWMCR0({0xX000, 0xX000, 0xX000}); //Set the PWM frequency to be 100Hz and disable PWM0.
+
+*/
+ void Message_PWMCR1(uint16_t outputs[3]);
+/**
+ @Summary
+ PWM Generator 1 Configuration
+
+ @Description
+CR0 Frequency (PWM_CR1.FREQ) (9:8)
+00B Internal clock divided by 1024 (100 Hz) (default)
+01B Internal clock divided by 512 (200 Hz)
+10B Internal clock divided by 256 (400 Hz)
+11B 100% Duty Cycle.
+CR1 generator on/off control (PWM_CR1.DC) (7:0)
+00000000B PWM generator is off. (default)
+11111111B PWM generator is On (99.61% DC).
+
+ @Preconditions
+ The MSSP1_SPI_Initialize routine must have been called for the specified
+ MSSP1_SPI driver instance.
+
+ @Param
+ outputs[] - A 16 bit array containing bits which adjust the PWM1 frequency as well as enable/disable the generator itself.
+
+ @Returns
+ Void.
+
+ @Example
+ Message_PWMCR1({0xX000, 0xX000, 0xX000}); //Set the PWM frequency to be 100Hz and disable PWM1.
+
+*/
+ void Message_PWMOUT(uint8_t outputs[3]);
+/**
+ @Summary
+ Select which outputs are connected to any PWM generator.
+
+ @Description
+PWM Generator Output Control (PWM_OUT.OUTn)
+0B (default) The selected output is not driven by one of the two PWM generators
+1B The selected output is connected to a PWM generator
+DATA = Channel number 0 to 7
+
+ @Preconditions
+ The MSSP1_SPI_Initialize routine must have been called for the specified
+ MSSP1_SPI driver instance.
+
+ @Param
+ outputs[] - An array containing bits which determine which, if any, outputs are connected to the PWM generators.
+
+ @Returns
+ Void.
+
+ @Example
+ Message_PWMOUT({0x00, 0x00, 0x00}); //All outputs are not connected to any of the PWM generators.
+
+*/
+ void Message_PWMMAP(uint8_t outputs[3]);
+/**
+ @Summary
+ Select which PWM generator corresponds to which output.
+
+ @Description
+PWM Generator Output Mapping (PWM_MAP.OUTn)
+0B (default) The selected output is connected to PWM Generator 0
+1B The selected output is connected to PWM Generator 1
+DATA = Channel number 0 to 7
+Works in conjunction with PWM_OUT
+
+ @Preconditions
+ The MSSP1_SPI_Initialize routine must have been called for the specified
+ MSSP1_SPI driver instance.
+
+ @Param
+ outputs[] - An array containing bits which map the PWM generators to specific outputs.
+
+ @Returns
+ Void.
+
+ @Example
+ Message_PWMMAP({0x00, 0x00, 0x00}); //All outputs are connected to PWM0.
+
+*/
+
+
+#endif /* XC_SPI_H */
+