S29GL01GS12TFIV10でWrite Buffer Programmingがabortします

Tip / ログイン to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
J_T
Level 1
Level 1
5 sign-ins First solution authored First reply posted

S29GL01GS12TFIV10に対してWrite Buffer Programmingを行いたいのですが、正常に書込みが行えない現象が発生しております。
プログラム(関数)は下記URL①のデータシートP23, Figure 5.のフローチャートとURL②の資料P7を参考に実装しております。

URL① https://www.cypress.com/documentation/datasheets/s29gl01gs-s29gl512s-s29gl256s-s29gl128s-military-1-...
URL② https://www.cypress.com/file/497531/download

関数の引数はプログラム上部にてかっこ内に記載している値に固定して動作確認しております。
コメントアウト部(#else以降)の動作を用いて書き込みが行えることは確認しているため、引数は正しいと考えております。

以下、プログラム実行時の現象と質問です。

■現象
現象① フローチャートの”Read Status Register”でStatus Registerの値が152になり、3bit目が1のため”Program aborted Write to Buffer command”のステートになりました。
現象② Read Status Register後にデバッガにてFlash内部の値をダンプすると、全体が同じ値になっています。

■質問
質問1:SectorAddressに0x700,0000を指定し、そこから256Byte(128Word)書き込んでいて現象①になる原因はどういったことが考えられますでしょうか。
質問2:現象②はフローチャート上部のWrite to Buffer ABORTED.になっている影響でしょうか。
質問3:添付したプログラムにおいて、手順に誤りなどありますでしょうか。

以下、プログラムです。

#define DQ1 (1 << 1)
#define DQ5 (1 << 5)
#define DQ7 (1 << 7)

/**********************************************************************************************
* Write Buffer Programming
* - TargetDevice :(0)
* - Offset : 書き換えオフセットアドレス (0x7000000)
* - pBuffer : 書き込むデータが格納されたバッファへのポインタ(インクリメントデータ 256Byte分)
* - Length : 書き込みバイト数(256)
***********************************************************************************************/
int WriteBufferProgram(int TargetDevice, int Offset, void *pBuffer, int Length){
volatile unsigned short *pFlashBase;
unsigned int data,sectorAddress,SR;
int flashLength,cnt;

unsigned short *src=(unsigned short*)pBuffer;
volatile unsigned short *dst= (unsigned short*) Offset;

int wc=(Length/2)-1;

pFlashBase = (unsigned short *)TargetDevice;


#if 1 //Buffer Programming

sectorAddress =Offset&0xFFF0000;

*((volatile unsigned short *)pFlashBase+0x555)=0x00AA; //555 = AA
*((volatile unsigned short *)pFlashBase+0x2AA)=0x0055; //2AA = 55

*(pFlashBase + (volatile unsigned short)sectorAddress) = 0x25; //SA = 25
*(pFlashBase + (volatile unsigned short)sectorAddress) = wc; //SA = wc


while(wc>=0){
*dst=*src;
dst++;
src++;
wc--;
}
*(pFlashBase + ( volatile unsigned short)sectorAddress) = 0x29; //SA = 29

while(1){

//read status register
*(pFlashBase + 0x555)= 0x70; //555= 70
SR=*dst; //RD = xxx


if(SR&0x80==0){ //SR[7] == 0
continue;
}

if(SR&0x10==0){ //SR[4]== 0
return 0;//success
}
//ProgramFail
if(SR&0x08){ //SR[3] == 1
return -1; //Program aborted during Write to Buffer command
}else if(SR&0x02){ //SR[1] == 0
return -2;//Program Fail
}else{
return -3;//Sector Locked Error
}

}

 

#else //Byte Programming
for(; Length != 0; Length -= 2){
*(pFlashBase + 0x555) = 0xAA;
*(pFlashBase + 0x2AA) = 0x55;
*(pFlashBase + 0x555) = 0xA0;

*dst=*src;

 

while(1){
data = *dst;
if((data & DQ7) == (*src & DQ7)){
break;
}
if((data & DQ1) != 0 || (data & DQ5) != 0){
data = *dst;
if((data & DQ7) != (*src & DQ7))
return DEVICE_BUSY;
}
}
dst++;
src++;
}
#endif


}


お手数ですが、回答の程よろしくお願い致します。

0 件の賞賛
1 解決策
J_T
Level 1
Level 1
5 sign-ins First solution authored First reply posted

上記現象について、自己解決いたしました。

 

コードを一から書き直した結果、セクタアドレスが計算時に意図しない型に変換されていたようです。

お騒がせしました。

 

今後も何かありましたら、よろしくお願いいたします。

元の投稿で解決策を見る

0 件の賞賛
3 返答(返信)
RyanZhao
Moderator
Moderator
Moderator
250 sign-ins First question asked 750 replies posted

この現象と質問について、確認を進めており、
申し訳ございませんが、もうしばらくお時間ください。

0 件の賞賛
J_T
Level 1
Level 1
5 sign-ins First solution authored First reply posted

お世話になっております。

 

上記現象の調査について、進捗いかがでしょうか。

現象解決が製品開発に必須なため、確認に必要な情報等ありましたら、なんなりと申しつけください。

 

以上、よろしくお願い致します。

0 件の賞賛
J_T
Level 1
Level 1
5 sign-ins First solution authored First reply posted

上記現象について、自己解決いたしました。

 

コードを一から書き直した結果、セクタアドレスが計算時に意図しない型に変換されていたようです。

お騒がせしました。

 

今後も何かありましたら、よろしくお願いいたします。

0 件の賞賛