es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Compartir los pines GPIO entre dos instancias del controlador de Linux SPI para el convertidor analógico-digital AD7606.

Estoy intentando habilitar dos instancias del controlador SPI AD7606 para AD7606C. Para que el ADC inicie la conversión, es necesario definir los pines GPIO para CONVST (inicio de conversión), el pin de interrupción (pin BUSY) y el pin de RESET en el árbol de dispositivos para que el controlador los use.

Dos ADC están en el bus SPI, cada ADC tiene su propio pin de selección de chip y pin de interrupción/BUSY, pero CONVST y RESET están conectados directamente y son compartidos entre los dos ADC, en los mismos pines.

A continuación se muestra el árbol de dispositivos y la plataforma utilizada es STM32MP157C Odyssey.

&spi2 {
#address-cells = <1>;
#size-cells = <0>;
pinctrl-names = “default”, “sleep”;
pinctrl-0 = <&spi2_pins_mx>;
pinctrl-1 = <&spi2_sleep_pins_mx>;
status = “okay”;

num-cs = <2>;
cs-gpios = <&gpiob 12 GPIO_ACTIVE_LOW>, // ADC CS1
<&gpiod 4 GPIO_ACTIVE_LOW>; // ADC CS2

adc0@0 {
compatible = “adi,ad7606b”;
reg = <0>;
spi-max-frequency = <10000000>; // <60MHz si Vdrive > 2.7V, <40MHz si < 2.7V spi-cpol; spi-cpha; avcc-supply = <&vref>;
interrupts = <10 IRQ_TYPE_EDGE_FALLING>; // Puerto y número de pin donde se conecta el pin BUSY
interrupt-parent = <&gpioe>;
adi,conversion-start-gpios = <&gpiof 10 GPIO_ACTIVE_HIGH>;
reset-gpios = <&gpioc 0 GPIO_ACTIVE_HIGH>;
adi,sw-mode;
};

adc1@1 {
compatible = “adi,ad7606b”;
reg = <1>;
spi-max-frequency = <10000000>;
spi-cpol;
spi-cpha;
avcc-supply = <&vref>;
interrupts = <6 IRQ_TYPE_EDGE_FALLING>;
interrupt-parent = <&gpiod>;
adi,conversion-start-gpios = <&gpiof 10 GPIO_ACTIVE_HIGH>;
reset-gpios = <&gpioc 0 GPIO_ACTIVE_HIGH>;
adi,sw-mode;
};
};

El segundo controlador devuelve un error de sonda -16 (Dispositivo o recurso ocupado) porque no puede usar los pines CONVST y RESET que ya asignó el controlador anterior.

El segundo ADC en realidad funciona si asigno algunos pines GPIO no utilizados al azar, leo el valor del primer ADC (para activar el pin CONVST) y luego leo el valor del segundo ADC. Esto es una solución temporal actualmente utilizada.

Mi pregunta es, ¿es posible compartir de alguna manera los pines GPIO entre dos instancias del mismo controlador en Linux?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    No es posible compartir los pines GPIO entre dos instancias del mismo controlador en Linux. Cada instancia del controlador requiere su propio conjunto de pines GPIO para su funcionalidad específica. En este caso, los pines CONVST y RESET están conectados y compartidos entre los dos ADC, por lo que ambos controladores necesitan utilizar estos pines. La solución actual de usar GPIOs no utilizados al azar no es una solución viable a largo plazo, ya que puede causar conflictos o problemas con otros componentes en el sistema. Una solución más adecuada sería modificar el controlador para manejar GPIOs compartidos para los pines CONVST y RESET entre múltiples instancias del controlador. Sin embargo, esto requeriría modificaciones significativas en el código del controlador y puede que no sea factible.

Comments are closed.