野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 15436|回复: 4

【提问】关于SPI接口发送字节函数的问题

[复制链接]
发表于 2015-10-26 08:02:31 | 显示全部楼层 |阅读模式
在学习SPI接口操作W25Q64这块对下面这个函数不太理解,为什么程序会跳出第二个while循环?
查参考手册SPI的SR寄存器复位值为0x0002,即TXE为1,RXNE为0,调用该函数写指令时(比如调用SPI_FLASH_SendByte(W25Q_SectorErase);),第一个while不满足条件跳出循环执行 SPI_I2S_SendData(SPI1, byte);
但进入第二个while,SPI没接收数据啊,RXNE为0满足条件,程序岂不是卡在这里死循环了?为什么会跳出循环,RXNE何时置1的,难道W25Q64的DO口的高阻态发送到了SPI的接收缓存区?
想不通为什么,希望有人解答谢谢。
u8 SPI_FLASH_SendByte(u8 byte)
{
回复

使用道具 举报

 楼主| 发表于 2015-10-26 08:05:20 | 显示全部楼层
u8 SPI_FLASH_SendByte(u8 byte)
{

        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
       
        SPI_I2S_SendData(SPI1, byte);
       
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
       
        return SPI_I2S_ReceiveData(SPI1);
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-10-26 08:21:05 | 显示全部楼层
自己在软件仿真时发现当向DR写入数据时SR状态变为0x0003。
回复 支持 反对

使用道具 举报

发表于 2015-10-26 09:44:44 | 显示全部楼层
用jLINK等仿真单步调,就有这个问题。可以在函数头和尾打断点全速运行就没问题
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-10-26 12:40:04 | 显示全部楼层
gjk1100 发表于 2015-10-26 09:44
用jLINK等仿真单步调,就有这个问题。可以在函数头和尾打断点全速运行就没问题

谢谢。
这个我明白,就是当初不知道为啥RXEN置1了,从而程序跳出了第二个while;
自己又想了一下,觉得STM32的Rx和Tx与51的SBUF是一样的,这样就理解当向DR写命令时RXEN与TXE为1了。
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-24 02:10 , Processed in 0.038585 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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