ATmega32 + ENC28J60 + SPI Kommunikation weigert sich.

OP #2203267
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.
OP #2203298
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
}

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