¿Se requieren todas las conexiones a mi ENC28J60?

2

Intento conectar un módulo ENC28J60 que expone una interfaz SPI a mi Beaglebone Black. Solo tengo los pines 1 (NET_CS), 2 (SCK), 3 (MOSI, es decir, D0), 4 (MISO, es decir, D1), 5 (GND), 10 (VCC) conectado a mi Interfaz SPI1 de Beaglebone . Los pines que he conectado son los siguientes. Los pines que no tengo conectados están etiquetados como N/A en la columna BBB PIN .

ENC PIN  | FUNCTION | BBB PIN
-----------------------------
      1  | NET_CS   | P9.28
      2  | SCK      | P9.31
      3  | MOSI     | P9.29
      4  | MISO     | P9.30
      5  | GND      | P9.03
      6  | WOL      | <N/A>
      7  | NET_INT  | <N/A>
      8  | CLKOUT   | <N/A>
      9  | NET_RST  | <N/A>
      10 | VCC      | P9.01

He usado la siguiente superposición del árbol de dispositivos para configurar mis pines.

/dts-v1/;
/plugin/;

/ {
compatible = "ti,beaglebone", "ti,beaglebone-black";

/* identification */
part-number = "BB-ENC28J60";

/* version */
version = "00A0";

/* state the resources this cape uses */
exclusive-use =
  /* the pin header uses */
  "P9.24",
  "P9.25",
  "P9.26",
  "P9.27",
  "P9.28",
  "P9.29",
  "P9.30",
  "P9.31",
  "spi1";

fragment@0 {
  target = <&am33xx_pinmux>;
  __overlay__ {
    pinctrl_spi1: pinctrl_spi1_pins {
    pinctrl-single,pins = <                                        
      0x184 0x37  /* P9_24 RST       | IN_PULLUP     | MODE7 */
      0x1ac 0x37  /* P9_25 INT       | IN_PULLUP     | MODE7 */
      0x180 0x37  /* P9_26 WOL       | IN_PULLUP     | MODE7 */
      0x1a4 0x37  /* P9_27 CLKOUT    | IN_PULLUP     | MODE7 */
      0x19c 0x13  /* P9_28 SPI1_CS   | OUTPUT_PULLUP | MODE3 */
      0x194 0x33  /* P9_29 SPI1_D0   | INPUT_PULLUP  | MODE3 */
      0x198 0x13  /* P9_30 SPI1_D1   | OUTPUT_PULLUP | MODE3 */
      0x190 0x3B  /* P9_31 SPI1_SCLK | INPUT_PULLUP  | MODE3 */
      >;
    };
  };
};

fragment@1 {
  target = <&spi1>;
     __overlay__ {
       #address-cells       = <1>;
       #size-cells          = <0>;
       status               = "okay";
       pinctrl-names        = "default";
       pinctrl-0            = <&pinctrl_spi1>;    

       spidev@0{
         compatible         = "microchip,enc28j60";
         reg                = <0>;
         interrupt-parent   = <&gpio3>;
         interrupts         = <21>;
         spi-max-frequency  = <20000000>;
       };
       spidev@1{
         compatible         = "spidev";
         reg                = <1>;
         spi-max-frequency  = <24000000>;
       };            
    };
  };
};

Nota: para otros lectores, no tengo idea de lo que estoy haciendo con este árbol de dispositivos, especialmente con respecto al interrupt que elegí en este ejemplo. Así que no lo cortes y no lo pegues.

Parece que tener solo estos pines conectados es suficiente para identificar el módulo como una interfaz de red de un Debian que se ejecuta en mi Beaglebone. Revisé el registro dmesg después de aplicar la capa y vi lo siguiente. Cuando juego con el cableado invirtiendo MISO y MOSI o alguna otra combinación que incluya CS o CLK, constantemente obtengo errores en dmesg . Eso me hace pensar que estoy en el camino correcto, o al menos que mi cableado es correcto.

[   57.074485] bone-capemgr bone_capemgr.9: part_number 'BB-ENC28J60', version 'N/A'
[   57.074670] bone-capemgr bone_capemgr.9: slot #7: generic override
[   57.074721] bone-capemgr bone_capemgr.9: bone: Using override eeprom data at slot 7
[   57.074774] bone-capemgr bone_capemgr.9: slot #7: 'Override Board Name,00A0,Override Manuf,BB-ENC28J60'
[   57.075043] bone-capemgr bone_capemgr.9: slot #7: Requesting part number/version based 'BB-ENC28J60-00A0.dtbo
[   57.075098] bone-capemgr bone_capemgr.9: slot #7: Requesting firmware 'BB-ENC28J60-00A0.dtbo' for board-name 'Override Board Name', version '00A0'
[   57.086968] bone-capemgr bone_capemgr.9: slot #7: dtbo 'BB-ENC28J60-00A0.dtbo' loaded; converting to live tree
[   57.088829] bone-capemgr bone_capemgr.9: slot #7: #2 overlays
[   57.140361] edma-dma-engine edma-dma-engine.0: allocated channel for 0:45
[   57.140553] edma-dma-engine edma-dma-engine.0: allocated channel for 0:44
[   57.222844] edma-dma-engine edma-dma-engine.0: allocated channel for 0:43
[   57.223015] edma-dma-engine edma-dma-engine.0: allocated channel for 0:42
[   57.223509] enc28j60 spi1.0: enc28j60 Ethernet driver 1.01 loaded
[   57.237571] net eth1: enc28j60 driver registered
[   57.247437] bone-capemgr bone_capemgr.9: slot #7: Applied #2 overlays.

Si elevo el nivel de depuración en la interfaz y ifconfig up la nueva interfaz, veo el resultado a continuación en mi registro del kernel.

Nov 24 08:58:53 arm kernel: [  117.451971] enc28j60: enc28j60_net_open() enter
Nov 24 08:58:53 arm kernel: [  117.456764] enc28j60: enc28j60_hw_init() - HalfDuplex
Nov 24 08:58:53 arm kernel: [  117.456813] enc28j60: enc28j60_soft_reset() enter
Nov 24 08:58:53 arm kernel: [  117.461525] enc28j60: chip RevID: 0x06
Nov 24 08:58:53 arm kernel: [  117.469000] enc28j60 Hw initialized.
Nov 24 08:58:53 arm kernel: [  117.469000] HwRevID: 0x06
Nov 24 08:58:53 arm kernel: [  117.469000] Cntrl: ECON1 ECON2 ESTAT  EIR  EIE
Nov 24 08:58:53 arm kernel: [  117.469000]        0x03  0x88  0x01  0x00  0x00
Nov 24 08:58:53 arm kernel: [  117.469000] MAC  : MACON1 MACON3 MACON4
Nov 24 08:58:53 arm kernel: [  117.469000]        0x0d   0x32   0x40
Nov 24 08:58:53 arm kernel: [  117.469000] Rx   : ERXST  ERXND  ERXWRPT ERXRDPT ERXFCON EPKTCNT MAMXFL
Nov 24 08:58:53 arm kernel: [  117.469000]        0x0000 0x19ff 0x0000  0x19ff  0xa1    0x00    0x05ee
Nov 24 08:58:53 arm kernel: [  117.469000] Tx   : ETXST  ETXND  MACLCON1 MACLCON2 MAPHSUP
Nov 24 08:58:53 arm kernel: [  117.469000]        0x1a00 0x1fff 0x0f     0x37     0x10
Nov 24 08:58:53 arm kernel: [  117.469118] enc28j60: eth1: Setting MAC address to 62:78:04:14:a4:b6
Nov 24 08:58:53 arm kernel: [  117.469602] enc28j60: enc28j60_hw_enable() enabling interrupts.
Nov 24 08:58:53 arm kernel: [  117.472893] enc28j60: enc28j60_check_link_status() PHSTAT1: 1800, PHSTAT2: 0000
Nov 24 08:58:53 arm kernel: [  117.472942] net eth1: link down
Nov 24 08:58:53 arm kernel: [  117.472982] net eth1: normal mode
Nov 24 08:58:53 arm kernel: [  117.473035] net eth1: normal mode
Nov 24 08:58:53 arm kernel: [  117.473208] net eth1: multicast mode
Nov 24 08:58:53 arm kernel: [  117.473295] IPv6: ADDRCONF(NETDEV_UP): eth1: link is not ready
Nov 24 08:58:53 arm kernel: [  117.473376] enc28j60: multicast mode

En este punto, estoy atascado. Mi pregunta es si se requieren todos los pines de mi módulo, o solo los centrados en SPI. Si no es así, ¿hay algún indicador sobre cómo depurar esto?

    
pregunta sholsapp

1 respuesta

2

Suponiendo que el ENC28J60 esté conectado correctamente para ejecutarse, solo necesita las conexiones que menciona a un host para comunicarse con él a través de SPI. En teoría, un host puede hacer todo lo que necesita al conectarse a:

PWR y GND
CS (selección de chip SPI, impulsado por el host)
SCK (reloj SPI, impulsado por el host)
MISO (chip para alojar línea de datos)
MOSI (línea de datos de host a chip)

Puede ser útil para el host controlar también la línea de reinicio, y hay una señal de interrupción fuera del chip si recuerdo bien, pero estas conexiones no son estrictamente necesarias. Toda la gestión del ENC28J60 se puede realizar a través del SPI. El uso de algunas de las líneas adicionales es solo por conveniencia.

    
respondido por el Olin Lathrop

Lea otras preguntas en las etiquetas