//SPIx读写一个字节
//TxData:要写入的字节
//回来值:读取到的字节
u8 SPIx_ReadWriteByte(u8 TxData)
{
while((SPI1->SR&(1<<1))==0);
SPI1->DR=TxData; //发送一个byte
while((SPI1->SR&(1<<0))==0);
returnSPI1->DR; //回来收到的数据
}
关于这样的读写函数曾有这样的疑问,读便是读写就写为什么要放一同呢。这样是不是很费事,查询相关材料有如下回答。
a)写一个字节:
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
//保证产生前Buffer为空,也便是说上一次现已产生完结
SPI_I2S_SendData(SPI1, Data);
//往寄存器中写入一个字节
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
//等候承受到一个字节数据,
为什么要这么做?加这一句的原因是为了保证这个字节现已发送出去,由于产生和承受是并行同步进行,那便是说你产生出去一个字节意味着你收到一个字节。所以这样判别彻底没有问题,再说必要性,假如你不加这句你就会简单犯过早拉高CS信号的过错(相当于检测到收到数据,那么阐明数据必定发完了),你想想假如在SPI_I2S_SendData(SPI1, Data)后边当即拉高CS是什么结果。SPI_I2S_ReceiveData(SPI1); //都会接纳到的数据,看起来没什么必要,但以用stm32的经历引荐这样做,或许会有意想不到的收成。
SPI_Writebyte(u8data)
{
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(SPI1, Data);
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
SPI_I2S_ReceiveData(SPI1);
}
b)读一个字节:读的时分要注意一个问题,由于从形式是无法供给时钟的,所以主形式下有必要要在接纳的一起供给时钟。方法便是发送一个字节来完成,由于仍是上面说的,发送一个字节就意味着收到一个字节,代码和写彻底相同,只要把读出来的字节保存即可。u8 SPI_Readbyte(u8data){while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);SPI_I2S_SendData(SPI1, Data);while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);return SPI_I2S_ReceiveData(SPI1);}