mikrocontroller.net

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


Autor: Kai Kiste (lekai)
Datum:

Bewertung
0 lesenswert
nicht 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.
SPI_CS_SRAM();// Chip select wird gesetzt
 WriteSPI(0x01);// Write STATUS Register
 WriteSPI(0x81);// STATUS Register Wert
 SPI_CS_None();// Chip select wird rückgesetzt

 test = ReadSRAM(0x05);// Read STATUS Register

ReadSRAM
byte ReadSRAM(byte Address) {
 SPI_CS_SRAM();
 WriteSPI(Address);
 WriteSPI(0xFF);
 SPI_CS_None();
 return SSPBUF;
}
Write SPI
void WriteSPI(byte Value) {
 SSPBUF = Value;
 while (!Flags.SPITransmissionDone);
 Flags.SPITransmissionDone = 0;
}

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.

Autor: Ram (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Kai Kiste (lekai)
Datum:

Bewertung
0 lesenswert
nicht 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.
 WriteSPI(0x01);// Write STATUS Register Instruction
 WriteSPI(0x81);// STATUS Register Wert

Autor: Ram (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Kai Kiste (lekai)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Ram,

ich habe es mal so wie von dir beschrieben nachgebaut, leider keine 
Veränderung.
 SPI_CS_SRAM();
 WriteSPI(0x01);
 WriteSPI(0x42);
 SPI_CS_None();

 SPI_CS_SRAM();
 WriteSPI(0x02);
 WriteSPI(0x00);
 WriteSPI(0x00);
 WriteSPI(0xAA);
 SPI_CS_None();

 test = ReadSRAM(0x05);
byte ReadSRAM(byte Address) {
 PORTDbits.RD0 = 1;
 SPI_CS_SRAM();
 WriteSPI(0x03);
 WriteSPI(0x00);
 WriteSPI(0x00);
 WriteSPI(0xFF);
 SPI_CS_None();
 return SSPBUF;

ich kann
 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’.

Autor: Ram (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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....

Autor: Ram (Gast)
Datum:

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

Autor: Kai Kiste (lekai)
Datum:

Bewertung
0 lesenswert
nicht 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?IdcServic...

Mastermode 1 CKP = 0, CKE = 1

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.