Puede que sea otro el problema... Probaste de configurar una menor frecuencia de SPI?
Saludos!
Ahora tengo:
// TCPIP
#define GetSystemClock() 32000000UL
#define GetInstructionClock() (GetSystemClock())
#define GetPeripheralClock() (GetSystemClock())
Resultado:
IP Fija conectado directamente al PC: Conexión inmediata, responde al ping, con un tiempo medio de 4ms, se pierden paquetes y se pierde la conexión volviendo enseguida
IP dinámica conectado al router: No conecta, por ARP veo que está conectado pero con una IP 169....
¿Falla la negociación full / half duplex? ¿falla el DHCP? ¿falla el SPI?
Al principio pensaba que era la velocidad del SPI como bien dices, buscando encuentro esto:
ENC_SPICON1bits.CKE = 1 wrong value? .Pero es para ENC28J60
Se supone que el stack configura el SPI de la mejor forma posible pero claro, es solo una suposición.
Mañana probaré como bajar la velocidad al SPI a algo más estable pero estoy buscando experiencias de este tipo para saber como y qué cambiar pero no encuentro, sólo me queda probar y probar
#elif defined(__C30__)
// Ensure SPI doesn't exceed processor limit
#if (defined(__PIC24F__) || defined(__PIC24FK__) || defined(__PIC24H__) || defined(__dsPIC33F__)) && ENC100_MAX_SPI_FREQ > 8000000
#undef ENC100_MAX_SPI_FREQ
#define ENC100_MAX_SPI_FREQ 8000000
#endif
#if defined(__dsPIC30F__) && ENC100_MAX_SPI_FREQ > 10000000
#undef ENC100_MAX_SPI_FREQ
#define ENC100_MAX_SPI_FREQ 10000000
#endif
// Calculate optimal primary and secondary prescalers to make an SPI clock no faster than ENC100_MAX_SPI_FREQ
#define OPTIMAL_PRESCALE ((((~((GetPeripheralClock()/64+ENC100_MAX_SPI_FREQ-1)/ENC100_MAX_SPI_FREQ - 1)) & 0x7)<<2) | 0x0)
#if GetPeripheralClock()/8/16 <= ENC100_MAX_SPI_FREQ
#undef OPTIMAL_PRESCALE
#define OPTIMAL_PRESCALE ((((~((GetPeripheralClock()/16+ENC100_MAX_SPI_FREQ-1)/ENC100_MAX_SPI_FREQ - 1)) & 0x7)<<2) | 0x1)
#endif
#if GetPeripheralClock()/8/4 <= ENC100_MAX_SPI_FREQ
#undef OPTIMAL_PRESCALE
#define OPTIMAL_PRESCALE ((((~((GetPeripheralClock()/4+ENC100_MAX_SPI_FREQ-1)/ENC100_MAX_SPI_FREQ - 1)) & 0x7)<<2) | 0x2)
#endif
#if GetPeripheralClock()/8/1 <= ENC100_MAX_SPI_FREQ
#undef OPTIMAL_PRESCALE
#define OPTIMAL_PRESCALE ((((~((GetPeripheralClock()/1+ENC100_MAX_SPI_FREQ-1)/ENC100_MAX_SPI_FREQ - 1)) & 0x7)<<2) | 0x3)
#endif
// Work around 1:1, 1:1 SPI errata on early PIC24FJ128GA010, PIC24HJ256GP610, dsPIC33FJ256GP710, etc. silicon where SCK stops running
#if (defined(__PIC24F__) || defined(__PIC24H__) || defined(__dsPIC33F__)) && (OPTIMAL_PRESCALE == 0x1F)
#undef OPTIMAL_PRESCALE
#define OPTIMAL_PRESCALE 0x1B
#endif
#define ConfigureSPIModule() do{ \
ENC100_SPISTAT = 0; /* Turn off SPI */ \
ENC100_SPICON1 = OPTIMAL_PRESCALE | 0x0100 | 0x0020; /* CKE = 1, MSTEN = 1 */ \
ENC100_SPICON2 = 0; /* Legacy non enhanced buffering */ \
ENC100_SPISTAT = 0x8000; /* Turn on SPI */ \
}while(0)
#define ConfigurePMPModule() do{ \
PMCONbits.PMPEN = 0; \
PMCON = (PMP_ADRMUX<<11) | 0x0323; /* PTWREN = 1, PTRDEN = 1, ALP = 1, WRSP = 1, RDSP = 1 */ \
PMMODE = (PMP_MODE16<<10) | (PMP_MODE<<8) | (OPTIMAL_PMP_WAIT_STATES<<2); \
PMAEN = PMP_ADR_PINS; \
PADCFG1bits.PMPTTL = 0; /* Use schmitt trigger input buffers */ \
PMCONbits.PMPEN = 1; \
}while(0)