OpenEdv-开源电子网

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

SPI写地址的疑惑

[复制链接]

10

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
454
金钱
454
注册时间
2016-4-22
在线时间
82 小时
发表于 2016-9-9 21:01:26 | 显示全部楼层 |阅读模式
3金钱
    在学习SPI时,有一个问题搞不清楚,请教一下大家。    SPI例程中有这样一句

            W25QXX_Write((u8*)TEXT_Buffer,FLASH_SIZE-100,SIZE);  //从倒数第100个地址处开始,写入SIZE长度的数据

                而 FLASH_SIZE=128*1024*1024;        //FLASH 大小为16M字节
        也就是说 FLASH_SIZE 是按位定义的   16M字节=16*8*1024*1024 bit
          即写入的起始地址是倒数第100个位
        而要写入的数组如定义为    const u8 TEXT_Buffer[]={"WarShipSTM32 SPI TEST"};    这个数组是21个字节,即168个位
        写不下哦,这是怎么回事,还是我理解错了,还望高手指点。



最佳答案

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

自己在刷屏啊,个人认为你的帖子没回复主要:1.问题之内有问题,在你的问题描述中看出你对字节与位理解混乱,写入是按字节写的,不会去计算位数;2.这里的FLASH_SIZE应该是有问题的,值应该是16*1024*1024;3.W25Q128之所以在FLASH_SIZE有问题的情况下能够写入读出,说明超出范围会循环写的。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2016-9-9 21:01:27 | 显示全部楼层
自己在刷屏啊,个人认为你的帖子没回复主要:1.问题之内有问题,在你的问题描述中看出你对字节与位理解混乱,写入是按字节写的,不会去计算位数;2.这里的FLASH_SIZE应该是有问题的,值应该是16*1024*1024;3.W25Q128之所以在FLASH_SIZE有问题的情况下能够写入读出,说明超出范围会循环写的。
回复

使用道具 举报

10

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
454
金钱
454
注册时间
2016-4-22
在线时间
82 小时
 楼主| 发表于 2016-9-9 22:17:30 | 显示全部楼层
    然后我改成了  W25QXX_Write((u8*)TEXT_Buffer,FLASH_SIZE,SIZE);
   
    也就是说将写入的首地址改为了W25Q128的最后一位,
    下载代码,结果依然和以前的一样,疑惑
回复

使用道具 举报

10

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
454
金钱
454
注册时间
2016-4-22
在线时间
82 小时
 楼主| 发表于 2016-9-10 20:29:26 | 显示全部楼层
还是请教一下原子哥吧,希望原子哥有时间能看一下我的问题。
回复

使用道具 举报

10

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
454
金钱
454
注册时间
2016-4-22
在线时间
82 小时
 楼主| 发表于 2016-9-11 10:27:15 | 显示全部楼层
。。。。。。。。
回复

使用道具 举报

10

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
454
金钱
454
注册时间
2016-4-22
在线时间
82 小时
 楼主| 发表于 2016-9-11 10:28:08 | 显示全部楼层
怎么每一个人理我,是问题太简单了么,还是都没注意过这个问题
回复

使用道具 举报

10

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
454
金钱
454
注册时间
2016-4-22
在线时间
82 小时
 楼主| 发表于 2016-9-11 10:30:21 | 显示全部楼层
我猜想是W25Q128的地址在写的时候是可以循环的,开发指南上说写的地址是不能超过W25Q128的容量的
回复

使用道具 举报

10

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
454
金钱
454
注册时间
2016-4-22
在线时间
82 小时
 楼主| 发表于 2016-9-11 17:51:24 | 显示全部楼层
龙之谷 发表于 2016-9-11 17:35
自己在刷屏啊,个人认为你的帖子没回复主要:1.问题之内有问题,在你的问题描述中看出你对字节与位理解混乱 ...

嗯嗯,谢谢指点,我一直以为是按字节来写的,可是看到FLASH_SIZE,其使用位来表示的,我才怀疑写入位置是由位来确定的。
回复

使用道具 举报

10

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
454
金钱
454
注册时间
2016-4-22
在线时间
82 小时
 楼主| 发表于 2016-9-11 19:06:26 | 显示全部楼层
龙之谷 发表于 2016-9-11 17:35
自己在刷屏啊,个人认为你的帖子没回复主要:1.问题之内有问题,在你的问题描述中看出你对字节与位理解混乱 ...

还有个问题想请教一下你,在例程的main函数中有这样一句
         
  W25QXX_Read(datatemp,FLASH_SIZE-100,SIZE);       

我实在搞不清楚为什么是datatemp,我查看了一下这个函数,是这样的

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

//pBuffer:数据存储区

datatemp在之前的定义为           u8 datatemp[SIZE];   也就是
    TEXT_Buffer[]={"WarShipSTM32 SPI TEST"}  这个数组的长度

不知道为什么在这里用的是datatemp,而不是和
   W25QXX_Write((u8*)TEXT_Buffer,FLASH_SIZE-100,SIZE)一样用
    (u8*)TEXT_Buffer,
   还望高手指点一下,谢谢
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2016-9-11 19:10:02 | 显示全部楼层
Alter 发表于 2016-9-11 19:06
还有个问题想请教一下你,在例程的main函数中有这样一句
         
  W25QXX_Read(datatemp,FLASH_SIZE-100,S ...

你想用也可以用
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

10

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
454
金钱
454
注册时间
2016-4-22
在线时间
82 小时
 楼主| 发表于 2016-9-11 19:15:49 | 显示全部楼层

可我试了一下,改了之后会读不出来数据,不知道什么原因。。。。。
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2016-9-11 20:50:42 | 显示全部楼层
const 去掉
回复

使用道具 举报

10

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
454
金钱
454
注册时间
2016-4-22
在线时间
82 小时
 楼主| 发表于 2016-9-11 21:33:09 | 显示全部楼层

为什么要去掉const呢,不解
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2016-9-11 22:03:49 | 显示全部楼层
Alter 发表于 2016-9-11 21:33
为什么要去掉const呢,不解

C语言知识
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

6

主题

110

帖子

0

精华

高级会员

Rank: 4

积分
553
金钱
553
注册时间
2014-10-23
在线时间
195 小时
发表于 2016-9-12 09:05:08 | 显示全部楼层
FLASH_SIZE=128*1024*1024;        //这句有问题的
应该是FLASH_SIZE=16*1024*1024;计算出flash总的字节数,剩下的就都好理解了。
回复

使用道具 举报

10

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
454
金钱
454
注册时间
2016-4-22
在线时间
82 小时
 楼主| 发表于 2016-9-12 12:35:50 | 显示全部楼层
卡塔之魂 发表于 2016-9-12 09:05
FLASH_SIZE=128*1024*1024;        //这句有问题的
应该是FLASH_SIZE=16*1024*1024;计算出flash总的字节数 ...

应该是这样的
回复

使用道具 举报

10

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
454
金钱
454
注册时间
2016-4-22
在线时间
82 小时
 楼主| 发表于 2016-9-12 12:56:35 | 显示全部楼层

我懂为什么这里是datatemp了
  其实这里只要提供一个数组就可以了,与数组首地址并没有很大关系
   仔细看一下这个读函数

   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);           //循环读数  
    }
        W25QXX_CS=1;                                                   
}  

  这个函数的作用是 :在指定的位置,写入固定长度的数据(写0XFF,会接收到从机返回来的数据)并将返送回来的数据存入pBuffer这个指针指向的数组,即datatemp【】这个数组中,之后再显示出来就行,显示用的是这一句:
   LCD_ShowString(30,190,200,16,16,datatemp);      
    datatemp代表的是datatemp【】这个数组的首地址
  

因此,我要保证datatemp[]这个数组能够存放下之前写入的数据,所以才会在主函数中出现这一句定义  u8 datatemp[SIZE];

   
回复

使用道具 举报

10

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
454
金钱
454
注册时间
2016-4-22
在线时间
82 小时
 楼主| 发表于 2016-9-12 13:02:22 | 显示全部楼层
Alter 发表于 2016-9-12 12:56
我懂为什么这里是datatemp了
  其实这里只要提供一个数组就可以了,与数组首地址并没有很大关系
   仔 ...

   所以你说的去掉const也行,这样就可以对TEXT_Buffer[]这个数据进行修改了,即可以对它进行再次的写入了,不过在下面的显示那一句也要该为
LCD_ShowString(30,190,200,16,16,(u8*)TEXT_Buffer);
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-25 13:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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