Forum: Mikrocontroller und Digitale Elektronik 25AA02E48 Reg. MAC auslesen


von Ingo S. (schicki)


Lesenswert?

Hallo Zusammen,

ich habe eine kleine Routne für einen 25AA02E48 Chip geschrieben. diese 
arbeitet aber nicht korrekt. Takt und Daten liegen an, allerdings 
bekomme ich keine Daten zurück.
1
/************************************************************************/
2
// 25AA02E48-Befehle
3
/************************************************************************/
4
#define READ    0x03    // Read data from memory array beginning at selected address 
5
#define WRITE   0x02    // Write data to memory array beginning at selected address   
6
#define WRDI    0x04    // Reset the write enable latch (disable write operations)
7
#define WREN    0x06    // Set the write enable latch (enable write operations)
8
#define RDSR    0x05    // Read STATUS register
9
#define WRSR    0x01    // Write STATUS register
10
/************************************************************************/
11
12
/************************************************************************/
13
unsigned char Read_Byte_25AA025E48(unsigned char unc_Register)
14
{
15
    unsigned char unc_Daten = 0;
16
    
17
    SPI1_Open(SPI1_DEFAULT);
18
   
19
    CS_1 = 0;
20
    __delay_ms(1);
21
    
22
    if(SSPSTATbits.BF)
23
    {
24
        SPI1_ExchangeByte(READ);
25
        SPI1_ExchangeByte(unc_Register);
26
        unc_Daten = SPI1_ExchangeByte(0x00);
27
    }
28
29
    __delay_ms(1);
30
    CS_1 = 1;
31
    
32
    SPI1_Close();
33
    
34
            
35
    return unc_Daten; 
36
}  
37
/************************************************************************/
38
39
    chr_MAC[0] = Read_Byte_25AA025E48(0xFA);
40
    chr_MAC[1] = Read_Byte_25AA025E48(0xFB);
41
    chr_MAC[2] = Read_Byte_25AA025E48(0xFC);
42
    chr_MAC[3] = Read_Byte_25AA025E48(0xFD);
43
    chr_MAC[4] = Read_Byte_25AA025E48(0xFE);
44
    chr_MAC[5] = Read_Byte_25AA025E48(0xFF);
45
    
46
    sprintf(chr_Temp, "MAC-Adresse:    %02X:%02X:%02X:%02X:%02X:%02X\n\r", chr_MAC[0], chr_MAC[1], chr_MAC[2], chr_MAC[3], chr_MAC[4], chr_MAC[5]);
47
    USART_Write_String(chr_Temp);

Ich bekomme nur 00:00.. zurück. Mit SPI arbeite ich zum ersten mal.Laut 
DB schreibt am ja 0x03 und das zu lesende Reg. Danach sollen die Daten 
kommen. Woran kann das liegen?

Die Leitungen CLK -> CLK. SDO -> SDI, SDI -> SDO. hold und WP sind über 
einen 100K an VCC angeschlossen.

VG
Ingo

von fop (Gast)


Lesenswert?

SPI1_DEFAULT : aha...

Bedienst Du das Signal /CS ? Kommet es am Baustein an ?
Stimmen Ruhepegel und Flanken des CLK Signals ? (wobei vermutlich nicht 
nur Nullen, sondern falsche Daten kommen würden, wenn Du hier patzt)
Liegt /HOLD auf High ?
Hat der Speicherbaustein seine Spannungsversorgung ?
Ist der SCLK lahm genug, dass der Baustein mitkommt ?
Ist das Timing /CS zu SCLK langsam genug für den Baustein ?

von c-hater (Gast)


Lesenswert?

Ingo S. schrieb:

>     SPI1_Open(SPI1_DEFAULT);

Aha...

Takt? Mode? Bitorder?

von Ingo S. (schicki)


Angehängte Dateien:

Lesenswert?

Hallo das mit dem Speed könnte sein. Laut Code Configurator sollten es 
6,25 Mhz sein. Das kommt auch als Takt am Oszi an. Mode 0 ist laut MCC 
konfiguriert. Die Daten kommen am Ende. Das Projekt und Schaltplan ist 
im Anhang.

Hold ist auf High, Spannungsversorgung stimmt. Verdrahtung Clk usw 
stimmt es kann eigentlich nur was an der Config sein..

von Ingo S. (schicki)


Angehängte Dateien:

Lesenswert?

Hallo,

Zwischenzeitlich habe ich die SPI-Libary neugeschrieben. Die HArdware 
unzählige male geprüft. Da sollte eigentlich kein Fehler sein. Den 
Conroller bzw. den Speicher habe ich auch einmal gewechselt. Keine 
Änderung.

Der 25AA02E48 arbeitet laut DB mit Mode 00 bzw. 11. Die Daten würde ich 
gerne am Ende samplen. Sobald ich Daten verschicke, antwortet der der 
Speicher nicht.

Folglich muss an der Initalisierung bzw. an der Abfrage etwas nicht 
stimmen. Kenn jemand dieses Problem.

Die Quelldaten sind inkl. Plän sind im Anhang. Ich komme da nicht 
weiter.. In der Hoffnung das jemand helfen kann.

VG
Ingo

von Frank K. (fchk)


Lesenswert?

Ingo S. schrieb:

> Die Quelldaten sind inkl. Plän sind im Anhang. Ich komme da nicht
> weiter.. In der Hoffnung das jemand helfen kann.

Hast Du einen Logic Analyzer? So ein 10€-Teil von Amazon oder so reicht. 
Hänge Dich da mal an die SPI-Pins (CS, SCK, MISO, MOSI) und schaue, was 
da tatsächlich auf der Leitung rauskommt.

fchk

ps:
https://www.amazon.de/AZDelivery-%E2%AD%90%E2%AD%90%E2%AD%90%E2%AD%90%E2%AD%90-Logic-Analyzer-gratis/dp/B01MUFRHQ2

von Ingo S. (schicki)


Lesenswert?

Hi Frank,

sorry der liegt im Büro. Irgendwie werden der SPI-Bus und ich keine 
Freunde. Ich habe den noch nie mögen. Es hätte ja sein können dass ich 
einen Pull-Up oder so nicht berücksichtigt hätte. Dann sitzt der Fehler 
ganz klar vor dem Rechner.

Sämtliche I2C Bausteine mit MAC habe ich zum laufen gebracht. Ein Kunde 
wünscht sich nun das via SPI. Obwohl ne MAC über ein 24AA025E48 bzw. 
über MCP794511 verfügbar wäre.

was soll man machen??

schönes Wochenende
Ingo

von Frank K. (fchk)


Lesenswert?

SO, ich habe mir mal deine Pläne angeschaut. Du benutzt 
RC2(CS),RC3(SCK),RC4(SDI),RC5(SDO). Auf Sheet 5 werden RC4 und RC5 aber 
für einen MAX3232 und einem UART benutzt. Das geht natürlich so nicht. 
Alle Pins müssen zwingend ausschließlich für SPI verwendet werden und 
für überhaupt gar nichts anderes, weder in der Hardware noch in der 
Software. Auch das AT45DB011-Modul benutzt diese Pins, und vor allem 
benutzt es den gleichen CS.

Du hast auch beim RS485 eine Doppelbelegung von RC6 und RC7 mit dem 
RS232. Dss wird auch knallen.

Das wird Dein Problem sein.

Warum verwendest Du eigentlich nicht einen AT24MAC402 am I2C? Da kannst 
DU dann an den beiden Pins noch andere Sachen betreiben, und der Chip 
hat einerseits die vollen 2k an verwendbarem EEPROM und zusätzlich MAC 
und UUID auf einer anderen I2C-Adresse. Diese Teile setze ich auf allen 
meinen Baugruppen ein (ob sie Ethernet haben oder nicht), und damit ist 
jede Baugruppe eineindeutig identifizierbar.

fchk

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Ingo S. schrieb:
> Die HArdware unzählige male geprüft.
Mit einem Logikanalyzer oder einem Speicheroszi? Passiert auf den 
SPI-Leitungen das, was das Datenblatt vorschreibt?

Frank K. schrieb:
> Das geht natürlich so nicht. Alle Pins müssen zwingend ausschließlich
> für SPI verwendet werden und für überhaupt gar nichts anderes, weder in
> der Hardware noch in der Software.
Man kann (Ausgangs-)Pins, die an Eingänge von externen Komponenten 
führen schon durchaus doppelt verwenden. Allerdings muss man dann die 
resultierenden Fehler tolerieren können oder Mechanismen schaffen, dass 
sie sich nicht schädlich auswirken.

> Auf Sheet 5 werden RC4 und RC5 aber für einen MAX3232 und einem UART
> benutzt. Das geht natürlich so nicht.
Beim RC5 ginge das noch. Kommen halt ab&zu eigenartige Zeichen über den 
UART.
Aber der RC4 wird ja gleichzeitig vom Ausgang des MAX und vom µC 
getrieben. Klassiche Buskollision. Da kommt kein brauchbares Signal am 
SI des EEPROMS an. Die sieht man mit einem Oszi sofort am "seltsamen" 
Logikpegel.

> Auch das AT45DB011-Modul benutzt diese Pins, und vor allem benutzt es
> den gleichen CS.
Ich dacht, das wäre "nur" der ISP-Stecker. Aber wenn da tatsächlich was 
drauf ist, dann ist das eine üble Sache.

: Bearbeitet durch Moderator
von Ingo S. (schicki)


Lesenswert?

Hi Frank,

das war das Wort zum Sonntag, Die Handshake Leitung ist mir nicht mehr 
in den Sinn gekommen. RS-232 und RS-485 funktionieren wunderbar 
parallel. Du darfst nur eine benutzen, die andere kann an im Notfall zum 
Debuggen verwenden.

Im Schulbetrtrieb ist es praktisch wenn du beides hast. Kaum war die 
Handshake Leitung gesetzt bzw. getrennt läuft alles.

Klasse. Super vielen Dank.

ein schönes Wochenende an alle
Ingo

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.