עבור לתוכן

עזרה עם צ'יפ 93LC66

Featured Replies

פורסם

שלום

אני מנסה לגרום לארדואינו לעבוד עם צ'יפ זכרון 93LC66. זהו צ'יפ זכרון של 4K, די ישן ובמקרה יש לי אותו. למי שמעוניין, זה ה datasheet שלו:

http://ww1.microchip.com/downloads/en/devicedoc/21712b.pdf

חיפשתי ברשת ובאופן לא מפתיע, עוד לא ניסו לבצע את החיבור הנ"ל לארדואינו, אך ישנן דוגמאות לשימוש בבקרים אחרים:

1. http://www.jimfranklin.info/microchipdatasheets/00560.pdf

2. http://www.eetasia.com/ARTICLES/2002MAR/2002MAR01_MEM_PL_AN.PDF?SOURCES=DOWNLOAD

הקוד שלי טכנית זהה לקוד שלהם.

עברתי על ה datasheet והוא ברור למדי. הבעיה מתחילה כאשר אני מנסה לקרוא מידע מהצ'יפ. כל החיבורים שלי נכונים, ואין לי בעיה בהגדרת הפרוטוקול (זה בעצם SPI, רק שאני לא משתמש בספריה של הארדואינו).

את הרגל של D0 בצ'יפ חיברתי לפין 4 בארדואינו, הגדרתי אותו כ input, ומימשתי את הפקודה של READ (לפי התזמונים ב datasheet) אבל המידע מגיע בעייתי:

  • אם אני לא מחבר נגד pulldown לפין 4, המידע תמיד מגיע כ HIGH.
  • אם אני מחבר נגד קטן (100 אוהם למיטב זכרוני), המידע לא מגיע עקבי (קריאה מאותה כתובת בזכרון לא מחזירה אותו מידע).
  • אם אני מחבר נגד גדול יותר, המידע עדיין לא עקבי.

ניסיתי לעבוד גם עם תזמוני CLK של 2ms (הצ'יפ מאפשר לעבוד עם תזמונים של עשרות nano sec), ללא הועיל.

אשמח מאוד אם מישהו יוכל לעזור לי.

נ.ב. צירפתי קוד דוגמת מימוש פרימיטיבי של פקודת READ

 
#define RR 1


byte CS = 12; // chip select
byte CLK = 11; // clock
byte D1 = 5; // data input to chip
byte D0 = 4; // data output from chip


void setup() {
Serial.begin(9600);
// setup pins
pinMode(CS, OUTPUT);
pinMode(CLK, OUTPUT);
pinMode(D0, INPUT);
pinMode(D1, OUTPUT);

digitalWrite(CS, LOW);
digitalWrite(CLK, LOW);
digitalWrite(D1, LOW);

delay(3000); // used for initial delay to open the serial terminal
}
int is, js;
byte bs;
int addy = -1;

void loop() {
addy++;
// READ - opcode is B10
digitalWrite(CS, HIGH); // enable chip
clock();
digitalWrite(D1, HIGH); // write SB
clock();
digitalWrite(D1, HIGH); // read opcode bit 1
clock();
digitalWrite(D1, LOW); // read opcode bit 2
clock();
// write 9 bits from current 'addy' value
for (is=0;is< 9;is++) {
digitalWrite(D1, addy >> is & B1? HIGH: LOW );
clock();
}
bs = 0; // set input to zero
for (is=0;is< 8;is++) { // read 8 bits from D1
digitalWrite(CLK, HIGH);
delay(RR);
if (digitalRead(D0) == HIGH) bs |= B1;
digitalWrite(CLK, LOW);
delay(RR);
if (is < 7) bs = bs << 1; // left shift 7 times
}

digitalWrite(CS, LOW); // disable chip
clock();
Serial.print(bs);
Serial.print(",");
if (addy == 20) {
Serial.print("EOL");
Serial.println();
addy = -1;
delay(3000);
}
else {
if (addy % 10 == 0 && addy > 0) {
Serial.println();
}
}
}
void clock() {
digitalWrite(CLK, HIGH);
delay(RR);
digitalWrite(CLK, LOW);
delay(RR);
}

פורסם

למה נגד pulldown לפין 4 ?

במעבר חפיף בדפי הנתונים אני רואה שברגע שקוראים בייט או מילה מגיע קודם 0 קבוע לפני הנתונים.

לפי הקוד שלך אני רואה שאתה קורא 8 סיביות, אתה אמור לקרוא 9 סיביות כאשר הסיבית הראשונה תמיד תהיה 0.

ופין ORG מחובר לאדמה נכון ?

פורסם
  • מחבר

חיברתי נגד כיוון שאני תמיד מקבל קלט של HIGH, פין 4 כנראה צף גבוה כל הזמן בלי הנגד.

האפס שנשלח בקו הקלט נשלח במחזור השעון של הביט האחרון של הכתובת, אין לו משמעות והוא לא מגיע לקלט שלי.

תסתכל על FIGURE 2-1: READ TIMING בדף 7, זה מוסבר שם, ופין org מחובר לאדמה (הצ'יפ מקונפג ל 8 ביט, לא 16).

נ.ב.

באופן כללי אני מנסה לכתוב ספריה שלמה שתדבר עם הצ'יפ (ותממש בצורה נכונה את כל ה opcodes), אבל תקוע עם הבעיה הנוכחית.

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים