找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2050|回复: 0
打印 上一主题 下一主题
收起左侧

STM32 SPI读写函数

[复制链接]
跳转到指定楼层
楼主
ID:104126 发表于 2016-1-23 00:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//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)​读一个字节:读的时候要注意一个问题,因为从模式是没法提供时钟的,所以主模式下必须要在接收的同时提供时钟。办法就是发送一个字节来实现,因为还是上面说的,发送一个字节就意味着收到一个字节,代码和写完全一样,只要把读出来的字节保存即可。u8SPI_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); returnSPI_I2S_ReceiveData(SPI1); }

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表