La interfaz SPI solo devuelve unos (0xFF)

1

Estoy intentando registrar un dispositivo SPI en mi Angstrom Linux (kernel versión 3.10) para usar un chip ADC (LTC2258) para mi placa personalizada. El procesador que utiliza I2m es Cyclone V y las transferencias de FPGA parecen correctas (SPI Master 1 se entrega a HPS). Entonces, edité mi archivo .dtb así:

        spi@0xfff01000 {
        compatible = "snps,dw-spi-mmio-15.0", "snps,dw-spi-mmio";
        reg = <0xfff01000 0x100>;
        interrupt-parent = <0x3>;
        interrupts = <0x0 0x9b 0x4>;
        clocks = <0x21>;
        #address-cells = <0x1>;
        #size-cells = <0x0>;
        bus-num = <0x0>;
        num-chipselect = <0x4>;
        status = "okay";

        spidev@0 {
            compatible = "spidev";
            reg = <0x0>;
            spi-max-frequency = <0x5f5e100>;
        };

    };

En el arranque del kernel, solo dice esto sobre SPI:

root@cyclone5:~# dmesg | grep -i spi 
[    0.652554] dw_spi_mmio fff01000.spi: master is unqueued, this is deprecated

Pero la entrada spidev0.0 aparece bajo /dev . Con el programa spidev_test predeterminado, veo esta salida:

root@cyclone5:~# ./spi_d -D /dev/spidev0.0 
spi mode: 0
bits per word: 8
max speed: 500000 Hz (500 KHz)

FF FF FF FF FF FF 
FF FF FF FF FF FF 
FF FF FF FF FF FF 
FF FF FF FF FF FF 
FF FF FF FF FF FF 
FF FF FF FF FF FF 
FF FF 

Y ahí está la cosa: la interfaz SPI de ese ADC se usa para la configuración. Por lo tanto, el caso de prueba para mí es escribir valores de configuración en registros con direcciones dadas y leerlas con éxito. Entonces, modifico el búfer tx del código fuente; Escribo y leo los registros. Pero me da el mismo resultado, FFs completos.

En la hoja de datos de ADC, dice:

  • Los datos se escriben en un registro con una serie de 16 bits. palabra. Los datos también se pueden leer de un registro para verificar su contenido.
  • El primer bit de la palabra de entrada de 16 bits es el bit R / W. los los siguientes siete bits son la dirección del registro (A6: A0). Los ocho bits finales son los datos de registro (D7: D0). Si el bit R / W es bajo, los datos en serie (D7: D0) se escribirán Diez al registro establecido por los bits de dirección (A6: A0). Si el El bit R / W es alto, los datos en el registro se establecen por los bits de dirección (A6: A0) se leerá en el pin SDO

Por lo tanto, modifiqué el código en consecuencia. Utilizo mi spidev_test modificado con estos parámetros:

./spi_d2 -D /dev/spidev0.0 -b 16 -s 100000000

Pero como he dicho antes, el resultado es completo. Además, cambiar el parámetro bits por palabra no afecta el resultado.

¿Cómo puedo depurar esto? ¿Dónde debería mirar? Cualquier ayuda es apreciada. Gracias de antemano.

    
pregunta ddyn

3 respuestas

2

Resultó que estaba mal informado sobre el pin de selección de chip del ADC. Cambiar el valor reg del nodo hijo de spidev a 1 solucionó el problema. Los parámetros finales que utilizo son:

./spi_d -D /dev/spidev0.1 -b 16 -H -O

¡Perdón por perder tu tiempo y gracias por tu ayuda!

    
respondido por el ddyn
2

Conecte un analizador lógico o un alcance para ver que las señales realmente están cambiando (CS, SCK y MOSI), luego conecte MOSI a MISO para ver que puede recibir lo que está enviando. Stable 0xFF o 0x00 generalmente indica que la línea está atascada y no está conectada en ningún lugar.

    
respondido por el filo
1

Asegúrese de que la velocidad del reloj no sea más rápida que 25MHz (de la hoja de datos) y que la polaridad y la fase del reloj estén configuradas correctamente (CPOL = 0, CPHA = 0)

    
respondido por el pm101

Lea otras preguntas en las etiquetas