OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 10274|回复: 2

w25x16 读数据指令问题

[复制链接]

109

主题

1606

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2222
金钱
2222
注册时间
2011-12-15
在线时间
37 小时
发表于 2012-3-23 18:48:13 | 显示全部楼层 |阅读模式


Read Data 03h A23–A16 A15–A8 A7–A0 (D7–D0) (Next byte) continuous//寄存器内容
void Spi_Flash_ReadData(u32 addr,u8 *p,u32 sum)
{
u8 data=0,temp;
u32 i;
flash_cs=0;//片选得到芯片
spi_writereadbyte(0x03);  //读数据
temp=addr>>16;
spi_writereadbyte(temp);//读数据
temp=addr>>8;
spi_writereadbyte(temp);//读数据
temp=addr;
spi_writereadbyte(temp);//读数
spi_writereadbyte(0xff);//这里为何非加不可呢
for(i=0;i<sum;i++)
*(p+i)=spi_writereadbyte(0xff); //读数据
//这样就会自动读取出sum个数据了
flash_cs=1;//释放片选
//数据读取完成
}

当我们写完寄存器地址之后,还需要加入spi_writereadbyte(0xff);这句话,如果不加这8个周期,第一个读语句是读不到数据的,只有到第二个读才可以读到时序,这里我就很奇怪,对于指令0x03,w25x16官方给出的时序图的描述都是不用做8个时钟延时的,就可以直接读到一个数据,但是我们在实际操作当中,却要加,这是为什么呢?

专业制作STM32 物联网通信模块板,模块交流群:369840039。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-3-23 22:05:45 | 显示全部楼层
void SPI_Flash_Read(u8* pBuffer,u32 ReadAddr,u16 NumByteToRead)   

  u16 i;  
#ifdef OS_CRITICAL_METHOD   //如果OS_CRITICAL_METHOD定义了,说明使用ucosII了.
OS_ENTER_CRITICAL();//停止调度
#endif        
SPI_FLASH_CS=0;                            //使能器件   
    SPI2_ReadWriteByte(W25X_ReadData);         //发送读取命令   
    SPI2_ReadWriteByte((u8)((ReadAddr)>>16));  //发送24bit地址    
    SPI2_ReadWriteByte((u8)((ReadAddr)>>8));   
    SPI2_ReadWriteByte((u8)ReadAddr);   
    for(i=0;i<NumByteToRead;i++)

        pBuffer=SPI2_ReadWriteByte(0XFF);   //循环读数  
    }
SPI_FLASH_CS=1;                            //取消片选 
#ifdef OS_CRITICAL_METHOD   //如果OS_CRITICAL_METHOD定义了,说明使用ucosII了.
OS_EXIT_CRITICAL();//准许调度
#endif               
}  
这是我们开发板的读取函数,没你说的多加0XFF的问题.>
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

109

主题

1606

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2222
金钱
2222
注册时间
2011-12-15
在线时间
37 小时
 楼主| 发表于 2012-3-24 09:56:46 | 显示全部楼层
哦,老大我找到原因了,因为我设置为从地址0开始读取,但是我实验之后,发现应该是从地址1才可以开始正常读取的,所以我加了8个延时,使得从1地址继续读取,读到数据了!所以是应该不存在地址0的!
专业制作STM32 物联网通信模块板,模块交流群:369840039。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-25 07:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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