www.pudn.com > SJF2443.zip > mem_rdwr.c
#include#include "..\include\pin2443.h" #include "..\include\Jtag.h" #include "..\include\mem_rdwr.h" #include "..\include\sjf2443.h" static int MRW_RdByte(U32 raddr,U8 *pRDataByte); static int MRW_RdHW(U32 raddr,U16 *pRDataHW); static int MRW_RdWord(U32 raddr,U32 *pRDataWord); static int MRW_WrByte(U32 raddr,U8 rdataByte); static int MRW_WrHW(U32 raddr,U16 rdataHW); static int MRW_WrWord(U32 raddr,U32 rdataWord); int bankWidth[8]={16,16,16,16,16,16,16,16}; int bank_nBE[8]={0,0,1,1,1,1,1,1}; void MRW_Menu(void) { int i,j; char command[128]; U32 raddr; U8 rdataByte; U16 rdataHW; U32 rdataWord; int bank; int error; MRW_JtagInit(); printf("\n[memory read/write command line]\n"); printf("h:help x:exit\n"); while(1) { error=0; printf(">"); scanf("%s",command); switch(command[0]) { case 'h': printf("+---------------------- COMMAND LIST ------------------------+\n"); printf("| bs : set bank attribute |\n"); printf("| bw=8,16,32 type:0(nWBE),1(nBE) |\n"); printf("| bp : print bank attributes |\n"); printf("| d : dump 64 bytes |\n"); printf("| rb : read, byte rdata |\n"); printf("| rh : read, half-word rdata |\n"); printf("| rw : read, word rdata |\n"); printf("| wb : write, byte rdata |\n"); printf("| wh : write, half-word rdata |\n"); printf("| ww : write, word rdata |\n"); printf("+-------------------------- NOTE ----------------------------+\n"); printf("| 1. nSCS0,1 SDRAM read/write isn't supported now. |\n"); printf("| 2. example: >bs 2 16 1 |\n"); printf("| >wb 110003e0 a5 |\n"); printf("+------------------------------------------------------------+\n"); break; case 'x': return; case 'b': if(command[1]=='s') { scanf("%d",&bank); scanf("%d %d",&bankWidth[bank],&bank_nBE[bank]); printf("nRCS%d= width=%d write_type=%s\n",bank,bankWidth[bank], (bank_nBE[bank]==0)? "nWBE":"nBE"); } else { for(i=0;i<7;i++) { printf("nRCS%d width=%d %s\n",i,bankWidth[i], (bank_nBE[i]==0)? "nWBE":"nBE"); } } break; case 'd': scanf("%x",&raddr); raddr=raddr&0xfffffff0; bank=S2443_RAddr2Bank(raddr); for(i=0;i<4;i++) { printf("%8x:",raddr); for(j=0;j<16;j++) { error=MRW_RdByte(raddr++,&rdataByte); if(error!=0) printf("?? "); else printf("%02x ",rdataByte); } printf("\n"); } break; case 'r': //read switch(command[1]) { case 'b': //read byte scanf("%x",&raddr); raddr=raddr&0xffffffff; bank=S2443_RAddr2Bank(raddr); error=MRW_RdByte(raddr,&rdataByte); if(error!=0) printf("ERROR:incorrect bank bus width\n"); else printf("rb: %x(%d,%s): %02x\n",raddr,bankWidth[bank], (bank_nBE[bank]==0)? "nWBE":"nBE",rdataByte); break; case 'h': //read half-word scanf("%x",&raddr); raddr=raddr&0xfffffffe; bank=S2443_RAddr2Bank(raddr); error=MRW_RdHW(raddr,&rdataHW); if(error!=0) printf("ERROR:incorrect bank bus width\n"); else printf("rh: %x(%d,%s): %04x\n",raddr,bankWidth[bank], (bank_nBE[bank]==0)? "nWBE":"nBE",rdataHW); break; case 'w': //read word scanf("%x",&raddr); raddr=raddr&0xfffffffc; bank=S2443_RAddr2Bank(raddr); error=MRW_RdWord(raddr,&rdataWord); if(error!=0) printf("ERROR:incorrect bank bus width\n"); else printf("rw: %x(%d,%s): %08x\n",raddr,bankWidth[bank], (bank_nBE[bank]==0)? "nWBE":"nBE",rdataWord); break; default: printf("ERROR:incorrect command.\n"); break; } break; case 'w': //write switch(command[1]) { case 'b': //write byte scanf("%x %x",&raddr,&rdataByte); raddr=raddr&0xffffffff; bank=S2443_RAddr2Bank(raddr); error=MRW_WrByte(raddr,rdataByte); if(error!=0) printf("ERROR:incorrect bank bus width\n"); else printf("wb: %x(%d,%s): %02x\n",raddr,bankWidth[bank], (bank_nBE[bank]==0)? "nWBE":"nBE",rdataByte); break; case 'h': //write half-word scanf("%x %x",&raddr,&rdataHW); raddr=raddr&0xfffffffe; bank=S2443_RAddr2Bank(raddr); error=MRW_WrHW(raddr,rdataHW); if(error!=0) printf("ERROR:incorrect bank bus width\n"); else printf("wh: %x(%d,%s): %04x\n",raddr,bankWidth[bank], (bank_nBE[bank]==0)? "nWBE":"nBE",rdataHW); break; case 'w': //write word scanf("%x %x",&raddr,&rdataWord); raddr=raddr&0xfffffffc; bank=S2443_RAddr2Bank(raddr); error=MRW_WrWord(raddr,rdataWord); if(error!=0) printf("ERROR:incorrect bank bus width\n"); else printf("ww: %x(%d,%s): %08x\n",raddr,bankWidth[bank], (bank_nBE[bank]==0)? "nWBE":"nBE",rdataWord); break; default: printf("ERROR:incorrect command.\n"); break; } break; default: printf("ERROR:incorrect command.\n"); break; } } } static int MRW_RdByte(U32 raddr,U8 *pRDataByte) //raddress should be aligned { U8 rdataByte; int bank; int error=0; bank=S2443_RAddr2Bank(raddr); switch(bankWidth[bank]) { case 8: rdataByte=MRW_Rd8(raddr); break; case 16: if((raddr%2)==0) rdataByte=MRW_Rd16(raddr,bank_nBE[bank],(1<<0))&0xff; else rdataByte=(MRW_Rd16(raddr,bank_nBE[bank],(1<<1))&0xff00)>>8; break; case 32: switch(raddr%4) { case 0: rdataByte=MRW_Rd32(raddr,bank_nBE[bank],(1<<0))&0xff; break; case 1: rdataByte=(MRW_Rd32(raddr,bank_nBE[bank],(1<<1))&0xff00)>>8; break; case 2: rdataByte=(MRW_Rd32(raddr,bank_nBE[bank],(1<<2))&0xff0000)>>16; break; case 3: rdataByte=(MRW_Rd32(raddr,bank_nBE[bank],(1<<3))&0xff000000)>>24; break; default: error=1; break; } break; default: error=1; break; } *pRDataByte=rdataByte; return error; } static int MRW_RdHW(U32 raddr,U16 *pRDataHW) //raddress should be aligned { U16 rdataHW; int bank; int error=0; bank=S2443_RAddr2Bank(raddr); switch(bankWidth[bank]) { case 16: rdataHW=MRW_Rd16(raddr,bank_nBE[bank],(3<<0)); break; case 32: switch(raddr%4) { case 0: rdataHW=MRW_Rd32(raddr,bank_nBE[bank],(3<<0))&0xffff; break; case 2: rdataHW=(MRW_Rd32(raddr,bank_nBE[bank],(3<<2))&0xffff0000)>>16; break; } break; default: error=1; break; } *pRDataHW=rdataHW; return error; } static int MRW_RdWord(U32 raddr,U32 *pRDataWord) //raddress should be aligned { U32 rdataWord; int bank; int error=0; bank=S2443_RAddr2Bank(raddr); switch(bankWidth[bank]) { case 32: rdataWord=MRW_Rd32(raddr,bank_nBE[bank],(0xf<<0)); break; default: error=1; break; } *pRDataWord=rdataWord; return error; } static int MRW_WrByte(U32 raddr,U8 rdataByte) { int bank; int error=0; bank=S2443_RAddr2Bank(raddr); switch(bankWidth[bank]) { case 8: MRW_Wr8(raddr,rdataByte); break; case 16: if((raddr%2)==0) MRW_Wr16(raddr,(U16)(rdataByte|(rdataByte<<8)),bank_nBE[bank],(1<<0)); else MRW_Wr16(raddr,(U16)(rdataByte|(rdataByte<<8)),bank_nBE[bank],(1<<1)); break; case 32: switch(raddr%4) { case 0: MRW_Wr32(raddr,rdataByte|(rdataByte<<8)|(rdataByte<<16)|(rdataByte<<24), bank_nBE[bank],(1<<0)); break; case 1: MRW_Wr32(raddr,rdataByte|(rdataByte<<8)|(rdataByte<<16)|(rdataByte<<24), bank_nBE[bank],(1<<1)); break; case 2: MRW_Wr32(raddr,rdataByte|(rdataByte<<8)|(rdataByte<<16)|(rdataByte<<24), bank_nBE[bank],(1<<2)); break; case 3: MRW_Wr32(raddr,rdataByte|(rdataByte<<8)|(rdataByte<<16)|(rdataByte<<24), bank_nBE[bank],(1<<3)); break; } break; default: error=1; break; } return error; } static int MRW_WrHW(U32 raddr,U16 rdataHW) //raddress should be aligned { int bank; int error=0; bank=S2443_RAddr2Bank(raddr); switch(bankWidth[bank]) { case 16: MRW_Wr16(raddr,rdataHW,bank_nBE[bank],(3<<0)); break; case 32: switch(raddr%4) { case 0: MRW_Wr32(raddr,rdataHW|(rdataHW<<16),bank_nBE[bank],(3<<0)); break; case 2: MRW_Wr32(raddr,rdataHW|(rdataHW<<16),bank_nBE[bank],(3<<2)); break; } default: error=1; break; } return error; } static int MRW_WrWord(U32 raddr,U32 rdataWord) //raddress should be aligned { int bank; int error=0; bank=S2443_RAddr2Bank(raddr); switch(bankWidth[bank]) { case 32: MRW_Wr32(raddr,rdataWord,bank_nBE[bank],(0xf<<0)); break; default: error=1; break; } return error; } //************************************************* //************************************************* //** JTAG dependent primitive functions ** //************************************************* //************************************************* void MRW_JtagInit(void) { JTAG_RunTestldleState(); JTAG_ShiftIRState(EXTEST); //The initial value of pins will be defined here. } int S2443_RAddr2Bank(U32 raddr) { if(raddr<0x8000000) return 0; else if(raddr<0x10000000) return 1; else if(raddr<0x18000000) return 2; else if(raddr<0x20000000) return 3; else if(raddr<0x28000000) return 4; else if(raddr<0x30000000) return 5; else if(raddr<0x38000000) return 6; else if(raddr<0x40000000) return 7; printf("ERROR:raddress range overflow\n"); return 0; } void S2443_Assert_nCS(U32 raddr) { if(raddr<0x8000000) S2443_SetPin(nRCS0 ,LOW); else if(raddr<0x10000000) S2443_SetPin(nRCS1 ,LOW); else if(raddr<0x18000000) S2443_SetPin(nRCS2 ,LOW); else if(raddr<0x20000000) S2443_SetPin(nRCS3 ,LOW); else if(raddr<0x28000000) S2443_SetPin(nRCS4 ,LOW); else if(raddr<0x30000000) S2443_SetPin(nRCS5 ,LOW); else if(raddr<0x38000000) S2443_SetPin(nSCS0 ,LOW); else if(raddr<0x40000000) S2443_SetPin(nSCS1 ,LOW); } void S2443_Deassert_nCS(U32 raddr) { if(raddr<0x8000000) S2443_SetPin(nRCS0 ,HIGH); else if(raddr<0x10000000) S2443_SetPin(nRCS1 ,HIGH); else if(raddr<0x18000000) S2443_SetPin(nRCS2 ,HIGH); else if(raddr<0x20000000) S2443_SetPin(nRCS3 ,HIGH); else if(raddr<0x28000000) S2443_SetPin(nRCS4 ,HIGH); else if(raddr<0x30000000) S2443_SetPin(nRCS5 ,HIGH); else if(raddr<0x38000000) S2443_SetPin(nSCS0 ,HIGH); else if(raddr<0x40000000) S2443_SetPin(nSCS1 ,HIGH); } //*********************************************************** // Fast Version // xxxQ: fast version by removing nRCS_to_nWEnOE setup time. // xxxQQ: more fast version by omitting nRCS deassertion. //*********************************************************** U8 MRW_Rd8Q(U32 raddr) { S2443_ContRDataBus(HIGH); // input S2443_SetRAddr(raddr); S2443_Assert_nCS(raddr); S2443_SetPin(nOE,LOW); JTAG_ShiftDRStateNoTdo(outCellValue); S2443_SetPin(nOE,HIGH); S2443_Deassert_nCS(raddr); JTAG_ShiftDRState(outCellValue,inCellValue); return S2443_GetRDataByte(); } U16 MRW_Rd16Q(U32 raddr,int en_nBE,U32 bs) { S2443_ContRDataBus(HIGH); // input S2443_SetRAddr(raddr); S2443_Assert_nCS(raddr); S2443_SetPin(nOE,LOW); if(en_nBE) { if(bs&(1<<0))S2443_SetPin(nBE0,LOW); if(bs&(1<<1))S2443_SetPin(nBE1,LOW); } JTAG_ShiftDRStateNoTdo(outCellValue); S2443_SetPin(nOE,HIGH); S2443_Deassert_nCS(raddr); if(en_nBE) { S2443_SetPin(nBE0,HIGH); S2443_SetPin(nBE1,HIGH); } JTAG_ShiftDRState(outCellValue,inCellValue); return S2443_GetRDataHW(); } U32 MRW_Rd32Q(U32 raddr,int en_nBE,U32 bs) { S2443_ContRDataBus(HIGH); // input S2443_SetRAddr(raddr); S2443_Assert_nCS(raddr); S2443_SetPin(nOE,LOW); if(en_nBE) { if(bs&(1<<0))S2443_SetPin(nBE0,LOW); if(bs&(1<<1))S2443_SetPin(nBE1,LOW); } JTAG_ShiftDRStateNoTdo(outCellValue); S2443_SetPin(nOE,HIGH); S2443_Deassert_nCS(raddr); if(en_nBE) { S2443_SetPin(nBE0,HIGH); S2443_SetPin(nBE1,HIGH); } JTAG_ShiftDRState(outCellValue,inCellValue); return S2443_GetRDataWord(); } void MRW_Wr8Q(U32 raddr,U8 rdata) { S2443_ContRDataBus(LOW); // output S2443_SetRAddr(raddr); S2443_Assert_nCS(raddr); S2443_SetPin(nWE,LOW); S2443_SetRDataByte(rdata); JTAG_ShiftDRStateNoTdo(outCellValue); S2443_SetPin(nWE,HIGH); JTAG_ShiftDRStateNoTdo(outCellValue); S2443_ContRDataBus(HIGH); // input S2443_Deassert_nCS(raddr); JTAG_ShiftDRStateNoTdo(outCellValue); } void MRW_Wr8QQ(U32 raddr,U8 rdata) { S2443_ContRDataBus(LOW); // output S2443_SetRAddr(raddr); S2443_Assert_nCS(raddr); S2443_SetPin(nWE,LOW); S2443_SetRDataByte(rdata); JTAG_ShiftDRStateNoTdo(outCellValue); S2443_SetPin(nWE,HIGH); JTAG_ShiftDRStateNoTdo(outCellValue); #if 0 S2443_ContRDataBus(HIGH); // input S2443_Deassert_nCS(raddr); JTAG_ShiftDRStateNoTdo(outCellValue); #endif } void MRW_Wr16Q(U32 raddr,U16 rdata,int en_nBE,U32 bs) { S2443_ContRDataBus(LOW); // output S2443_SetRAddr(raddr); S2443_Assert_nCS(raddr); S2443_SetPin(nWE,LOW); if(bs&(1<<0))S2443_SetPin(nBE0,LOW); //used as nWBE/nBE if(bs&(1<<1))S2443_SetPin(nBE1,LOW); S2443_SetRDataHW(rdata); JTAG_ShiftDRStateNoTdo(outCellValue); S2443_SetPin(nWE,HIGH); if(!en_nBE) { S2443_SetPin(nBE0,HIGH); //nWBE is deasserted here. S2443_SetPin(nBE1,HIGH); } JTAG_ShiftDRStateNoTdo(outCellValue); S2443_ContRDataBus(HIGH); // input S2443_Deassert_nCS(raddr); if(en_nBE) { S2443_SetPin(nBE0,HIGH); S2443_SetPin(nBE1,HIGH); } JTAG_ShiftDRStateNoTdo(outCellValue); } void MRW_Wr16QQ(U32 raddr,U16 rdata,int en_nBE,U32 bs) // Very fast version nCS is never inactive for speed-up. { S2443_ContRDataBus(LOW); // output S2443_SetRAddr(raddr); S2443_Assert_nCS(raddr); S2443_SetPin(nWE,LOW); if(bs&(1<<0))S2443_SetPin(nBE0,LOW); //used as nWBE/nBE if(bs&(1<<1))S2443_SetPin(nBE1,LOW); S2443_SetRDataHW(rdata); JTAG_ShiftDRStateNoTdo(outCellValue); S2443_SetPin(nWE,HIGH); if(!en_nBE) { S2443_SetPin(nBE0,HIGH); //nWBE is deasserted here. S2443_SetPin(nBE1,HIGH); } JTAG_ShiftDRStateNoTdo(outCellValue); #if 0 S2443_ContRDataBus(HIGH); // input S2443_Deassert_nCS(raddr); if(en_nBE) { S2443_SetPin(nBE0,HIGH); S2443_SetPin(nBE1,HIGH); } JTAG_ShiftDRStateNoTdo(outCellValue); #endif } void MRW_Wr32Q(U32 raddr,U32 rdata,int en_nBE,U32 bs) { S2443_ContRDataBus(LOW); // output S2443_SetRAddr(raddr); S2443_Assert_nCS(raddr); S2443_SetPin(nWE,LOW); if(bs&(1<<0))S2443_SetPin(nBE0,LOW); //used as nWBE/nBE if(bs&(1<<1))S2443_SetPin(nBE1,LOW); S2443_SetRDataWord(rdata); JTAG_ShiftDRStateNoTdo(outCellValue); S2443_SetPin(nWE,HIGH); if(!en_nBE) { S2443_SetPin(nBE0,HIGH); //nWBE is deasserted here. S2443_SetPin(nBE1,HIGH); } JTAG_ShiftDRStateNoTdo(outCellValue); S2443_ContRDataBus(HIGH); // input S2443_Deassert_nCS(raddr); if(en_nBE) { S2443_SetPin(nBE0,HIGH); //nBE is deasserted here. S2443_SetPin(nBE1,HIGH); } JTAG_ShiftDRStateNoTdo(outCellValue); } void MRW_Wr32QQ(U32 raddr,U32 rdata,int en_nBE,U32 bs) { S2443_ContRDataBus(LOW); // output S2443_SetRAddr(raddr); S2443_Assert_nCS(raddr); S2443_SetPin(nWE,LOW); if(bs&(1<<0))S2443_SetPin(nBE0,LOW); //used as nWBE/nBE if(bs&(1<<1))S2443_SetPin(nBE1,LOW); S2443_SetRDataWord(rdata); JTAG_ShiftDRStateNoTdo(outCellValue); S2443_SetPin(nWE,HIGH); if(!en_nBE) { S2443_SetPin(nBE0,HIGH); //nWBE is deasserted here. S2443_SetPin(nBE1,HIGH); } JTAG_ShiftDRStateNoTdo(outCellValue); #if 0 S2443_ContRDataBus(HIGH); // input S2443_Deassert_nCS(raddr); if(en_nBE) { S2443_SetPin(nBE0,HIGH); //nBE is deasserted here. S2443_SetPin(nBE1,HIGH); } JTAG_ShiftDRStateNoTdo(outCellValue); #endif } U8 MRW_Rd8(U32 raddr) { S2443_ContRDataBus(HIGH); // input S2443_SetRAddr(raddr); S2443_Assert_nCS(raddr); JTAG_ShiftDRStateNoTdo(outCellValue); //tCOS S2443_SetPin(nOE,LOW); JTAG_ShiftDRStateNoTdo(outCellValue); S2443_SetPin(nOE,HIGH); S2443_Deassert_nCS(raddr); JTAG_ShiftDRState(outCellValue,inCellValue); return S2443_GetRDataByte(); } U16 MRW_Rd16(U32 raddr,int en_nBE,U32 bs) { S2443_ContRDataBus(HIGH); // input S2443_SetRAddr(raddr); S2443_Assert_nCS(raddr); if(en_nBE) { if(bs&(1<<0))S2443_SetPin(nBE0,LOW); if(bs&(1<<1))S2443_SetPin(nBE1,LOW); } JTAG_ShiftDRStateNoTdo(outCellValue); //tCOS S2443_SetPin(nOE,LOW); JTAG_ShiftDRStateNoTdo(outCellValue); S2443_SetPin(nOE,HIGH); S2443_Deassert_nCS(raddr); if(en_nBE) { S2443_SetPin(nBE0,HIGH); S2443_SetPin(nBE1,HIGH); } JTAG_ShiftDRState(outCellValue,inCellValue); return S2443_GetRDataHW(); } U32 MRW_Rd32(U32 raddr,int en_nBE,U32 bs) { S2443_ContRDataBus(HIGH); // input S2443_SetRAddr(raddr); S2443_Assert_nCS(raddr); if(en_nBE) { if(bs&(1<<0))S2443_SetPin(nBE0,LOW); if(bs&(1<<1))S2443_SetPin(nBE1,LOW); } JTAG_ShiftDRStateNoTdo(outCellValue); //tCOS S2443_SetPin(nOE,LOW); JTAG_ShiftDRStateNoTdo(outCellValue); S2443_SetPin(nOE,HIGH); S2443_Deassert_nCS(raddr); if(en_nBE) { S2443_SetPin(nBE0,HIGH); S2443_SetPin(nBE1,HIGH); } JTAG_ShiftDRState(outCellValue,inCellValue); return S2443_GetRDataWord(); } void MRW_Wr8(U32 raddr,U8 rdata) { S2443_ContRDataBus(LOW); // output S2443_SetRAddr(raddr); S2443_Assert_nCS(raddr); S2443_SetRDataByte(rdata); JTAG_ShiftDRStateNoTdo(outCellValue); //tCOS S2443_SetPin(nWE,LOW); JTAG_ShiftDRStateNoTdo(outCellValue); S2443_SetPin(nWE,HIGH); JTAG_ShiftDRStateNoTdo(outCellValue); //tCOH S2443_ContRDataBus(HIGH); // input S2443_Deassert_nCS(raddr); JTAG_ShiftDRStateNoTdo(outCellValue); } void MRW_Wr16(U32 raddr,U16 rdata,int en_nBE,U32 bs) { S2443_ContRDataBus(LOW); // output S2443_SetRAddr(raddr); S2443_Assert_nCS(raddr); if(en_nBE) { if(bs&(1<<0))S2443_SetPin(nBE0,LOW); //used as nBE if(bs&(1<<1))S2443_SetPin(nBE1,LOW); } S2443_SetRDataHW(rdata); JTAG_ShiftDRStateNoTdo(outCellValue); //tCOS if(!en_nBE) { if(bs&(1<<0))S2443_SetPin(nBE0,LOW); //used as nWBE if(bs&(1<<1))S2443_SetPin(nBE1,LOW); //used as nWBE } S2443_SetPin(nWE,LOW); JTAG_ShiftDRStateNoTdo(outCellValue); S2443_SetPin(nWE,HIGH); if(!en_nBE) { S2443_SetPin(nBE0,HIGH); //nWBE is deasserted here. S2443_SetPin(nBE1,HIGH); } JTAG_ShiftDRStateNoTdo(outCellValue); //tCOH S2443_ContRDataBus(HIGH); // input S2443_Deassert_nCS(raddr); if(en_nBE) { S2443_SetPin(nBE0,HIGH); S2443_SetPin(nBE1,HIGH); } JTAG_ShiftDRStateNoTdo(outCellValue); } void MRW_Wr32(U32 raddr,U32 rdata,int en_nBE,U32 bs) { S2443_ContRDataBus(LOW); // output S2443_SetRAddr(raddr); S2443_Assert_nCS(raddr); if(en_nBE) { if(bs&(1<<0))S2443_SetPin(nBE0,LOW); //used as nBE if(bs&(1<<1))S2443_SetPin(nBE1,LOW); } S2443_SetRDataWord(rdata); JTAG_ShiftDRStateNoTdo(outCellValue); //tCOS if(!en_nBE) { if(bs&(1<<0))S2443_SetPin(nBE0,LOW); //used as nWBE if(bs&(1<<1))S2443_SetPin(nBE1,LOW); } S2443_SetPin(nWE,LOW); JTAG_ShiftDRStateNoTdo(outCellValue); S2443_SetPin(nWE,HIGH); if(!en_nBE) { S2443_SetPin(nBE0,HIGH); //nWBE is deasserted here. S2443_SetPin(nBE1,HIGH); } JTAG_ShiftDRStateNoTdo(outCellValue); //tCOH S2443_ContRDataBus(HIGH); // input S2443_Deassert_nCS(raddr); if(en_nBE) { S2443_SetPin(nBE0,HIGH); //nBE is deasserted here. S2443_SetPin(nBE1,HIGH); } JTAG_ShiftDRStateNoTdo(outCellValue); }