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.

[参考译文] CCS/TMS320F28377D:写入多个闪存

Guru**** 2347060 points
Other Parts Discussed in Thread: CONTROLSUITE
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/593078/ccs-tms320f28377d-writing-flash-more-than-one

器件型号:TMS320F28377D
Thread 中讨论的其他器件:controlSUITE

工具/软件:Code Composer Studio

大家好、我正在尝试将 F28377D 的 flashA、flashB、flashC 器件用作 EEPROM (当软件运行时和软件重启时、我需要写入和读取一些非易失性数据)。我使用"\ti\controlSUITE\device_support\f2837xD\V210\F2837xD_examples_Dual\flash_programming\cpu01"作为参考
项目我在该项目上编写代码。 我在下面解释了我的问题步骤。

1 -当数据从串行端口成功发送到闪存 A 时、我正在写入闪存(我将闪存 A 闪存 B 和闪存 C 组合在一起)
2 -我切断电源、然后接通电源、我正在读取写入 flashA 的数据、但没有数据块
3 -当数据从串行端口传输到闪存 A 时、我再次写入闪存
4 -我再次切断电源、然后打开电源、我正在读取写入 flashA 的数据、但在步骤1而非步骤3中写入数据

我正在使用 CCS 6.2.0、当我的软件在硬复位后启动时、它会读取闪存数据、当数据来自串行端口时、它会写入闪存。

我想我只是第一次成功地撰写。 什么可能是问题?

链接器文件是

/*
//######################################################################################################################
//文件:flash_programming_cpu1_flash.cmd
//标题:所有 F28X7x 器件的链接器命令文件
//######################################################################################################################
//$TI 版本:F2837xD 支持库 V210 $
//$Release Date:Tue Nov1 14:46:15 CDT 2016 $
//版权所有:版权所有(C) 2013-2016 Texas Instruments Incorporated -
// http://www.ti.com/ 保留所有权利$
//######################################################################################################################
*

/*===================================================================
//适用于 Code Composer Studio V2.2和更高版本
//--------------------------------------------------------
//除了该内存链接器命令文件外,
//将头文件链接器命令文件直接添加到工程中。
//链接时需要标头链接器命令文件
//将外设结构设置到内部的适当位置
//存储器映射。
//在中找到了头文件链接器文件 \F2837xD_headers\cmd
//对于 BIOS 应用程序添加:F28X7x_Headers_BIOS.cmd
//对于非 BIOS 应用程序添加:F28X7x_Headers_nonBIOS.cmd
=================================================================================================== *

/*定义 F28X7x 的存储器块开始/长度
PAGE 0将用于组织程序段
第1页将用于组织数据段

注:
F28M3Xx 上的存储器块是一致的(也是相同的
物理存储器)。
不应该是相同的存储器区域
同时为 PAGE 0和 PAGE 1定义。
这样做将导致程序损坏
和/或数据。

可以是连续的 SARAM 存储器块或闪存扇区
组合在一起以创建更大的存储器块。
*

存储器

第0页:/*程序内存*/
/*内存(RAM/FLASH)块可移动到 Page1进行数据分配*/
/* begin 用于"引导至闪存"引导加载程序模式*/

开始:origin = 0x080000,length = 0x000002
RAMM0:origin = 0x000122、length = 0x0002DE
RAMD0:origin = 0x00B000、length = 0x000800
RAMLS03:origin = 0x008000、length = 0x002000
/* RAMLS1:origin = 0x008800,length = 0x000800
RAMLS2:origin = 0x009000,length = 0x000800
RAMLS3:origin = 0x009800、length = 0x000800 *
RAMLS4:origin = 0x00A000,length = 0x000800
RAMGS14:origin = 0x01A000,length = 0x001000
RAMGS15:origin = 0x01B000,length = 0x001000
复位:origin = 0x3FFFC0,length = 0x000002

/*闪存扇区*/
// FLASHA:origin = 0x080002,length = 0x001FFE //片上闪存*/
// FLASHB:origin = 0x082000,length = 0x002000 //片上闪存*/
FLASHD:origin = 0x086000、length = 0x002000 //片上闪存*/
FLASHE:origin = 0x088000、length = 0x008000 //片上闪存*/
FLASHF:origin = 0x090000,length = 0x008000 //片上闪存*
FLASHG:origin = 0x098000、length = 0x008000 //片上闪存*/
FLASHH:origin = 0x0A0000,length = 0x008000 //片上闪存*/
FLASHI:origin = 0x0A8000、length = 0x008000 //片上闪存*/
FLASHJ:origin = 0x0B0000,length = 0x008000 //片上闪存*/
FLASHK:origin = 0x0B8000、length = 0x002000 //片上闪存*/
FLASHL:origin = 0x0BA000、length = 0x002000 //片上闪存*/
FLASHM:origin = 0x0BC000、length = 0x002000 //片上闪存*/
FLASHN:origin = 0x0BE000、length = 0x002000 //片上闪存*/

第1页:/*数据存储器*/
/*内存(RAM/FLASH)块可移动到 PAGE0进行程序分配*/

BOOT_RSVD:origin = 0x000002,length = 0x000120 // M0的一部分,引导 ROM 将此用于栈*/
RAMM1:origin = 0x000400、length = 0x000400 //片上 RAM 块 M1 *
RAMD1:origin = 0x00B800,length = 0x000800

RAMLS5:origin = 0x00A800,length = 0x000800

RAMGS0:origin = 0x00C000、length = 0x001000
RAMGS1:origin = 0x00D000、length = 0x001000
RAMGS2:origin = 0x00E000、length = 0x001000
RAMGS3:origin = 0x00F000、length = 0x001000
RAMGS4:origin = 0x010000,length = 0x001000
RAMGS5:origin = 0x011000,length = 0x001000
RAMGS6:origin = 0x012000,length = 0x001000
RAMGS7:origin = 0x013000,length = 0x001000
RAMGS8:origin = 0x014000,length = 0x001000
RAMGS9:origin = 0x015000,length = 0x001000
RAMGS10:origin = 0x016000,length = 0x001000
RAMGS11:origin = 0x017000,length = 0x001000
RAMGS12:origin = 0x018000,length = 0x001000
RAMGS13:origin = 0x019000,length = 0x001000
FLASHA:origin = 0x080002,length = 0x005FFE // flashA,B,C 组合

CPU2TOCPU1RAM:origin = 0x03F800,length = 0x000400
CPU1TOCPU2RAM:origin = 0x03FC00,length = 0x000400


部分

/*分配计划领域:*/
.cinit:> FLASHD PAGE = 0
.pinit:> FLASHD,page = 0
.text:>> FLASHD | FLASHE PAGE = 0
codestart:> begin page = 0

#ifdef __TI_Compiler_version__
#if __TI_Compiler_version__>=15009000


.TI.ramfunc
{-l F021_API_F2837xD_FPU32.lib}

}负载= FLASHD,
运行= RAMLS03、
load_start (_RamfuncsLoadStart)、
load_size (_RamfuncsLoadSize)、
load_end (_RamfuncsLoadEnd)、
run_start (_RamfuncsRunStart)、
run_size (_RamfuncsRunSize)、
run_end (_RamfuncsRunEnd)、
PAGE = 0
其他


ramfuncs
{-l F021_API_F2837xD_FPU32.lib}

}负载= FLASHD,
运行= RAMLS03、
load_start (_RamfuncsLoadStart)、
load_size (_RamfuncsLoadSize)、
load_end (_RamfuncsLoadEnd)、
run_start (_RamfuncsRunStart)、
run_size (_RamfuncsRunSize)、
run_end (_RamfuncsRunEnd)、
PAGE = 0
#endif
#endif

/*分配未初始化的数据段:*/
.stack:>RAMM1 page = 1.
.ebss:>> RAMLS5 | RAMGS0 | RAMGS1 PAGE = 1.
.esysmem:> RAMLS5 PAGE = 1.

/*初始化段进入闪存*/
econst:>> FLASHF | FLASHG PAGE = 0
.switch:> FLASHD PAGE = 0

.reset:> reset,page = 0,type = DSECT //未使用,*/

filter_RegsFile:> RAMGS0,PAGE = 1

SHARERAMGS0:> RAMGS0,PAGE = 1
SHARERAMGS1:>RAMGS1,PAGE = 1.

/*闪存编程缓冲器*/
BufferDataSection:>RAMD1,PAGE = 1,ALIG(4)

/*使用 IPC API 驱动程序时需要以下部分定义*/
组:> CPU1TOCPU2RAM,PAGE = 1

PUTBUFFER
PUTWRITEIDX
GETREADIDX

组:> CPU2TOCPU1RAM,PAGE = 1

GETBUFFER:TYPE = DSECT
GETWRITEIDX:TYPE = DSECT
PUTREADIDX:TYPE = DSECT

/*
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
//文件结束。
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
*


我的代码闪存例程

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void CallFlashAPI (uint32 flash_adress)

uint32 u32Index = 0;
uint16 i = 0;

Fapi_StatusType oReturnCheck;
易失性 Fapi_FlashStatusType oFlashStatus;
Fapi_FlashStatusWordType oFlashStatusWord;

EALLOW;

Flash0EccRegs.ecc_enable.bit.enable = 0x0;

oReturnCheck = Fapi_initializeAPI (F021_CPU0_BASE_ADDRESS、200);

if (oReturnCheck!= Fapi_Status_Success)

Flash_error (oReturnCheck);

oReturnCheck = Fapi_setActiveFlashBank (Fapi_FlashBank0);
if (oReturnCheck!= Fapi_Status_Success)

Flash_error (oReturnCheck);


if (flash_write_command=1)//用于写操作

for (i=0、u32Index = flash_adress;
(u32Index <(flash_adress + 48))&&
(oReturnCheck = Fapi_Status_Success);i+= 8、u32Index+= 8)

oReturnCheck = fapi_issueProgrammingCommand (((uint32 *) u32Index、RBuffer+I、8、0、0、Fapi_DataOnly);

while (fapi_checkFsmForReady ()=fapi_Status_FsmBusy);

if (oReturnCheck!= Fapi_Status_Success)

Flash_error (oReturnCheck);

oFlashStatus = fapi_getFsmStatus();

oReturnCheck = fapi_doVerify (((uint32 *) u32Index、
4、RBuffer32+(I/2)、
oFlashStatusWord (&O);

if (oReturnCheck!= Fapi_Status_Success)

Flash_error (oReturnCheck);



否则、如果(flash_write_command=0)//进行读取操作

for (i=0、u32Index = flash_adress;
(u32Index <(flash_adress + 48))&&
(oReturnCheck = Fapi_Status_Success);i+= 8、u32Index+= 8)

Fapi_doMarginiad (((uint32 *) u32Index、(uint32 *)(RBuffer+I)、8、Fapi_normalRead);
//DELAY_US (10);

Read_Buffer_With Integer 值();

Flash0EccRegs.ecc_enable.bit.enable = 0xA;
EDIS;

ReleaseFlashPump();

flash_done ();

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    1) 1)如何确认未在步骤3中对数据进行编程? 在步骤3中编程时验证是否通过?

    2) 2)在应用程序中使用 Fapi_doMarginiad()的原因是什么? 您通过使用此功能实现了哪些目标?

    谢谢、此致、
    Vamsi
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好  

    1) 1) 我正在将数据写入来自串行端口的闪存、与步骤1相同、在此之后我切断电源、然后接通电源。 当系统 自动重新启动时

    读取我之前写入数据的闪存部件。 由于 我对步骤1和步骤2应用了相同的过程、结果成功、我认为在写入时存在问题

    第3步、因为第4步、我在第1步写入数据时读取数据、而不是在第3步。

    2) 2)我使用的是 fapi_doMarginiad(),因为我想读取我以前写过的闪存数据,它在步骤2中工作时没有问题。  

    我在步骤1写入数据相同的闪存位置、步骤3存在限制、或者必须反复写入数据相同的闪存地址。(我正在写入数据并从地址0x080050开始读取数据、其长度为0x30)

      

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、在写入数据擦除所有扇区之前、似乎解决了我的问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    根据您的回复、您好像在对相同的闪存位置进行多次编程(每次重启一次)而不擦除。  正如您现在所了解的、您需要先擦除闪存、然后才能重新编程不同的数据。  但是、您不需要每次擦除整个闪存、而是擦除您尝试对数据进行编程的扇区。

    谢谢、此致、

    Vamsi