OpenEdv-开源电子网

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

求助解释spi的代码

[复制链接]

14

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2018-8-17
在线时间
34 小时
发表于 2018-10-7 18:20:50 | 显示全部楼层 |阅读模式
3金钱
void W25QXX_Read(u8* pBuffer,u32 ReadAddr,u16 NumByteToRead)   
{
  u16 i;                 
W25QXX_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);    //循环读数  红色的这个函数是读写数据,0XFF指的是要读取的字节位数还是字节本身?
    }
W25QXX_CS=1;                 
}  
红色字体所疑所问

最佳答案

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

理论上这个数据可以是任意数据,但是为了不引起某些特殊操作,约定俗成的都用了0xff
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13129
金钱
13129
注册时间
2012-11-26
在线时间
3814 小时
发表于 2018-10-7 18:20:51 | 显示全部楼层
理论上这个数据可以是任意数据,但是为了不引起某些特殊操作,约定俗成的都用了0xff
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13129
金钱
13129
注册时间
2012-11-26
在线时间
3814 小时
发表于 2018-10-7 18:25:56 | 显示全部楼层
论坛里以前有解释多次,想详细了解的话,自己多搜搜吧
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2018-10-7 20:50:46 | 显示全部楼层
0xFF这个数据可以发送任意的,你发送0x00也是可以了,但是为了避免部分芯片不必要的麻烦,其他数据造成读取的数据错误,所以发送0xFF,将MOSI管脚拉高
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2018-10-7 21:40:25 | 显示全部楼层
这spi是个全双工的模式下工作的, 即同时收也同时发, 实际上是没有只读模式, 只读模式也只是发送的数据忽视它, 但必须是同时收发, 所以要读的同时是要发, 既然发送的数据最终是会被忽视, 那就随便发什么也没什么, 习惯上发0xFF
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3448
金钱
3448
注册时间
2017-7-4
在线时间
869 小时
发表于 2018-10-7 23:05:02 | 显示全部楼层
SPI的读写模式包括:
1)先写后读,比如读寄存器,存储地址等;
2)先写后写,比如写寄存器,存储地址等;
3)写和读同时,一般是非标SPI器件;
4)只读/只写。
权威解析:楼主案例属于“1”。SPI总线时钟由主机控制,这个操作只是产生用于读数据的时钟信号,函数参数可以填任意值。
回复

使用道具 举报

14

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2018-8-17
在线时间
34 小时
 楼主| 发表于 2018-10-7 23:11:23 | 显示全部楼层
八度空间 发表于 2018-10-7 20:50
0xFF这个数据可以发送任意的,你发送0x00也是可以了,但是为了避免部分芯片不必要的麻烦,其他数据造成读取 ...

为什么会造成不必要的麻烦?求教了!想理解的更深些!
回复

使用道具 举报

14

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2018-8-17
在线时间
34 小时
 楼主| 发表于 2018-10-7 23:36:10 | 显示全部楼层
Acuity 发表于 2018-10-7 23:05
SPI的读写模式包括:
1)先写后读,比如读寄存器,存储地址等;
2)先写后写,比如写寄存器,存储地址等;
...

W25QXX_Read(datatemp,FLASH_SIZE-100,SIZE);                                        //从倒数第100个地址处开始,读出SIZE个字节
悄咪咪的再问一个,这个datatemp是个数组,只规定了长度不知道内容的那种,怎么就能读了并在LCD上显示呢?
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3448
金钱
3448
注册时间
2017-7-4
在线时间
869 小时
发表于 2018-10-8 21:33:59 | 显示全部楼层
Ckeai 发表于 2018-10-7 23:36
W25QXX_Read(datatemp,FLASH_SIZE-100,SIZE);                                        //从倒数第100个地址处开始,读出SIZE个字节
悄咪咪的 ...

数组就是一段内存,把内存首地址给到函数即可,然后从flash中读出数据放在这段内存中,然后显示。
回复

使用道具 举报

14

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2018-8-17
在线时间
34 小时
 楼主| 发表于 2018-10-9 17:28:52 | 显示全部楼层
Acuity 发表于 2018-10-8 21:33
数组就是一段内存,把内存首地址给到函数即可,然后从flash中读出数据放在这段内存中,然后显示。

懂了 懂了 感谢!
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2018-10-24 21:44:27 | 显示全部楼层
Ckeai 发表于 2018-10-7 23:11
为什么会造成不必要的麻烦?求教了!想理解的更深些!

这个具体要看你控制的SPI芯片的要求了
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 13:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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