This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

F28335串口在线更新程序的问题------flash_api code调用擦除函数返回值为24

如题:
我的烧录方法是:
将ti官方提供的flash_api code工程依据自己的需求做合适的修改,编译并转换成16进制的机器码(这个工程会有一个c _init00地址)。
然后在应用程序cmd文件中定义相关的flash段,将16进制的机器码以一个数组的形式存放到分配的段里。
上位机是sdflash,sdflash向dsp发送烧录命令后,应用程序将16进制的机器码从flash段复制到ram中,然后跳转到flash_api code工程的c _init00地址处开始运行。
flash_api code会与上位机握手并传输数据,同时根据上位机的命令执行擦除、编程、校验操作。

目前我的问题是:烧录开始以后  dsp跳转到flash_api code中运行,   但执行擦除操作时,返回值是24(0x18),根据手册 返回值24表示
STATUS_FAIL_PRECOMPACT
-------------------------------------
Erase operation failed because the pre- 
compaction portion failed. The pre-compaction is 
applied to all sectors on the device. The 
FLASH_ST structure will return a fail address 
corresponding to the first sector fails this step. 


奇怪的是我用jtag仿真器将flash_api  code下载到dsp中单步调试,用串口调试工具发送握手报文和擦除指令时,flash_api  code正确调用了擦除函数,且返回值也是正确的0,一旦脱离调试环境,用sdflash软件启动烧录过程,则返回值就成了24,报erase fail 

请问这个错误是什么原因?应该如何解决?  期待TI的专家能有解答。


下面这个帖子和我的情况比较类似,似乎也还没有解决。

www.deyisupport.com/.../69031.aspx

  • 请问楼主解决了吗?我现在在做28335 Flash 远程升级,想通过远程的网络摄像机串口升级28335 的Flash程序,请问如何做呢?用你们说的Flash api可以么?

  •  我已经搞定了。

     你想远程升级,只要上位机与28335的串口之间有通道,理论上都是可行的,但是其他的那些方法都有个缺点,需要修改28335的启动方式

    这个需要通过修改dsp相关管脚的电平重新上电,这种要求是远程升级做不到的,实际上就是不能远程升级。

    我的这种方法在烧录之前不需要对dsp做任何处理,只要把相关烧录接口集成到应用程序即可。非常适合远程升级或者现场升级----均不需要对待升级机器做额外操作。

  • 对对,我想做的也是你这种方法,不更改28335的启动模式;

    请问你工程具体的逻辑是什么样的呢?   还有你的CMD文件时如何分配的呢?

    比如用于烧写的程序烧写在FLashA中,运行时API函数调到RAM里面运行; 正常的用户程序烧写在FlashC中,这部分是实际的项目代码,程序一开始先执行烧写,烧写完后请问如何能跳转至FlashC里面运行新程序呢?




  • 你qq多少?

  • 呵呵,真的谢谢了;

    我的qq:  1170047083

  • 我最近也在整自升级的问题,不知仁兄的问题解决了没?

  • 已经搞定了

  • 啊,我也在弄,遇到不懂的问题能不能请您指导一下?

  • 可以的,你把qq号发过来,我加你,有什么问题我知道的话就告诉你。

  • 万分感谢!

  • 最近我也在搞在线升级的事情,但是感觉28335比后续TI的其他型号要麻烦,因为有程序数据是放在FLASH中的,比如通过串口升级的话,我的程序放在哪里(在未用的空间?),如果将原来程序运行的FLASH擦除,正在运行的程序不就飞了吗?

    还麻烦楼主分享一下思路 ?

    本人QQ:278115853, 请多指教~~

  • @fxqu,

     我也在做F28335自动升级,可否也共享一下你的思路

    QQ:2209893707

  • @fxqu

    我也买了块板子,也想试一下,用分A、B块的方式?还是其它方式比较好

    QQ:66073631

  • 我QQ63281485,想更你沟通一下,顺便请看一下我这个帖子

    http://www.deyisupport.com/question_answer/microcontrollers/c2000/f/56/t/78346.aspx

     

  • 我现在也是返回值是24,你当时怎么搞定的,兄弟,很着急啊我,我也想远程升级才用到此函数库,我的qq号码是29851592,看到请加我好友,谢谢你了

  • 大神,兄弟我现在刚接触DSP,想实现你的功能,集体该怎样做,希望大神指点,我QQ762095668

  • 楼主求助啊,正在面临同样的问题,现有的程序是通过flash启动,加载程序到内存,然后通过串口进行flash编程,但是发现问题是怎么擦也擦不掉flash,返回值一直是0x18,挂仿真器烧写flash擦除就一切正常,我的qq-719916350,多谢指点啦

  • 你好,最近我也在进行F28235的程序自升级功能开发,遇到一些问题,请您指教一下。

     

    我的QQ为:308616043

  • 您好!

    针对28335在线升级的事,网上这么多人都急切想知道,还是麻烦兄台能写个精华的文章放在论坛里吧。这样大家

    都能受益。我也很想知道,麻烦你能告诉我,我的QQ:897299644

  • 请问能否告知一下你的28335远程程序更新是怎么做到的,谢谢!

    我QQ :773566433

  • 我来说两句吧,以前干过类似的事:

    #pragma CODE_SECTION(Updata_test, "Code_Updata"); //Flash_H

    void Updata_test()  
    {
     //这里做了个很有意思的事:当前程序的内容是空的,带仿真器运行时如果你在watch窗口里将Code_Updata_en
     //的值改为1,你会发现电路板上的LED开始闪起来来了,神奇吧!
     //这是怎么实现的呢?~~~~偶在User_FlashAPI()里将一个数组a[]写入到了自定义的"Code_Updata"段,
     //这个数组是 GpioDatB(RUN)=!GpioDatB(RUN) 的源码!这样,程序再次调用后就不再是运行空函数了...

     //怎么得到一段代码的源码呢?ccs安装目录下有一个工具"hex2000",在dos下执行下述命令即可得到:
     //hex2000 -memwidth 16 -romwidth 16 -a  F28035test.out -map F28035test.map -o aa.txt
     //不过事先需要将HEX2000.exe以及程序生成的.out文件.map文件放在一个独立的文件夹中,用dos命令进
     //入该文件夹的目录,然后执行...

     //可以想象,如果数组a[]是通过通讯上传的,而我的源码是一个程序更新包,那不就能实现在线升级了吗?
    }

    需要注意的是 flash_api相关函数不能被中断,所以运行时先关闭中断。。。。

  •     快要两年了,兄台,实在不好意思把你帖子挖出来了,小弟最近在研究 F28335 远程升级问题,我自己做了一块板子,与F28335的SCI-A通讯 ,另外一头与上位机

    以太网通讯,想要自己把hex文件通讯烧写进去, 不知道兄台的远程升级是怎么实现的?或者是一个怎样的实现过程?多谢了!

     

        QQ:530322882

  • 简单说下我的方法:

    Erase与Flash的函数需要定义在RAM区

    需要升级的Hex文件通过网络下载到Flash的空白区域后

    禁止中断,擦除-->写入-->验证-->重启

  • Qq674174001.有问题可以请教吗
  • 兄弟做好了吧,可以请教下吗674174001
  • 同样问题,求回复,QQ621829015