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.

tms570的1227 FEE f021库 操作片上flash模拟eeprom的问题

Other Parts Discussed in Thread: HALCOGEN, TMS570LS1224

看了下 halcogen的对里面的函数不是很理解

  1. 读写函数 异步和同步的区别
  2. TI_Fee_MainFunction()  这个函数的作用是什么? 例子里面每次操作后面都有 这段:

    do
    {
    TI_Fee_MainFunction();
    delay();
    Status=TI_Fee_GetStatus(0);
    }
    while(Status!=IDLE);这段是什么意思?  delay我们准备换成定时器 而不是让程序死在这边 这部大概要多少毫秒?  我们的程序是安全相关的   while(Status!=IDLE);这个死循环我们也得改掉 

  3. 最后面 这个 TI_Fee_Format(0xA5A5A5A5U);  这个格式化操作是什么作用 

tks for answering
best regards
  • CC,

    请参考以下:

    1.读写函数 异步和同步的区别

    同步读写API函数会在函数内部完成读写操作,而异步读写API函数只会初始化读写状态来发起读写操作,但是不会进行数据的操作,这个时候就必须要在TI_FEE_MainFunction()里面完成数据的操作。

    2.TI_Fee_MainFunction()  这个函数的作用是什么? 例子里面每次操作后面都有 这段:

    do
    {
    TI_Fee_MainFunction();
    delay();
    Status=TI_Fee_GetStatus(0);
    }
    while(Status!=IDLE);这段是什么意思?  delay我们准备换成定时器 而不是让程序死在这边 这部大概要多少毫秒?  我们的程序是安全相关的   while(Status!=IDLE);这个死循环我们也得改掉

    TI_FEE_Mainfunction()需要定期或在中断里面调用,来完成异步的数据操作等。从代码看delay也是在计数,程序不会死在这里。

    3.最后面 这个 TI_Fee_Format(0xA5A5A5A5U);  这个格式化操作是什么作用

    这个是例程最后用来格式化bank7的,不是必须的。


    Best Regards

    Sam

  • 感谢你的回答  对我帮助很大

    还有两个小问题 

    1.同步都写的语句走完,是不是都写就结束了,不需要像异步那样 循环调用mainfunction?

    2.最后的那个格式化 是不是清除bank7上面的内容?那invalidate函数的功能又是什么呢?还是两个要配合使用?

  • 1.是的。

    2.是的,清除整个FEE上的内容。invalidate将这个block进行invalidate操作,相当于没有写东西在里面。这两个不是配合在一起的。

  • 感谢你的解答

    你说的 “invalidate将这个block进行invalidate操作”  将某个block无效,可否理解成 擦出指定的block?

  • 1.这个block 应该怎么理解呢?存储浮点数和整形数,这个block的大小是不是也要改变?

    2.现在使用的芯片是TMS570LS1224,Flash 只有BANK0和BANK7,如果存储数据,我不是用FEE(BANK7),而是用BANK0,是否可以?若可以,相对FEE之下,是否有哪些不好的地方? 应该怎么操作?要注意哪些问题?

  • 可以参考下FEE的User Guide。

    不建议用BANK0来存储数据,同一个bank不能同时进行指令的执行和数据擦写。一般用BANK0来存储程序,BANK7来模拟EEPROM进行数据存储。

    TI FEE User Guide.pdf
  • 谢谢您的回复,对于HALCOGEN 产生的关于FEE的代码我还有些疑问:

    1. 写入的时候使用 TI_Fee_WriteAsync(BlockNumber, &SpecialRamBlock[0]); 函数, 但是 SpecialRamBlock 中有100 Bytes 的值,Block 的大小是8 Bytes,他是如何写入100个Bytes的值的呢? 根据实测的情况看只写入了 与 Block  大小对应Bytes的数据。

    2. 根据手册上的说法,Virtual Sector Header 有16 bytes ,Data Block Header 有 24 Bytes, 但是为什么我这边看到 地址是 0xF0200000 对应的是16Bytes 的数据,后面地址是 0xF0200010 ,16Bytes 对应的值都是 1,然后是 24Bytes 的Data Block Header 接着是与Block 大小对应Bytes 的数据(Sector 1的起始地址是0xF0200000)。请问 地址 0xF0200010  这里的16Bytes 的 1 对应的什么?

    3.关于读取数据的时候,我先调用I_Fee_WriteAsync(BlockNumber, &SpecialRamBlock[0]); 写入一批数据,然后将SpecialRamBlock 的 下标由0改为8, 再写入一批数据,然后调用TI_Fee_Read(BlockNumber,BlockOffset,Read_Ptr,Length); 读取数据,BlockOffset = 4; Length = 1; 结果读取出来的值是14,理论上应该是12,这是为什么?另外,我第一次写入再读取的时候,数据是正常的读取的是4。 怎样读取不同Block 的数据呢?这里的不同包括Block的编号和Block 所在的位置。

  • 对于上面提到的第三个问题更新一下,读取的数据是正确的,但是,第二次写入数据后,第一个Block 的数据就会变成 Invalid 状态,那怎么读取这一部分的内容呢?