1

私は非常に大規模なプロジェクトを持っており、これはその一部ですが、それでも不可欠です。私は SST と Microchip 製のパラレル フラッシュ メモリ チップを持っていますが (少し紛らわしいです)、書き込み保護をバイパスするのに問題があります。プログラマーが中国から発送されるのを待つ時間がないため、arduino メガを使用してプログラムしています。フラッシュ メモリのデータシートはこちら: http://ww1.microchip.com/downloads/en/DeviceDoc/25022B.pdf

void setup() {
  Serial.begin(19200);
  pinMode(A8,OUTPUT);//OE#
  pinMode(A9,OUTPUT);//WE#

  for(byte i=0;i<15;i++) //15 bit address bus
    pinMode(i+20, OUTPUT);
  for(byte i=0;i<8;i++)  //8 bit bidirectional data bus
    pinMode(i+40, OUTPUT);
  wrt(0xAA,0x5555);// erase sector 0 to 0xFF
  wrt(0x55,0x2AAA);
  wrt(0x80,0x5555);
  wrt(0xAA,0x5555);
  wrt(0x55,0x2AAA);
  wrt(0x30,0);
  delay(250);
  wrt(0xAA,0x5555);// write byte 0 to 3
  wrt(0x55,0x2AAA);
  wrt(0xA0,0x5555);
  wrt(0x03,0);
  delay(1000);
  Serial.println("reading....");
  for(int i=0;i<16;i++)// read data
    rd(i);
}

void loop();
void wrt(byte var, int loc){
  datbusout();// set data bus to output mode
  digitalWrite(20,HIGH&&(loc&1));
  digitalWrite(21,HIGH&&(loc&2));
  digitalWrite(22,HIGH&&(loc&4));
  digitalWrite(23,HIGH&&(loc&8));
  digitalWrite(24,HIGH&&(loc&16));
  digitalWrite(25,HIGH&&(loc&32));
  digitalWrite(26,HIGH&&(loc&64));
  digitalWrite(27,HIGH&&(loc&128));
  digitalWrite(28,HIGH&&(loc&256));
  digitalWrite(29,HIGH&&(loc&1024));
  digitalWrite(30,HIGH&&(loc&2048));
  digitalWrite(31,HIGH&&(loc&4096));
  digitalWrite(32,HIGH&&(loc&8192));
  digitalWrite(33,HIGH&&(loc&16384));
  digitalWrite(34,HIGH&&(loc&32768));
  for(int i=40;i<48;i++)
    digitalWrite(i,HIGH&&(var&(1<<i)));
  PORTK=1;// write mode
  Serial.println(var,HEX);
  delayMicroseconds(20);
  PORTK=3;// set OE# and WE# high
}
void rd(int loc){
  datbusinp();
  byte out=0;
  digitalWrite(20,HIGH&&(loc&1));
  digitalWrite(21,HIGH&&(loc&2));
  digitalWrite(22,HIGH&&(loc&4));
  digitalWrite(23,HIGH&&(loc&8));
  digitalWrite(24,HIGH&&(loc&16));
  digitalWrite(25,HIGH&&(loc&32));
  digitalWrite(26,HIGH&&(loc&64));
  digitalWrite(27,HIGH&&(loc&128));
  digitalWrite(28,HIGH&&(loc&256));
  digitalWrite(29,HIGH&&(loc&1024));
  digitalWrite(30,HIGH&&(loc&2048));
  digitalWrite(31,HIGH&&(loc&4096));
  digitalWrite(32,HIGH&&(loc&8192));
  digitalWrite(33,HIGH&&(loc&16384));
  digitalWrite(34,HIGH&&(loc&32768));
  PORTK=2;
  delayMicroseconds(1); // wait for read to finish
  for(int i=0;i<8;i++)
    out|=digitalRead(40+i)<<i;
  PORTK=3;
  Serial.println(out,HEX);
}
void datbusinp(){
  DDRG&=252;// did the same thing like this, just faster
  DDRL&=3;
}
void datbusout(){
  DDRG|=3;
  DDRL|=252;// see last comment 
}
4

2 に答える 2

2
for(int i=40;i<48;i++)
    digitalWrite(i,HIGH&&(var&(1<<i)));

それは間違いですよね?

1 を少なくとも 40 回左にシフトしています。つまり、常に 0 を書いているということです。

于 2015-07-27T22:28:20.103 に答える
1

それを私が直した!!!!そのため、アドレスバスに書き込むときに誤って AND の値を間違っていました。Nick Gammon に感謝します。彼がいなければ、今日のテストは失敗していたでしょう。答えの詳細: アドレス バスへの書き込み時に 512 をスキップしないように、wrt 関数の for ループを変更する必要がありました。:Dコード:

  digitalWrite(20,HIGH&&(loc&1));
  digitalWrite(21,HIGH&&(loc&2));
  digitalWrite(22,HIGH&&(loc&4));
  digitalWrite(23,HIGH&&(loc&8));
  digitalWrite(24,HIGH&&(loc&16));
  digitalWrite(25,HIGH&&(loc&32));
  digitalWrite(26,HIGH&&(loc&64));
  digitalWrite(27,HIGH&&(loc&128));
  digitalWrite(28,HIGH&&(loc&256));
  digitalWrite(29,HIGH&&(loc&1024));
  digitalWrite(30,HIGH&&(loc&2048));
  digitalWrite(31,HIGH&&(loc&4096));
  digitalWrite(32,HIGH&&(loc&8192));
  digitalWrite(33,HIGH&&(loc&16384));
  digitalWrite(34,HIGH&&(loc&32768));

なる必要がある

  digitalWrite(20,HIGH&&(loc&1));
  digitalWrite(21,HIGH&&(loc&2));
  digitalWrite(22,HIGH&&(loc&4));
  digitalWrite(23,HIGH&&(loc&8));
  digitalWrite(24,HIGH&&(loc&16));
  digitalWrite(25,HIGH&&(loc&32));
  digitalWrite(26,HIGH&&(loc&64));
  digitalWrite(27,HIGH&&(loc&128));
  digitalWrite(28,HIGH&&(loc&256));
  digitalWrite(29,HIGH&&(loc&512));
  digitalWrite(30,HIGH&&(loc&1024));
  digitalWrite(31,HIGH&&(loc&2048));
  digitalWrite(32,HIGH&&(loc&4096));
  digitalWrite(33,HIGH&&(loc&8192));
  digitalWrite(34,HIGH&&(loc&16384));
于 2015-07-28T22:43:14.140 に答える