Forum: Mikrocontroller und Digitale Elektronik SPI Problem mit 23K256 SRAM an PIC18F4553


von Kai K. (lekai)


Lesenswert?

Hallo,

ich habe den SRAM IC 23K256 von Microchip über einen 
Pegelwandler(ADG3304) an einen PIC18F4553 angschlossen. Ich habe noch 
weitere SPI Peripherie die ohne Probleme arbeitet.

An dem 23k256 möchte ich erstmal das Status Register auslesen. Da das 
Programm sehr groß ist, habe ich nur einzelne 'Codeschnipsel' angehängt.
1
SPI_CS_SRAM();// Chip select wird gesetzt
2
 WriteSPI(0x01);// Write STATUS Register
3
 WriteSPI(0x81);// STATUS Register Wert
4
 SPI_CS_None();// Chip select wird rückgesetzt
5
6
 test = ReadSRAM(0x05);// Read STATUS Register

ReadSRAM
1
byte ReadSRAM(byte Address) {
2
 SPI_CS_SRAM();
3
 WriteSPI(Address);
4
 WriteSPI(0xFF);
5
 SPI_CS_None();
6
 return SSPBUF;
7
}
Write SPI
1
void WriteSPI(byte Value) {
2
 SSPBUF = Value;
3
 while (!Flags.SPITransmissionDone);
4
 Flags.SPITransmissionDone = 0;
5
}

SCK Takt und die über SDO gesendeten Bytes habe ich mit dem Oszi 
gemessen und sind in Ordnung. Leider Antwortet der 23K256 nicht. Hat 
jemand erfahrung mit diesem IC? Oder einen Tip.

Die restliche SPI Peripherie (Realtimeclock DS1306) funktioniert ohne 
Probleme.

von Ram (Gast)


Lesenswert?

setz mal das CS auf HIGH und dann wieder auf LOW, bevor Du die Daten 
schreibst oder liest. Du mußt das Statusregister auch nur einmal 
schreiben.

Siehe auch hier:

http://www.avrfreaks.net/index.php?module=PNphpBB2&file=viewtopic&t=82360&highlight=

von Kai K. (lekai)


Lesenswert?

Hallo Ram,

habe CS wie von dir beschrieben erst auf HIGH und dann auf LOW gesetzt. 
Bringt leider keine Veränderung.

Ich schreibe das STATUS Register nur einmal. 0x01 ist die Instruction 
dass ich das Register beschrieben will, und 0x81 der Wert den ich in das 
Register schreiben will.
1
 WriteSPI(0x01);// Write STATUS Register Instruction
2
 WriteSPI(0x81);// STATUS Register Wert

von Ram (Gast)


Lesenswert?

Ich hab nie das Satus-Register gelesen, immer nur beschrieben. Probier 
doch mal, ob dein Chip funktioniert/ob Du Daten speichern kannst, wenn 
Du dieses Beispiel nachbaust (das funktioniert bei mir)

Ram_init:
set CS low
write 0142 hex (sequential mode)
set CS high

write:
set CS low
write 02 hex (write command)
write 0000 hex (start address)
write AA hex (1 data byte)
set CS high

read:
set CS low
write 03 hex (read command)
write 0000 hex (start address)
write FF hex and read SPDR (get 1 data byte)
set CS high

von Kai K. (lekai)


Lesenswert?

Hallo Ram,

ich habe es mal so wie von dir beschrieben nachgebaut, leider keine 
Veränderung.
1
 SPI_CS_SRAM();
2
 WriteSPI(0x01);
3
 WriteSPI(0x42);
4
 SPI_CS_None();
5
6
 SPI_CS_SRAM();
7
 WriteSPI(0x02);
8
 WriteSPI(0x00);
9
 WriteSPI(0x00);
10
 WriteSPI(0xAA);
11
 SPI_CS_None();
12
13
 test = ReadSRAM(0x05);
1
byte ReadSRAM(byte Address) {
2
 PORTDbits.RD0 = 1;
3
 SPI_CS_SRAM();
4
 WriteSPI(0x03);
5
 WriteSPI(0x00);
6
 WriteSPI(0x00);
7
 WriteSPI(0xFF);
8
 SPI_CS_None();
9
 return SSPBUF;

ich kann
1
 WriteSPI (0x0000)
nicht senden, da das SPI Register nur 8Bit groß ist.

Wieso sendest du nach der STATUS Register Write Introduction 01 eine 42.
Die 4 verstehe ich, das ist der Sequential mode aber die 2 müsste doch 
entweder eine 0 oder 1 sein. Je nach dem ob Hold enable oder disable.

Im Datenblatt steht: Bits 1 through 5 are reserved and should always be 
set
to ‘0’.

von Ram (Gast)


Lesenswert?

Hmm, dann weiß ich auch nicht.. die Zeile mit dem Readsram kannst Du 
noch kommentieren..

Statt 0000 sendest Du 2x 00, ist ja klar.

Du kannst ja noch die Hardware überprüfen, ob Deine SPI richtig 
funktioniert: trenne doch mal die MISO auf (ist ein Eingang an Deinem 
uC) und lege sie mal statisch auf 0 und später auf 1 - dann solltest Du 
beim SPI lesen immer 00 bzw. FF bekommen....

von Ram (Gast)


Lesenswert?

Ach so, wegen dem Bit 0 und 1 - da stand irgendwo eine 1 im Datenblatt.. 
wahrscheinlich deswegen..

von Kai K. (lekai)


Lesenswert?

Moin,

so hab den Fehler gefunden. Der SPI Mode hat nicht gestimmt. Dieser wird 
im Datenblatt leider auch nicht beschrieben. Habs dann in Application 
Note AN1287 von Microchip gefunden.

http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1824&appnote=en544429

Mastermode 1 CKP = 0, CKE = 1

dann läuft die Sache so wie im Datenblatt beschrieben.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.