/** ****************************************************************************** * @file spi.c * @author AMG Energy Solution Team * @version V1.0.0 * @date 07-Feb-2022 * @brief This file provides all the code of the spi communication. ****************************************************************************** * @attention * * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. * *

© COPYRIGHT 2022 AMG

****************************************************************************** */ /** @addtogroup mBMS2 * @{ */ /* Includes ------------------------------------------------------------------*/ #include "spi.h" #include "console.h" /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ /* SPI1 Configuration */ /* SPI_SCK Port/Pin definition */ #define SPI1_SCK_PORT (PortC) #define SPI1_SCK_PIN (Pin12) #define SPI1_SCK_FUNC (Func_Spi1_Sck) /* SPI_MOSI Port/Pin definition */ #define SPI1_MOSI_PORT (PortD) #define SPI1_MOSI_PIN (Pin02) #define SPI1_MOSI_FUNC (Func_Spi1_Mosi) /* SPI_MISO Port/Pin definition */ #define SPI1_MISO_PORT (PortD) #define SPI1_MISO_PIN (Pin01) #define SPI1_MISO_FUNC (Func_Spi1_Miso) /* SPI3 Configuration */ /* SPI_SCK Port/Pin definition */ #define SPI3_SCK_PORT (PortB) #define SPI3_SCK_PIN (Pin13) #define SPI3_SCK_FUNC (Func_Spi3_Sck) /* SPI_MOSI Port/Pin definition */ #define SPI3_MOSI_PORT (PortB) #define SPI3_MOSI_PIN (Pin15) #define SPI3_MOSI_FUNC (Func_Spi3_Mosi) /* SPI_MISO Port/Pin definition */ #define SPI3_MISO_PORT (PortB) #define SPI3_MISO_PIN (Pin14) #define SPI3_MISO_FUNC (Func_Spi3_Miso) /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ /* Private function prototypes -----------------------------------------------*/ /* Private functions ---------------------------------------------------------*/ //Following is the SPI module initialization code, and configured to master mode //SPI port initialization //Needle is SPI1 initialization void Spi1_Config(void) { stc_spi_init_t stcSpiInit; stc_port_init_t stcPortInit; /* configuration structure initialization */ MEM_ZERO_STRUCT(stcPortInit); stcPortInit.enPinMode = Pin_Mode_Out; stcPortInit.enExInt = Disable; stcPortInit.enPullUp = Enable; /* SPI Port/Pin initialization */ PORT_Init(SPI1_MISO_PORT, SPI1_MISO_PIN, &stcPortInit); stcPortInit.enPinMode = Pin_Mode_In; PORT_Init(SPI1_MOSI_PORT, SPI1_MOSI_PIN, &stcPortInit); /* configuration structure initialization */ MEM_ZERO_STRUCT(stcSpiInit); /* Configuration peripheral clock */ PWC_Fcg1PeriphClockCmd(SPI1_UNIT_CLOCK, Enable); /* Configuration SPI pin */ PORT_SetFunc(SPI1_SCK_PORT, SPI1_SCK_PIN, SPI1_SCK_FUNC, Disable); PORT_SetFunc(SPI1_MOSI_PORT, SPI1_MOSI_PIN, SPI1_MOSI_FUNC, Disable); PORT_SetFunc(SPI1_MISO_PORT, SPI1_MISO_PIN, SPI1_MISO_FUNC, Disable); /* Configuration SPI structure */ stcSpiInit.enClkDiv = SpiClkDiv64; stcSpiInit.enFrameNumber = SpiFrameNumber1; stcSpiInit.enDataLength = SpiDataLengthBit8; stcSpiInit.enFirstBitPosition = SpiFirstBitPositionMSB; stcSpiInit.enSckPolarity = SpiSckIdleLevelLow; stcSpiInit.enSckPhase = SpiSckOddSampleEvenChange; stcSpiInit.enReadBufferObject = SpiReadReceiverBuffer; stcSpiInit.enWorkMode = SpiWorkMode3Line; stcSpiInit.enTransMode = SpiTransFullDuplex; stcSpiInit.enCommAutoSuspendEn = Disable; stcSpiInit.enModeFaultErrorDetectEn = Disable; stcSpiInit.enParitySelfDetectEn = Disable; stcSpiInit.enParityEn = Disable; stcSpiInit.enParity = SpiParityEven; stcSpiInit.enMasterSlaveMode = SpiModeMaster; stcSpiInit.stcDelayConfig.enSsSetupDelayOption = SpiSsSetupDelayCustomValue; stcSpiInit.stcDelayConfig.enSsSetupDelayTime = SpiSsSetupDelaySck1; stcSpiInit.stcDelayConfig.enSsHoldDelayOption = SpiSsHoldDelayCustomValue; stcSpiInit.stcDelayConfig.enSsHoldDelayTime = SpiSsHoldDelaySck1; stcSpiInit.stcDelayConfig.enSsIntervalTimeOption = SpiSsIntervalCustomValue; stcSpiInit.stcDelayConfig.enSsIntervalTime = SpiSsIntervalSck6PlusPck2; SPI_Init(SPI1_UNIT, &stcSpiInit); SPI_Cmd(SPI1_UNIT, Enable); } //Following is the SPI module initialization code, and configured to master mode //SPI port initialization //Needle is SPI3 initialization void Spi3_Config(void) { stc_spi_init_t stcSpiInit; stc_port_init_t stcPortInit; /* configuration structure initialization */ MEM_ZERO_STRUCT(stcPortInit); stcPortInit.enPinMode = Pin_Mode_Out; stcPortInit.enExInt = Disable; stcPortInit.enPullUp = Enable; /* SPI Port/Pin initialization */ PORT_Init(SPI3_MISO_PORT, SPI3_MISO_PIN, &stcPortInit); stcPortInit.enPinMode = Pin_Mode_In; PORT_Init(SPI3_MOSI_PORT, SPI3_MOSI_PIN, &stcPortInit); /* configuration structure initialization */ MEM_ZERO_STRUCT(stcSpiInit); /* Configuration peripheral clock */ PWC_Fcg1PeriphClockCmd(SPI3_UNIT_CLOCK, Enable); /* Configuration SPI pin */ PORT_SetFunc(SPI3_SCK_PORT, SPI3_SCK_PIN, SPI3_SCK_FUNC, Disable); PORT_SetFunc(SPI3_MOSI_PORT, SPI3_MOSI_PIN, SPI3_MOSI_FUNC, Disable); PORT_SetFunc(SPI3_MISO_PORT, SPI3_MISO_PIN, SPI3_MISO_FUNC, Disable); /* Configuration SPI structure */ stcSpiInit.enClkDiv = SpiClkDiv2; stcSpiInit.enFrameNumber = SpiFrameNumber1; stcSpiInit.enDataLength = SpiDataLengthBit8; stcSpiInit.enFirstBitPosition = SpiFirstBitPositionMSB; stcSpiInit.enSckPolarity = SpiSckIdleLevelLow; stcSpiInit.enSckPhase = SpiSckOddSampleEvenChange; stcSpiInit.enReadBufferObject = SpiReadReceiverBuffer; stcSpiInit.enWorkMode = SpiWorkMode3Line; stcSpiInit.enTransMode = SpiTransFullDuplex; stcSpiInit.enCommAutoSuspendEn = Disable; stcSpiInit.enModeFaultErrorDetectEn = Disable; stcSpiInit.enParitySelfDetectEn = Disable; stcSpiInit.enParityEn = Disable; stcSpiInit.enParity = SpiParityEven; stcSpiInit.enMasterSlaveMode = SpiModeMaster; stcSpiInit.stcDelayConfig.enSsSetupDelayOption = SpiSsSetupDelayCustomValue; stcSpiInit.stcDelayConfig.enSsSetupDelayTime = SpiSsSetupDelaySck1; stcSpiInit.stcDelayConfig.enSsHoldDelayOption = SpiSsHoldDelayCustomValue; stcSpiInit.stcDelayConfig.enSsHoldDelayTime = SpiSsHoldDelaySck1; stcSpiInit.stcDelayConfig.enSsIntervalTimeOption = SpiSsIntervalCustomValue; stcSpiInit.stcDelayConfig.enSsIntervalTime = SpiSsIntervalSck6PlusPck2; SPI_Init(SPI3_UNIT, &stcSpiInit); SPI_Cmd(SPI3_UNIT, Enable); } /** ******************************************************************************* ** \brief SPI3 flash write byte function ** ** \param [in] u8Data SPI write data to flash ** ** \retval uint8_t SPI receive data from flash ** ******************************************************************************/ uint8_t Spi3Flash_WriteReadByte(uint8_t u8Data) { uint8_t u8Byte = 0; /* Wait tx buffer empty */ while (Reset == SPI_GetFlag(SPI3_UNIT, SpiFlagSendBufferEmpty)) { } /* Send data */ SPI_SendData8(SPI3_UNIT, u8Data); /* Wait rx buffer full */ while (Reset == SPI_GetFlag(SPI3_UNIT, SpiFlagReceiveBufferFull)) { } /* Receive data */ u8Byte = SPI_ReceiveData8(SPI3_UNIT); return u8Byte; } // SPI1 read and write bytes // TxData: the bytes to write // Return value: reads a byte uint8_t SPI1_ReadWriteByte(uint8_t TxData) { while (Reset == SPI_GetFlag(SPI1_UNIT, SpiFlagSendBufferEmpty)) { }//Waiting to be sent SPI_SendData8(SPI1_UNIT, TxData); while (Reset == SPI_GetFlag(SPI1_UNIT, SpiFlagReceiveBufferFull)) {} return SPI_ReceiveData8(SPI1_UNIT); //Returned by SPIx recently received data } /*******************(C)COPYRIGHT 2022 AMG ********************END OF FILE******/