Forum: Mikrocontroller und Digitale Elektronik ATmega32 + ENC28J60 + SPI Kommunikation weigert sich.


von Patrick S. (archenemy)


Lesenswert?

Hallo beisammen,

ich habe ein Problem das mir gerade schwer zu schaffen macht.
Ich benutze das AVR Net IO von Pollin und schreibe dafür meine eigene 
Firmware.
Mein Code ist stark von Ulrich Radigs ETH_M32_EX abgeschaut und mit den 
Datenblättern von ATmega32 und ENC28J60 verglichen, jedoch weigert sich 
der ENC mir Daten zu schicken.

Das Board ist ok, da es mit der vorinstallierten Firmware von Pollin 
bestens funktioniert.

Jeder Versuch über SPI Register auszulesen, gibt nur 0x00000000 zurück.

Hier mal meine SPI Initialisierungsfunktion:
1
#ifndef DDR_SPI
2
#define DDR_SPI     DDRB
3
#endif //
4
5
#ifndef PORT_SPI
6
#define PORT_SPI    PORTB
7
#endif //
8
9
#ifndef PIN_MISO
10
#define PIN_MISO      6
11
#endif //
12
13
#ifndef PIN_MOSI
14
#define PIN_MOSI      5
15
#endif //
16
17
#ifndef PIN_SCK
18
#define PIN_SCK       7
19
#endif //
20
21
...
22
23
void spi_init()
24
{
25
    DDR_SPI  = (1<<PIN_SCK) | (1<<PIN_MOSI);
26
    PORT_SPI |= (1<<PIN_SCK);
27
28
    DDR_SPI &= ~(1<<PIN_MISO);
29
30
    SPCR = (1<<SPE) | (1<<MSTR);
31
    SPSR = (1<<SPI2X);
32
33
    _delay_us(10000);
34
}

Und hier meine SPI lesen/senden Funktion:
1
uint8_t spi_read_write_byte(uint8_t data)
2
{
3
    SPDR = data;
4
5
    while(!(SPSR & (1<<SPIF)));
6
7
    return SPDR;
8
}
9
10
uint8_t spi_read_register(uint8_t address)
11
{
12
    spi_read_write_byte(address);
13
    return spi_read_write_byte(0xFF);
14
}

Aufgefallen ist mir der Fehler bereits beim Initialisieren des ENC.
Da hängt das Programm bereits in dieser Schleife, in der auf das CLKRDY 
Bit gewartet wird:
1
void enc_init()
2
{
3
    usart_send_string("enc_init\r\n\0");
4
5
    enc_system_reset();
6
7
    while(!(enc_read_register(REG_ESTAT) & (1<<BIT_ESTAT_CLKRDY)))
8
    {
9
        char buffer[8];
10
        uint8_t estat;
11
        estat = enc_read_register(REG_ESTAT);
12
        itoa(estat,buffer,2);
13
        usart_send_string(buffer);
14
        usart_send_string("|\r\n\0");
15
    }
16
17
    ...
18
}

Ich kann hier leider keinen Fehler entdecken. Es ist zum Verzweifeln.
Falls mir da jemand helfen könnte, wäre das super...
Danke schonmal.

Auf Wunsch kann ich auch den ganzen zusammenhängenden Quellcode posten.

von spess53 (Gast)


Lesenswert?

Hi

Sieh dir mal das Kapitel 'SS Pin Functionality' im Datenblatt an.

MfG Spess

von Patrick S. (archenemy)


Lesenswert?

Habe ich des öfteren...
Ich habe den SS Pin als Output gesetzt und ziehe vor jeder 
Lese-/Schreibeoperation über SPI auf Low.
Das hätte ich vllt mit posten sollen, sorry.
1
void enc_io_init()
2
{
3
    usart_send_string("enc_io_init\r\n\0");
4
    DDR_CS_ETH   |= (1<<PIN_CS_ETH);
5
    PORT_CS_ETH  |= (1<<PIN_CS_ETH);
6
    usart_send_string("enc_io_init_end\r\n\0");
7
}
8
9
uint8_t enc_read_register(uint8_t address)
10
{
11
    uint8_t data;
12
13
    usart_send_string("enc_read_register\r\n\0");
14
    PORT_CS_ETH &= ~(1<<PIN_CS_ETH);
15
16
    data = spi_read_register(address);
17
    //data = 0x5C;
18
19
    PORT_CS_ETH |= (1<<PIN_CS_ETH);
20
    usart_send_string("enc_read_register_end\r\n\0");
21
22
    return data;
23
}

von Patrick S. (archenemy)


Lesenswert?

Sry...
habe den Fehler gefunden.... -.-

ich habe vergessen, enc_io_init() aufzurufen.
Dementsprechend wurde SS auch nie auf LOW gezogen...

Sehr ärgerlich...

Aber danke trotzdem...

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.