yixuantaba 发表于 2013-10-7 09:12:53

MSP430外扩flash SST25VF032B,为什么只能写入32K的数据?

大家好!
    MSP430外扩flash SST25VF032B,为什么只能写入32K的数据?
串口每包接收256个字节,然后写入flash芯片,数据共有200包数据,也就是51.2k字节。200包数据接收完后发现只写入了32K字节,因为之后读出来的数据全是0xff,写flash的起始地址是0x0006。请朋友们指点迷津!谢谢了!

sunshulin 发表于 2013-10-7 10:27:53

是不是 你长度计数的变量定义成char了?32K/256 = 128char -127~+128

bujie8010 发表于 2013-10-7 10:43:20

sunshulin 发表于 2013-10-7 10:27 static/image/common/back.gif
是不是 你长度计数的变量定义成char了?32K/256 = 128char -127~+128

我也猜类似的原因!!

Name_006 发表于 2013-10-7 10:52:23

32K字节 对啊32K 很可能是 你某个计算数据量的 变量出错了                                                         

yixuantaba 发表于 2013-10-8 09:55:45

这种错误是很明显的,我不会犯!现在发现是地址计算错了,正在琢磨...
谢谢大家的指教!

祥子 发表于 2013-10-8 17:30:46

把源代码上传瞅瞅   只需要 操作flash的这一段~

yixuantaba 发表于 2013-10-9 14:21:40

祥子 发表于 2013-10-8 17:30 static/image/common/back.gif
把源代码上传瞅瞅   只需要 操作flash的这一段~

操作flash的代码都是历程,我错在送进写flash的地址到32K之后就出错了。
计算写flash的起始地址公式:
#define LoadStart 0x06
unsigned long addr_32;
   addr_32=(unsigned long)(LoadStart+0xffe0-0x2000+i*16);
之前出错的公式是:
#define LoadStart ((unsigned long)0x06)
unsigned long addr_32;
   addr_32=LoadStart+0xffe0-0x2000+i*16;
但是两者有区别吗?

祥子 发表于 2013-10-10 09:42:29

yixuantaba 发表于 2013-10-9 14:21 static/image/common/back.gif
操作flash的代码都是历程,我错在送进写flash的地址到32K之后就出错了。
计算写flash的起始地址公式:
#d ...

用的是CCS, 还是用IAR?另外 变量 i 定义的什么类型?

yixuantaba 发表于 2013-10-10 10:14:25

祥子 发表于 2013-10-10 09:42 static/image/common/back.gif
用的是CCS, 还是用IAR?另外 变量 i 定义的什么类型?

编译器是IAR,i是uchar型的,宏定义的那2种方式,跟计算addr_32有影响吗?有区别吗?

祥子 发表于 2013-10-10 11:03:17

刚验证了下,IAR环境,两种计算结果是一样的。#define LoadStartRight 0x06
#define LoadStartWrong ((unsigned long)0x06)

main()
{
unsigned long int right_addr_32;
unsigned long int wrong_addr_32;

unsigned char i,j;
volatile unsigned int result_same,result_different;

//变量清零
result_same=0;
result_different=0;

//i,j均从0开始计数
i=0;
j=0;
for(;i<255;)
{
   
    //两种宏定义的表达式进行计算
    right_addr_32=(unsigned long)(LoadStartRight+0xffe0-0x2000+i*16);
    wrong_addr_32=LoadStartWrong+0xffe0-0x2000+j*16;
   
    i++;
    j++;
   
    //对两种表达式的结果进行比较,并且统计计数
    if(right_addr_32 == wrong_addr_32)
    {
      result_same++;
    }
    else
    {
      result_different++;
    }
   
}
    //在此处设置断点,查看统计变量result_same和result_different的值
    result_same=result_same;
    result_different= result_different;

}

金牛AKI 发表于 2013-10-10 11:21:00

呵呵不懂帮你顶顶

yixuantaba 发表于 2013-10-10 11:42:42

祥子 发表于 2013-10-10 11:03 static/image/common/back.gif
刚验证了下,IAR环境,两种计算结果是一样的。

谢谢你帮我验证了我的问题!
我有点郁闷了,会不会是优化搞的怪!我试试吧。

yixuantaba 发表于 2013-10-10 17:19:38

祥子 发表于 2013-10-10 11:03 static/image/common/back.gif
刚验证了下,IAR环境,两种计算结果是一样的。

我的单片机是16位的,可能跟这有关系!谢谢你帮我分析问题!

songshu5 发表于 2015-1-17 22:23:20

楼主能否上传下全部的源程序,多谢了
页: [1]
查看完整版本: MSP430外扩flash SST25VF032B,为什么只能写入32K的数据?