📄 stm32f10x_spi.c
字号:
/*******************************************************************************
* 函数名称: SPI_TransmitCRC
* 功能描述: 传送某个SPI的CRC校验值
* 输入参数: SPIx :x为1,2或3用于选定SPI外设。
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void SPI_TransmitCRC(SPI_TypeDef* SPIx)
{
/* Check the parameters [检查参数]*/
assert_param(IS_SPI_ALL_PERIPH(SPIx));
/* Enable the selected SPI CRC transmission [使能选中的SPI CRC发送]*/
SPIx->CR1 |= CR1_CRCNext_Set;
}
/*******************************************************************************
* 函数名称: SPI_CalculateCRC
* 功能描述: 使能或取消传送字节的CRC校验值的计算.
* 输入参数: (1)SPIx :x为1,2或3用于选定SPI外设。
* (2)NewState: 选定SPI接口的CRC计算的新状态,这个参数可能是ENABLE或DISABLE.
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void SPI_CalculateCRC(SPI_TypeDef* SPIx, FunctionalState NewState)
{
/* Check the parameters [检查参数]*/
assert_param(IS_SPI_ALL_PERIPH(SPIx));
assert_param(IS_FUNCTIONAL_STATE(NewState));
if (NewState != DISABLE)
{
/* Enable the selected SPI CRC calculation [使能选中的SPI CRC计算]*/
SPIx->CR1 |= CR1_CRCEN_Set;
}
else
{
/* Disable the selected SPI CRC calculation [禁止选中的SPI CRC计算]*/
SPIx->CR1 &= CR1_CRCEN_Reset;
}
}
/*******************************************************************************
* 函数名称: SPI_GetCRC
* 功能描述: 返回特定SPI外设传送或接收的CRC寄存器的值.
* 输入参数: (1)SPIx :x为1,2或3用于选定SPI外设。
* (2)SPI_CRC:将被读取的CRC寄存器。
* 这个参数可以是下面的值之一:
* - SPI_CRC_Tx: 选择Tx CRC寄存器
* - SPI_CRC_Rx: 选择Rx CRC寄存器
* 输出参数: 无
* 返回参数: 所选择的CRC寄存器的值。
*******************************************************************************/
u16 SPI_GetCRC(SPI_TypeDef* SPIx, u8 SPI_CRC)
{
u16 crcreg = 0;
/* Check the parameters [检查参数]*/
assert_param(IS_SPI_ALL_PERIPH(SPIx));
assert_param(IS_SPI_CRC(SPI_CRC));
if (SPI_CRC != SPI_CRC_Rx)
{
/* Get the Tx CRC register [取得Tx CRC寄存器]*/
crcreg = SPIx->TXCRCR;
}
else
{
/* Get the Rx CRC register [取得Rx CRC寄存器]*/
crcreg = SPIx->RXCRCR;
}
/* Return the selected CRC register [返回选择的CRC寄存器]*/
return crcreg;
}
/*******************************************************************************
* 函数名称: SPI_GetCRCPolynomial
* 功能描述: 返回特定SPI接口的CRC多项式寄存器的值.
* 输入参数: SPIx :x为1,2或3用于选定SPI外设。
* 输出参数: 无
* 返回参数: CRC多项式寄存器的值.
*******************************************************************************/
u16 SPI_GetCRCPolynomial(SPI_TypeDef* SPIx)
{
/* Check the parameters [检查参数]*/
assert_param(IS_SPI_ALL_PERIPH(SPIx));
/* Return the CRC polynomial register [返回CRC多项式寄存器]*/
return SPIx->CRCPR;
}
/*******************************************************************************
* 函数名称: SPI_BiDirectionalLineConfig
* 功能描述: 为特定的SPI接口在双向模式时选择数据传输方向.
* 输入参数: (1)SPIx :x为1,2或3用于选定SPI外设。
* (2)SPI_Direction: 在双向模式中的数据传输方向。
* 这个参数可以是下面的值之一:
* - SPI_Direction_Tx: 选择Tx传送方向
* - SPI_Direction_Rx: 选择Rx接收方向
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void SPI_BiDirectionalLineConfig(SPI_TypeDef* SPIx, u16 SPI_Direction)
{
/* Check the parameters [检查参数]*/
assert_param(IS_SPI_ALL_PERIPH(SPIx));
assert_param(IS_SPI_DIRECTION(SPI_Direction));
if (SPI_Direction == SPI_Direction_Tx)
{
/* Set the Tx only mode [设置只发送模式]*/
SPIx->CR1 |= SPI_Direction_Tx;
}
else
{
/* Set the Rx only mode [设置只接收模式]*/
SPIx->CR1 &= SPI_Direction_Rx;
}
}
/*******************************************************************************
* 函数名称: SPI_I2S_GetFlagStatus
* 功能描述: 检查指定的SPI/I2S标记是否被置位.
* 输入参数: (1)- SPIx: x可以是 :
* - 1, 2 或 3 在 SPI 模式
* - 2 或 3 在 I2S 模式
* (2)检查指定的SPI/I2S标记是否被设置.
* 这个参数可以是下面的值之一:
* - SPI_I2S_FLAG_TXE: 传输缓冲为空标记.
* - SPI_I2S_FLAG_RXNE: 接收缓冲不空标记.
* - SPI_I2S_FLAG_BSY: 忙碌标记.
* - SPI_I2S_FLAG_OVR: 溢出标记.
* - SPI_FLAG_MODF: 模式错误标记.
* - SPI_FLAG_CRCERR: CRC校验错误标记.
* - I2S_FLAG_UDR: 空栈读出错标记.
* - I2S_FLAG_CHSIDE: 通道边标志.
* 输出参数: 无
* 返回参数: SPI_I2S_FLAG标记的新状态 (SET or RESET).
*******************************************************************************/
FlagStatus SPI_I2S_GetFlagStatus(SPI_TypeDef* SPIx, u16 SPI_I2S_FLAG)
{
FlagStatus bitstatus = RESET;
/* Check the parameters [检查参数]*/
assert_param(IS_SPI_ALL_PERIPH(SPIx));
assert_param(IS_SPI_I2S_GET_FLAG(SPI_I2S_FLAG));
/* Check the status of the specified SPI/I2S flag [检查指定的SPI/I2S标志状态]*/
if ((SPIx->SR & SPI_I2S_FLAG) != (u16)RESET)
{
/* SPI_I2S_FLAG is set [置位SPI_I2S_FLAG]*/
bitstatus = SET;
}
else
{
/* SPI_I2S_FLAG is reset [复位SPI_I2S_FLAG]*/
bitstatus = RESET;
}
/* Return the SPI_I2S_FLAG status [返回SPI_I2S_FLAG状态]*/
return bitstatus;
}
/*******************************************************************************
* 函数名称: SPI_I2S_ClearFlag
* 功能描述: 清除SPIx CRC错误(CRCERR) 标志.
* 输入参数: (1)SPIx: x可以是 :
* - 1, 2 或 3 在 SPI 模式
* (2)SPI_I2S_FLAG: 指定清除的SPI标志.
* 这个函数只能清除CRCERR标志.
* 注意:
* - OVR (过速错误)中断挂起位可以被软件按顺序清除: 一个读
* SPI_DR寄存器操作 (SPI_I2S_ReceiveData()) 跟着一个读
* SPI_SR寄存器操作 (SPI_I2S_GetITStatus()).
* - UDR (空栈读错误) 中断挂起位可以被一个读SPI_SR寄存器操
* 作清除(SPI_I2S_GetITStatus())。
* - MODF (模式错误) 中断挂起位被软件按顺序清除:一个读/写
* SPI_SR寄存器操作(SPI_I2S_GetITStatus())跟着一个写SPI_CR1
* 寄存器操作 (SPI_Cmd() 使能 SPI).
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void SPI_I2S_ClearFlag(SPI_TypeDef* SPIx, u16 SPI_I2S_FLAG)
{
/* Check the parameters [检查参数]*/
assert_param(IS_SPI_ALL_PERIPH(SPIx));
assert_param(IS_SPI_I2S_CLEAR_FLAG(SPI_I2S_FLAG));
/* Clear the selected SPI CRC Error (CRCERR) flag [清除选择的SPI CRC错误(CRCERR)标志]*/
SPIx->SR = (u16)~SPI_I2S_FLAG;
}
/*******************************************************************************
* 函数名称: SPI_I2S_GetITStatus
* 功能描述: SPI_IT:检查指定的的SPI/I2S中断是否发生了。
* 输入参数: (1) SPIx: x可以是 :
* - 1, 2 或 3 在 SPI 模式
* - 2 或 3 在 I2S 模式
* (2) SPI_I2S_IT:检查的指定的SPI/I2S中断源。
* 这个参数可以是下面的值之一:
* - SPI_I2S_IT_TXE: 传输缓冲为空中断
* - SPI_I2S_IT_RXNE: 接收缓冲不空中断
* - SPI_I2S_IT_OVR: 溢出中断.
* - SPI_IT_MODF: 模式错误中断
* - SPI_IT_CRCERR: CRC校验错误中断.
* - I2S_IT_UDR: 空栈读错误中断.
* 输出参数: 无
* 返回参数: SPI_I2S_IT的新状态 (SET or RESET).
*******************************************************************************/
ITStatus SPI_I2S_GetITStatus(SPI_TypeDef* SPIx, u8 SPI_I2S_IT)
{
ITStatus bitstatus = RESET;
u16 itpos = 0, itmask = 0, enablestatus = 0;
/* Check the parameters [检查参数]*/
assert_param(IS_SPI_ALL_PERIPH(SPIx));
assert_param(IS_SPI_I2S_GET_IT(SPI_I2S_IT));
/* Get the SPI/I2S IT index [取得SPI/I2S IT引索]*/
itpos = (u16)((u16)0x01 << (SPI_I2S_IT & (u8)0x0F));
/* Get the SPI/I2S IT mask [取得SPI/I2S IT标志]*/
itmask = SPI_I2S_IT >> 4;
/* Set the IT mask [置位IT标志]*/
itmask = (u16)((u16)0x01 << itmask);
/* Get the SPI_I2S_IT enable bit status [取得SPI_I2S_IT使能状态位]*/
enablestatus = (SPIx->CR2 & itmask) ;
/* Check the status of the specified SPI/I2S interrupt [检查指定的SPI/I2S中断状态]*/
if (((SPIx->SR & itpos) != (u16)RESET) && enablestatus)
{
/* SPI_I2S_IT is set [置位SPI_I2S_IT]*/
bitstatus = SET;
}
else
{
/* SPI_I2S_IT is reset [复位SPI_I2S_IT]*/
bitstatus = RESET;
}
/* Return the SPI_I2S_IT status [返回SPI_I2S_IT状态]*/
return bitstatus;
}
/*******************************************************************************
* 函数名称: SPI_I2S_ClearITPendingBit
* 功能描述: 清除某个SPI CRC错误(CRCERR)中断挂起位.
* 输入参数: (1)- SPIx: x可以是 :
* - 1, 2 或 3 在 SPI 模式
* (2) SPI_I2S_IT:清除指定的中断挂起位。
* 这个函数只清除CRCERR中断挂起位。
* Notes:
* - OVR (过速错误)中断挂起位可以被软件按顺序清除: 一个读
* SPI_DR寄存器操作 (SPI_I2S_ReceiveData()) 跟着一个读
* SPI_SR寄存器操作 (SPI_I2S_GetITStatus()).
* - UDR (空栈读错误) 中断挂起位可以被一个读SPI_SR寄存器操
* 作清除(SPI_I2S_GetITStatus())。
* - MODF (模式错误) 中断挂起位被软件按顺序清除:一个读/写
* SPI_SR寄存器操作(SPI_I2S_GetITStatus())跟着一个写SPI_CR1
* 寄存器操作 (SPI_Cmd() 使能 SPI).
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void SPI_I2S_ClearITPendingBit(SPI_TypeDef* SPIx, u8 SPI_I2S_IT)
{
u16 itpos = 0;
/* Check the parameters [检查参数]*/
assert_param(IS_SPI_ALL_PERIPH(SPIx));
assert_param(IS_SPI_I2S_CLEAR_IT(SPI_I2S_IT));
/* Get the SPI IT index [取得SPI IT向量]*/
itpos = (u16)((u16)0x01 << (SPI_I2S_IT & (u8)0x0F));
/* Clear the selected SPI CRC Error (CRCERR) interrupt pending bit [清除选择的SPI CRC错误中断挂起标志]*/
SPIx->SR = (u16)~itpos;
}
/******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -