SPI读写函数寄存器版本(STM32F1xx,STM32F7xx实测完美)

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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值