📄 stm8l15x_spi.c
字号:
/**
******************************************************************************
* @file stm8l15x_spi.c
* @author MCD Application Team
* @version V1.5.0
* @date 13-May-2011
* @brief This file provides firmware functions to manage the following
* functionalities of the Serial peripheral interface (SPI):
* - Initialization and Configuration
* - Data transfers functions
* - Hardware CRC Calculation
* - DMA transfers management
* - Interrupts and flags management
*
* @verbatim
*
* ===================================================================
* How to use this driver
* ===================================================================
* 1. Enable peripheral clock using CLK_PeripheralClockConfig(CLK_Peripheral_SPIx,
* ENABLE) function (Refer to the product datasheet for the available SPI
* peripherals)
*
* 2. Enable the external Pull-up on the used SPI Pins using the
* GPIO_ExternalPullUpConfig() function or an eternal pull-up equivalent resistor
* (RPU = 45 KOhm typical value).
*
*
* 3. Program the Polarity, Phase, First Data, Baud Rate Prescaler, Slave
* Management, Peripheral Mode and CRC Polynomial values using the SPI_Init()
* function.
*
* 4. Enable the corresponding interrupt using the function SPI_ITConfig() if you
* need to use interrupt mode.
*
* 5. When using the DMA mode
* - Configure the DMA using DMA_Init() function
* - Active the needed channel Request using SPI_DMACmd() function
*
* 6. Enable the SPI using the SPI_Cmd() function.
*
* 7. Enable the DMA using the DMA_Cmd() function when using DMA mode.
*
* 8. Optionally you can enable/configure the following parameters without
* re-initialization (i.e there is no need to call again SPI_Init() function):
* - When bidirectional mode (SPI_Direction_1Line_Rx or SPI_Direction_1Line_Tx)
* is programmed as Data direction parameter using the SPI_Init() function
* it can be possible to switch between SPI_Direction_Tx or SPI_Direction_Rx
* using the SPI_BiDirectionalLineConfig() function.
* - When SPI_NSS_Soft is selected as Slave Select Management parameter
* using the SPI_Init() function it can be possible to manage the
* NSS internal signal using the SPI_NSSInternalSoftwareConfig() function.
*
* 9. To use the CRC Hardware calculation feature refer to the Peripheral
* CRC hardware Calculation subsection.
*
* @endverbatim
*
******************************************************************************
* @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 2011 STMicroelectronics</center></h2>
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "stm8l15x_spi.h"
/** @addtogroup STM8L15x_StdPeriph_Driver
* @{
*/
/** @defgroup SPI
* @brief SPI driver modules
* @{
*/
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
/** @defgroup SPI_Private_Functions
* @{
*/
/** @defgroup SPI_Group1 Initialization and Configuration functions
* @brief Initialization and Configuration functions
*
@verbatim
===============================================================================
Initialization and Configuration functions
===============================================================================
This section provides a set of functions allowing to initialize the SPI Direction,
SPI Mode, SPI Data Size, SPI Polarity, SPI Phase, SPI NSS Management, SPI Baud
Rate Prescaler, SPI First Bit and SPI CRC Polynomial.
The SPI_Init() function follows the SPI configuration procedures for Master mode
and Slave mode (details for these procedures are available in reference manual
(RM0031)).
@endverbatim
* @{
*/
/**
* @brief Deinitializes the SPI peripheral registers to their default reset values.
* @param SPIx: where x can be 1 to select the specified SPI peripheral.
* @param None
* @retval None
*/
void SPI_DeInit(SPI_TypeDef* SPIx)
{
SPIx->CR1 = SPI_CR1_RESET_VALUE;
SPIx->CR2 = SPI_CR2_RESET_VALUE;
SPIx->CR3 = SPI_CR3_RESET_VALUE;
SPIx->SR = SPI_SR_RESET_VALUE;
SPIx->CRCPR = SPI_CRCPR_RESET_VALUE;
}
/**
* @brief Initializes the SPI according to the specified parameters.
* @param SPIx: where x can be 1 to select the specified SPI peripheral.
* @param SPI_FirstBit: This parameter can be any of the
* This parameter can be one of the following values:
* @arg SPI_FirstBit_MSB: MSB bit will be transmitted first
* @arg SPI_FirstBit_LSB: LSB bit will be transmitted first
* @param SPI_BaudRatePrescaler: This parameter can be any of the
* This parameter can be one of the following values:
* @arg SPI_BaudRatePrescaler_2: SPI frequency = frequency(CPU)/2
* @arg SPI_BaudRatePrescaler_4: SPI frequency = frequency(CPU)/4
* @arg SPI_BaudRatePrescaler_8: SPI frequency = frequency(CPU)/8
* @arg SPI_BaudRatePrescaler_16: SPI frequency = frequency(CPU)/16
* @arg SPI_BaudRatePrescaler_32: SPI frequency = frequency(CPU)/32
* @arg SPI_BaudRatePrescaler_64: SPI frequency = frequency(CPU)/64
* @arg SPI_BaudRatePrescaler_128: SPI frequency = frequency(CPU)/128
* @arg SPI_BaudRatePrescaler_256: SPI frequency = frequency(CPU)/256
* @param SPI_Mode: Mode
* This parameter can be one of the following values:
* @arg SPI_Mode_Master: SPI Master configuration
* @arg SPI_Mode_Slave: SPI Slave configuration
* @param SPI_CPOL: Clock Polarity
* This parameter can be one of the following values:
* @arg SPI_CPOL_Low: Clock to 0 when idle
* @arg SPI_CPOL_High: Clock to 1 when idle
* @param SPI_CPHA: Clock Phase
* This parameter can be one of the following values:
* @arg SPI_CPHA_1Edge: The first clock transition is the first data capture edge
* @arg SPI_CPHA_2Edge: The second clock transition is the first data capture edge
* @param SPI_Data_Direction: Data direction
* This parameter can be one of the following values:
* @arg SPI_Direction_Rx: Select Rx receive direction in bi-directional mode
* @arg SPI_Direction_Tx: Select Tx transmission direction in bi-directional mode
* @param SPI_Slave_Management: Slave management
* This parameter can be one of the following values:
* @arg SPI_NSS_Soft: Software slave management disabled
* @arg SPI_NSS_Hard: Software slave management enabled
* @param CRCPolynomial: Configures the CRC polynomial.
* @retval None
*/
void SPI_Init(SPI_TypeDef* SPIx, SPI_FirstBit_TypeDef SPI_FirstBit,
SPI_BaudRatePrescaler_TypeDef SPI_BaudRatePrescaler,
SPI_Mode_TypeDef SPI_Mode, SPI_CPOL_TypeDef SPI_CPOL,
SPI_CPHA_TypeDef SPI_CPHA, SPI_DirectionMode_TypeDef SPI_Data_Direction,
SPI_NSS_TypeDef SPI_Slave_Management, uint8_t CRCPolynomial)
{
/* Check structure elements */
assert_param(IS_SPI_FIRSTBIT(SPI_FirstBit));
assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));
assert_param(IS_SPI_MODE(SPI_Mode));
assert_param(IS_SPI_POLARITY(SPI_CPOL));
assert_param(IS_SPI_PHASE(SPI_CPHA));
assert_param(IS_SPI_DATA_DIRECTION(SPI_Data_Direction));
assert_param(IS_SPI_SLAVEMANAGEMENT(SPI_Slave_Management));
assert_param(IS_SPI_CRC_POLYNOMIAL(CRCPolynomial));
/* Frame Format, BaudRate, Clock Polarity and Phase configuration */
SPIx->CR1 = (uint8_t)((uint8_t)((uint8_t)SPI_FirstBit |
(uint8_t)SPI_BaudRatePrescaler) |
(uint8_t)((uint8_t)SPI_CPOL |
SPI_CPHA));
/* Data direction configuration: BDM, BDOE and RXONLY bits */
SPIx->CR2 = (uint8_t)((uint8_t)(SPI_Data_Direction) | (uint8_t)(SPI_Slave_Management));
if (SPI_Mode == SPI_Mode_Master)
{
SPIx->CR2 |= (uint8_t)SPI_CR2_SSI;
}
else
{
SPIx->CR2 &= (uint8_t)~(SPI_CR2_SSI);
}
/* Master/Slave mode configuration */
SPIx->CR1 |= (uint8_t)(SPI_Mode);
/* CRC configuration */
SPIx->CRCPR = (uint8_t)CRCPolynomial;
}
/**
* @brief Enables or disables the SPI peripheral.
* @param SPIx: where x can be 1 to select the specified SPI peripheral.
* @param NewState New state of the SPI peripheral.
* This parameter can be: ENABLE or DISABLE
* @retval None
*/
void SPI_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState)
{
/* Check function parameters */
assert_param(IS_FUNCTIONAL_STATE(NewState));
if (NewState != DISABLE)
{
SPIx->CR1 |= SPI_CR1_SPE; /* Enable the SPI peripheral*/
}
else
{
SPIx->CR1 &= (uint8_t)(~SPI_CR1_SPE); /* Disable the SPI peripheral*/
}
}
/**
* @brief Configures internally by software the NSS pin.
* @param SPIx: where x can be 1 to select the specified SPI peripheral.
* @param NewState Indicates the new state of the SPI Software slave management.
* This parameter can be: ENABLE or DISABLE.
* @retval None
*/
void SPI_NSSInternalSoftwareCmd(SPI_TypeDef* SPIx, FunctionalState NewState)
{
/* Check function parameters */
assert_param(IS_FUNCTIONAL_STATE(NewState));
if (NewState != DISABLE)
{
SPIx->CR2 |= SPI_CR2_SSI; /* Set NSS pin internally by software*/
}
else
{
SPIx->CR2 &= (uint8_t)(~SPI_CR2_SSI); /* Reset NSS pin internally by software*/
}
}
/**
* @brief Selects the data transfer direction in Bi-directional mode.
* @param SPIx: where x can be 1 to select the specified SPI peripheral.
* @param SPI_Direction Specifies the data transfer direction in Bi-directional mode.
* This parameter can be one of the following values:
* @arg SPI_Direction_Rx: Select Rx receive direction in bi-directional mode
* @arg SPI_Direction_Tx: Select Tx transmission direction in bi-directional mode
* @retval None
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -