- 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;
- }
复制代码
|
MARK一下 看能否看到自己的标记 方便以后查找 学习