233 lines
8.3 KiB
C
233 lines
8.3 KiB
C
/**
|
|
******************************************************************************
|
|
* @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.
|
|
*
|
|
* <h2><center>© COPYRIGHT 2022 AMG</center></h2>
|
|
******************************************************************************
|
|
*/
|
|
|
|
/** @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******/
|