OpenEdv-开源电子网

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

关于SPI读数函数的几个疑问!

[复制链接]

60

主题

225

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
483
金钱
483
注册时间
2013-7-27
在线时间
4 小时
发表于 2014-11-21 16:54:31 | 显示全部楼层 |阅读模式
5金钱

void SPI_Flash_Read(u8* pBuffer,u32 ReadAddr,u16 NumByteToRead)   

      u16 i;        
    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;                            //取消片选          
}


疑问1:按照这个函数的设计,本意是,先发送地址后,然后一次读取数据。可是我仔细一想,既然地址都写入了,再往这些地址里写入 0xff ,  那么读出的数据 岂不是都是  0xff ?   
疑问2:用库函数操作spi确实简单,在初始化部分配置完spi后, 感觉后面的读和写函数 好像与spi的时序没有啥关系? 
疑问3: 一页 到底有多大地址范围?

实在想不明白,求大侠指点,不胜感激!!!

最佳答案

查看完整内容[请看2#楼]

 问题1:   主机和从机都有一个串行移位寄存器,主机通过向它的SPI串行寄存器写入一个字节来发起一次传输,寄存器通过MOSI信号将字节传送给从机,从机也将字节的的移位寄存器中断内容通过MISO信号返回给主机。这样,两个移位寄存器中的内容就被交换。  外设的写操作,和读操作时同步完成的。如果只进行写操作,主机只需忽略接收到的字节,反之,若主机要读取从机的一个字节,就必须发送一个 空字节来引发从 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2014-5-1
在线时间
1 小时
发表于 2014-11-21 16:54:32 | 显示全部楼层
 问题1:   主机和从机都有一个串行移位寄存器,主机通过向它的SPI串行寄存器写入一个字节来发起一次传输,寄存器通过MOSI信号将字节传送给从机,从机也将字节的的移位寄存器中断内容通过MISO信号返回给主机。这样,两个移位寄存器中的内容就被交换。

 外设的写操作,和读操作时同步完成的。如果只进行写操作,主机只需忽略接收到的字节,反之,若主机要读取从机的一个字节,就必须发送一个 空字节来引发从机的传输
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2014-11-21 17:11:33 | 显示全部楼层
顶帮。。。。。。
小小蜗牛
回复

使用道具 举报

60

主题

225

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
483
金钱
483
注册时间
2013-7-27
在线时间
4 小时
 楼主| 发表于 2014-11-21 17:15:35 | 显示全部楼层
回复【2楼】jiutianshenjian:
---------------------------------
帮忙解释一下啊,别老顶啊
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2014-11-21 17:19:43 | 显示全部楼层
回复【3楼】sara9999:
---------------------------------
看你是西安的,顶一下嘛,不懂啊
小小蜗牛
回复

使用道具 举报

60

主题

225

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
483
金钱
483
注册时间
2013-7-27
在线时间
4 小时
 楼主| 发表于 2014-11-21 17:21:28 | 显示全部楼层
回复【4楼】jiutianshenjian:
---------------------------------
你的qq多少? 交流交流
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2014-11-21 17:28:38 | 显示全部楼层
不上qq了。。。
小小蜗牛
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2014-11-21 18:41:30 | 显示全部楼层
改上海了,好吧。。。。
小小蜗牛
回复

使用道具 举报

60

主题

225

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
483
金钱
483
注册时间
2013-7-27
在线时间
4 小时
 楼主| 发表于 2014-11-21 23:14:33 | 显示全部楼层
回复【8楼】shell贝:
---------------------------------
pBuffer=SPI2_ReadWriteByte(0XFF);   //循环读数 

在  SPI_Flash_Read中,写完地址,就应该读取数据了,可是为何要写入0xff,再读?? 这样无论写入啥,岂不都是0xff?
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2014-5-1
在线时间
1 小时
发表于 2014-11-21 23:44:28 | 显示全部楼层
芯片手册上这么说:11.2.8读取数据指令“(03H)” 
读数据指令允许一个或多个数据字节被顺序地从存储器中读出。该 
指令通过驱动/ CS引脚为低电平,然后转移指令代码“03H”之后发起的 
一个24位地址(A23-A0)为DI引脚。代码和地址位被锁存的上升沿 
CLK引脚。收到地址后,指定的存储单元的数据字节将被移出

我的理解是  数据字节被移出后 被保存到移位寄存器中,然后主机发送0Xff,交换从机寄存器中的内容,之后从机寄存器的寄存器的内容变为0xff,主机则得到读取的数据
回复

使用道具 举报

60

主题

225

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
483
金钱
483
注册时间
2013-7-27
在线时间
4 小时
 楼主| 发表于 2014-11-21 23:49:26 | 显示全部楼层
回复【10楼】shell贝:
---------------------------------

不知道啥情况,始终读数不正确,要么为 0xff,要么为0x00。 
问题描述在下面:
http://www.openedv.com/posts/list/0/42523.htm?fromAll=0#243809

我实在找不出原因,麻烦你帮我看一下,非常感谢!!!
回复

使用道具 举报

15

主题

181

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
389
金钱
389
注册时间
2014-11-8
在线时间
40 小时
发表于 2015-4-6 18:49:23 | 显示全部楼层
问题2:例程用的是硬件spi,时序stm32自己就完成了。
Good good study , day day up...
回复

使用道具 举报

0

主题

6

帖子

0

精华

高级会员

Rank: 4

积分
706
金钱
706
注册时间
2015-6-5
在线时间
80 小时
发表于 2015-6-5 13:19:21 | 显示全部楼层
都是HAL苦的,要寄存器版本的
回复

使用道具 举报

86

主题

983

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1848
金钱
1848
注册时间
2013-4-15
在线时间
163 小时
发表于 2015-7-24 15:53:56 | 显示全部楼层
回复【10楼】shell贝:
---------------------------------
这个解释很合理
合肥-文盲
回复

使用道具 举报

5

主题

266

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1526
金钱
1526
注册时间
2016-7-20
在线时间
155 小时
发表于 2017-7-27 14:14:21 | 显示全部楼层
SPI2_ReadWriteByte(0XFF);我看过一个文档讲过,这个是启动传输。
我是可以什么都不说 ,但不可以什么都不做。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-4-18 12:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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