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.