📄 stm8l15x_spi.c
字号:
/* Enable the selected SPI DMA requests */
SPIx->CR3 |= (uint8_t) SPI_DMAReq;
}
else
{
/* Disable the selected SPI DMA requests */
SPIx->CR3 &= (uint8_t)~SPI_DMAReq;
}
}
/**
* @}
*/
/** @defgroup SPI_Group5 Interrupts and flags management functions
* @brief Interrupts and flags management functions
*
@verbatim
===============================================================================
Interrupts and flags management functions
===============================================================================
This section provides a set of functions allowing to configure the SPI Interrupts
sources and check or clear the flags or pending bits status.
The user should identify which mode will be used in his application to manage
the communication: Polling mode, Interrupt mode or DMA mode.
Polling Mode
=============
In Polling Mode, the SPI communication can be managed by 6 flags:
1. SPI_FLAG_TXE: to indicate the status of the transmit buffer register
2. SPI_FLAG_RXNE: to indicate the status of the receive buffer register
3. SPI_FLAG_WKUP: to indicate the state of the Wakeup event.
4. SPI_FLAG_CRCERR: to indicate if a CRC Calculation error occurs
5. SPI_FLAG_MODF: to indicate if a Mode Fault error occurs
6. SPI_FLAG_OVR: to indicate if an Overrun error occurs
In this Mode it is advised to use the following functions:
- FlagStatus SPI_GetFlagStatus(SPI_TypeDef* SPIx, SPI_FLAG_TypeDef SPI_FLAG);
- void SPI_ClearFlag(SPI_TypeDef* SPIx, SPI_FLAG_TypeDef SPI_FLAG);
Interrupt Mode
===============
In Interrupt Mode, the SPI communication can be managed by 4 interrupt sources
and 6 pending bits:
Pending Bits:
-------------
1. SPI_IT_TXE: to indicate the status of the transmit buffer register
2. SPI_IT_RXNE: to indicate the status of the receive buffer register
3. SPI_IT_CRCERR: to indicate if a CRC Calculation error occurs
4. SPI_IT_MODF: to indicate if a Mode Fault error occurs
5. SPI_IT_OVR: to indicate if an Overrun error occurs
6. SPI_IT_WKUP: to indicate if an Wake_up event occurs
Interrupt Source:
-----------------
1. SPI_IT_TXE: specifies the interrupt source for the Tx buffer empty
interrupt.
2. SPI_IT_RXNE: specifies the interrupt source for the Rx buffer not
empty interrupt.
3. SPI_IT_ERR: specifies the interrupt source for the errors interrupt.
4. SPI_IT_WKUP: specifies the interrupt source for the Wake-up interrupt.
In this Mode it is advised to use the following functions:
- void SPI_ITConfig(SPI_TypeDef* SPIx, SPI_IT_TypeDef SPI_IT, FunctionalState NewState);
- ITStatus SPI_GetITStatus(SPI_TypeDef* SPIx, SPI_IT_TypeDef SPI_IT);
- void SPI_ClearITPendingBit(SPI_TypeDef* SPIx, SPI_IT_TypeDef SPI_IT);
DMA Mode
========
In DMA Mode, the SPI communication can be managed by 2 DMA Channel requests:
1. SPI_DMAReq_Tx: specifies the Tx buffer DMA transfer request
2. SPI_DMAReq_Rx: specifies the Rx buffer DMA transfer request
In this Mode it is advised to use the following function:
- void SPI_DMACmd(SPI_TypeDef* SPIx, SPI_DMAReq_TypeDef SPI_DMAReq, FunctionalState NewState);
@endverbatim
* @{
*/
/**
* @brief Enables or disables the specified interrupts.
* @param SPIx: where x can be 1 to select the specified SPI peripheral.
* @param SPI_IT Specifies the SPI interrupts sources to be enabled or disabled.
* This parameter can be one of the following values:
* @arg SPI_IT_TXE: Transmit buffer empty
* @arg SPI_IT_RXNE: Receive buffer not empty
* @arg SPI_IT_ERR: Error
* @arg SPI_IT_WKUP: Wake-up
* @param NewState: The new state of the specified SPI interrupts.
* This parameter can be: ENABLE or DISABLE.
* @retval None
*/
void SPI_ITConfig(SPI_TypeDef* SPIx, SPI_IT_TypeDef SPI_IT, FunctionalState NewState)
{
uint8_t itpos = 0;
/* Check function parameters */
assert_param(IS_SPI_CONFIG_IT(SPI_IT));
assert_param(IS_FUNCTIONAL_STATE(NewState));
/* Get the SPI IT index */
itpos = (uint8_t)((uint8_t)1 << (uint8_t)((uint8_t)SPI_IT & (uint8_t)0x0F));
if (NewState != DISABLE)
{
SPIx->CR3 |= itpos; /* Enable interrupt*/
}
else
{
SPIx->CR3 &= (uint8_t)(~itpos); /* Disable interrupt*/
}
}
/**
* @brief Checks whether the specified SPI flag is set or not.
* @param SPIx: where x can be 1 to select the specified SPI peripheral.
* @param SPI_FLAG: Specifies the flag to check.
* This parameter can be one of the following values:
* @arg SPI_FLAG_BSY: Busy
* @arg SPI_FLAG_OVR: Overrun
* @arg SPI_FLAG_MODF: Mode fault
* @arg SPI_FLAG_CRCERR: CRC error
* @arg SPI_FLAG_WKUP: Wake-up
* @arg SPI_FLAG_TXE: Transmit buffer empty
* @arg SPI_FLAG_RXNE: Receive buffer empty
* @retval Indicates the state of SPI_FLAG.
* This parameter can be SET or RESET.
*/
FlagStatus SPI_GetFlagStatus(SPI_TypeDef* SPIx, SPI_FLAG_TypeDef SPI_FLAG)
{
FlagStatus status = RESET;
/* Check parameters */
assert_param(IS_SPI_FLAG(SPI_FLAG));
/* Check the status of the specified SPI flag */
if ((SPIx->SR & (uint8_t)SPI_FLAG) != (uint8_t)RESET)
{
status = SET; /* SPI_FLAG is set */
}
else
{
status = RESET; /* SPI_FLAG is reset*/
}
/* Return the SPI_FLAG status */
return status;
}
/**
* @brief Clears the SPI flags.
* @param SPIx: where x can be 1 to select the specified SPI peripheral.
* @param SPI_FLAG: Specifies the flag to clear.
* This parameter can be one of the following values:
* @arg SPI_FLAG_CRCERR
* @arg SPI_FLAG_WKUP
* @note OVR (OverRun Error) interrupt pending bit is cleared by software
* sequence: a read operation to SPI_DR register (SPI_ReceiveData()) followed by
* a read operation to SPI_SR register (SPI_GetFlagStatus()).
* @note MODF (Mode Fault) interrupt pending bit is cleared by software sequence:
* a read/write operation to SPI_SR register (SPI_GetFlagStatus()) followed by
* a write operation to SPI_CR1 register (SPI_Cmd() to enable the SPI).
* @retval None
*/
void SPI_ClearFlag(SPI_TypeDef* SPIx, SPI_FLAG_TypeDef SPI_FLAG)
{
assert_param(IS_SPI_CLEAR_FLAG(SPI_FLAG));
/* Clear the flag bit */
SPIx->SR = (uint8_t)(~SPI_FLAG);
}
/**
* @brief Checks whether the specified interrupt has occurred or not.
* @param SPIx: where x can be 1 to select the specified SPI peripheral.
* @param SPI_IT: Specifies the SPI interrupt pending bit to check.
* This parameter can be one of the following values:
* @arg SPI_IT_CRCERR
* @arg SPI_IT_WKUP
* @arg SPI_IT_OVR
* @arg SPI_IT_MODF
* @arg SPI_IT_RXNE
* @arg SPI_IT_TXE
* @retval Indicates the state of the SPI_IT.
*/
ITStatus SPI_GetITStatus(SPI_TypeDef* SPIx, SPI_IT_TypeDef SPI_IT)
{
ITStatus pendingbitstatus = RESET;
uint8_t itpos = 0;
uint8_t itmask1 = 0;
uint8_t itmask2 = 0;
__IO uint8_t enablestatus = 0;
assert_param(IS_SPI_GET_IT(SPI_IT));
/* Get the SPI IT index */
itpos = (uint8_t)((uint8_t)1 << ((uint8_t)SPI_IT & (uint8_t)0x0F));
/* Get the SPI IT mask */
itmask1 = (uint8_t)((uint8_t)SPI_IT >> (uint8_t)4);
/* Set the IT mask */
itmask2 = (uint8_t)((uint8_t)1 << itmask1);
/* Get the SPI_IT enable bit status */
enablestatus = (uint8_t)((uint8_t)SPIx->SR & itmask2);
/* Check the status of the specified SPI interrupt */
if (((SPIx->CR3 & itpos) != RESET) && enablestatus)
{
/* SPI_IT is set */
pendingbitstatus = SET;
}
else
{
/* SPI_IT is reset */
pendingbitstatus = RESET;
}
/* Return the SPI_IT status */
return pendingbitstatus;
}
/**
* @brief Clears the interrupt pending bits.
* @param SPIx: where x can be 1 to select the specified SPI peripheral.
* @param SPI_IT: Specifies the interrupt pending bit to clear.
* This parameter can be one of the following values:
* @arg SPI_IT_CRCERR
* @arg SPI_IT_WKUP
* @note OVR (OverRun Error) interrupt pending bit is cleared by software sequence:
* a read operation to SPI_DR register (SPI_ReceiveData()) followed by
* a read operation to SPI_SR register (SPI_GetITStatus()).
* @note MODF (Mode Fault) interrupt pending bit is cleared by software sequence:
* a read/write operation to SPI_SR register (SPI_GetITStatus()) followed by
* a write operation to SPI_CR1 register (SPI_Cmd() to enable the SPI).
* @retval None
*/
void SPI_ClearITPendingBit(SPI_TypeDef* SPIx, SPI_IT_TypeDef SPI_IT)
{
uint8_t itpos = 0;
assert_param(IS_SPI_CLEAR_IT(SPI_IT));
/* Clear SPI_IT_CRCERR or SPI_IT_WKUP interrupt pending bits */
/* Get the SPI pending bit index */
itpos = (uint8_t)((uint8_t)1 << (uint8_t)((uint8_t)(SPI_IT & (uint8_t)0xF0) >> 4));
/* Clear the pending bit */
SPIx->SR = (uint8_t)(~itpos);
}
/**
* @}
*/
/**
* @}
*/
/**
* @}
*/
/**
* @}
*/
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -