void SPI_ReadWriteByte(SPI_TypeDef *spi,unsigned char *pTxData, unsigned char *pRxData, unsigned short Size)//寄存器版本
{
volatile unsigned char tmpreg;
unsigned short TxXferCount,RxXferCount;
unsigned char *pRxBuffPtr = pRxData;
unsigned char *pTxBuffPtr = pTxData;
unsigned char txallowed = 1U;
unsigned int timeout=SPI_COMM_TIMEOUT;
__IO unsigned int tmpreg_ovr = 0x00U;
TxXferCount=RxXferCount=Size;
//如果 FIFO 占用水平大于或等于 1/4(8 位),将生成 RXNE 事件
SET_BIT(spi->CR2, SPI_RXFIFO_THRESHOLD);
while((TxXferCount > 0) || (RxXferCount > 0))
{
// check TXE flag
if(txallowed && ((TxXferCount > 0) && ((spi->SR & SPI_FLAG_TXE) == SPI_FLAG_TXE)))
{
*(__IO unsigned char *)&spi->DR = (*pTxBuffPtr++);
TxXferCount--;
// Next Data is a reception (Rx). Tx not allowed
if(TxXferCount==0)
txallowed = 0U;
}
/* Wait until RXNE flag is reset */
if((RxXferCount > 0) && ((spi->SR & SPI_FLAG_RXNE) == SPI_FLAG_RXNE))
{
//改为1个字节接收,两个字节接收有的芯片会出问题
(*pRxBuffPtr++) = *(__IO unsigned char *)&spi->DR;
RxXferCount--;
if(RxXferCount <= 1)
{
//如果 FIFO 占用水平大于或等于 1/4(8 位),将生成 RXNE 事件
SET_BIT(spi->CR2, SPI_RXFIFO_THRESHOLD);
}
//Next Data is a Transmission (Tx). Tx is allowed
if(RxXferCount==0)
txallowed = 1U;
}
if((timeout--)==0)
{
if(spi==SPI1)
{
SetBit(&STS,1,para.Alarm_Disable);//存储模块通信异常
break;
}
else if(spi==SPI2)
{
SetBit(&STS,26,para.Alarm_Disable);//WK2124通信异常
break;
}
else
break;
}
}
//带有32位收发缓冲区的MCU需添加,否则屏蔽///
timeout=SPI_COMM_TIMEOUT;
// Check the end of the transaction
while((spi->SR & SPI_FLAG_FTLVL) != SPI_FTLVL_EMPTY)
{//发送FIFO非空时
if((SPI_FLAG_FTLVL == SPI_SR_FRLVL) && (SPI_FTLVL_EMPTY == SPI_FRLVL_EMPTY))
{
tmpreg = *((__IO unsigned char*)&spi->DR);
}
if((timeout--)==0)
{
if(spi==SPI1)
{
SetBit(&STS,1,para.Alarm_Disable);//存储模块通信异常
break;
}
else if(spi==SPI2)
{
SetBit(&STS,26,para.Alarm_Disable);//WK2124通信异常
break;
}
else
break;
}
}
timeout=SPI_COMM_TIMEOUT;
while((spi->SR & SPI_FLAG_FRLVL) != SPI_FRLVL_EMPTY)
{
if((SPI_FLAG_FRLVL == SPI_SR_FRLVL) && (SPI_FRLVL_EMPTY == SPI_FRLVL_EMPTY))
{
tmpreg = *((__IO unsigned char*)&spi->DR);
}
if((timeout--)==0)
{
if(spi==SPI1)
{
SetBit(&STS,1,para.Alarm_Disable);//存储模块通信异常
break;
}
else if(spi==SPI2)
{
SetBit(&STS,26,para.Alarm_Disable);//WK2124通信异常
break;
}
else
break;
}
}
//带有32位收发缓冲区的MCU需添加,否则屏蔽///
timeout=SPI_COMM_TIMEOUT;
/* Control the BSY flag */
while((spi->SR & SPI_FLAG_BSY) != RESET)
{
if((timeout--)==0)
{
if(spi==SPI1)
{
SetBit(&STS,1,para.Alarm_Disable);//存储模块通信异常
break;
}
else if(spi==SPI2)
{
SetBit(&STS,26,para.Alarm_Disable);//WK2124通信异常
break;
}
else
break;
}
}
//Clear overrun flag in 2 Lines communication mode because received is not read
tmpreg_ovr=spi->DR;
tmpreg_ovr=spi->SR;
}