TI中文支持网
TI专业的中文技术问题搜集分享网站

28377s OTP flash中的bootctrl配置问题

28377s在仿真时,通过On-Chip Flash,将Z1-BOOTCTRL改为0xFFFFFFFE,点击Program OTPBOOTCTRL,写入成功。想要再次修改Z1-BOOTCTRL为0xFFFFFF5A时却发现不能成功。

已知OTP flash中每一位从1写为0只能写一次,我将Z1-BOOTCTRL中的最后一位写0,改为0xFFFFFFFE后,想要再将其他位由1写为0却无法成功,请问这是什么原因?

Green Deng:OTP只能被编程一次,并且不能被擦除。如果要二次编写的话需要用到flash API函数,并且如你所说,它的每个位只能由“1”改为“0”不可逆。

28377s在仿真时,通过On-Chip Flash,将Z1-BOOTCTRL改为0xFFFFFFFE,点击Program OTPBOOTCTRL,写入成功。想要再次修改Z1-BOOTCTRL为0xFFFFFF5A时却发现不能成功。

已知OTP flash中每一位从1写为0只能写一次,我将Z1-BOOTCTRL中的最后一位写0,改为0xFFFFFFFE后,想要再将其他位由1写为0却无法成功,请问这是什么原因?

user5188513:

回复 Green Deng:

你好,按照你说的用flash API函数。我用ti中的例程在Z1-BOOTCTRL寄存器(0x7801E)写入0xFFFFFF5A,仍然是不能成功。

以下是程序:

Flash_Addr = 0x0007801E,sbuf = 0xFFFFFF5A,length = 2.

void Flash_program(USIGN32 Flash_Addr,USIGN16 *sbuf,USIGN16 length)

{

USIGN32 *Buffer32 = (USIGN32 *)sbuf;

USIGN32 u32Index = 0;

Fapi_StatusType oReturnCheck;

volatile Fapi_FlashStatusType oFlashStatus;

Fapi_FlashStatusWordType oFlashStatusWord;

if(Flash_Addr < 0xC0000){

PUMPREQUEST = 0x5A5A0002;// Give pump ownership to FMC0

// This function is required to initialize the Flash API based on System

// frequency before any other Flash API operation can be performed

// Note that the FMC0 register base address is passed as the parameter

oReturnCheck = Fapi_initializeAPI(F021_CPU0_W0_BASE_ADDRESS, 150);

if(oReturnCheck != Fapi_Status_Success)

{

SciaRegs.SCITXBUF.bit.TXDT = 0xA0;//失败时发送0xA0

while(SciaRegs.SCICTL2.bit.TXEMPTY == 0){}

for(;;);

}

// Fapi_setActiveFlashBank function sets the Flash bank0 and FMC0 for

// further Flash operations to be performed on the bank0.

// Note that the parameter passed is Fapi_FlashBank0 since FMC0 register

// base address is passed to Fapi_initializeAPI()

oReturnCheck = Fapi_setActiveFlashBank(Fapi_FlashBank0);

if(oReturnCheck != Fapi_Status_Success)

{

SciaRegs.SCITXBUF.bit.TXDT = 0xA0;//失败时发送0xA0

while(SciaRegs.SCICTL2.bit.TXEMPTY == 0){}

for(;;);

}

// Disable ECC so that error is not generated when reading Flash contents

// without ECC

Flash0EccRegs.ECC_ENABLE.bit.ENABLE = 0x0;

u32Index = Flash_Addr;

oReturnCheck = Fapi_issueProgrammingCommand((uint32 *)u32Index,sbuf,

length,0,0,

Fapi_DataOnly);

while(Fapi_checkFsmForReady() == Fapi_Status_FsmBusy);

if(oReturnCheck != Fapi_Status_Success)

{

SciaRegs.SCITXBUF.bit.TXDT = 0xA0;//失败时发送0xA0

while(SciaRegs.SCICTL2.bit.TXEMPTY == 0){}

for(;;);

}

// Read FMSTAT register contents to know the status of FSM

// after program command for any debug

oFlashStatus = Fapi_getFsmStatus();

// Verify the values programmed. The Program step itself does a verify

// as it goes. This verify is a 2nd verification that can be done.

oReturnCheck = Fapi_doVerify((uint32 *)u32Index,length/2,Buffer32,

&oFlashStatusWord);

if(oReturnCheck != Fapi_Status_Success)

{

SciaRegs.SCITXBUF.bit.TXDT = 0xA0;//失败时发送0xA0

while(SciaRegs.SCICTL2.bit.TXEMPTY == 0){}

for(;;);

}

}

}

程序执行Fapi_issueProgrammingCommand时,返回Fapi_Status_Success,但其实目标位置并没有写入正确的0xFFFFFF5A,仍为0xFFFFFFFE.

在执行Fapi_doVerify时,返回Fapi_Error_Fail.

不知道你说的flash API函数是不是我调用的这个函数。麻烦再解答一下,感谢!

赞(0)
未经允许不得转载:TI中文支持网 » 28377s OTP flash中的bootctrl配置问题
分享到: 更多 (0)