SPI Problem mit 23K256 SRAM an PIC18F4553

OP #1549840
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.
OP #1549919
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
Gast #1550055
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
OP #1550093
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’.
Gast #1550133
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....

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren