Interfaz de una MCU STM32 con un ADC externo (y lectura de datos a través de SPI)

Quiero usar un microcontrolador STM32 para leer datos de un ADC multicanal. Lo más probable es que el microcontrolador que pretendo usar sea algo de la serie F7 (como STM32F746ZGT ), mientras que el ADC que actualmente tengo en mente es el LTC2358-18 de Analog Devices.

El proyecto en el que estoy trabajando requiere que lea simultáneamente 6 canales analógicos (con una tasa de datos razonable). Según tengo entendido, el chip ADC en particular puede generar sus resultados de conversión en diferentes canales de salida de datos en serie (SDO) que se pueden leer en paralelo (el reloj en serie es idéntico para todos ellos):ingrese la descripción de la imagen aquí

Me preguntaba si es posible usar una sola MCU STM32 para leer los datos de salida de 6 canales a través de SPI (realmente no necesito los dos canales restantes). En general, asumiría que necesito configurar 6 interfaces SPI que están disponibles en STM32F746ZGT, de la siguiente manera:

  1. Uno de los SPI actúa como maestro y proporciona el reloj en serie (SCK) para todos los dispositivos esclavos (los 5 SPI restantes en el chip STM32 y el ADC) y la salida de datos en serie (SDO) para la configuración del ADC. El maestro (supongo) bajaría el CS para todos los esclavos SPI.
  2. Los 5 SPI restantes en el STM32F746ZGT comparten una línea SCK común y cada uno está vinculado a un canal SDO en el ADC.

O, en otras palabras, sería algo como esto:

ingrese la descripción de la imagen aquí

¿Funcionaría realmente este tipo de configuración o me estoy perdiendo algo?

¿Es este momento crítico? Cada SDO generará datos de todos los canales, por lo que solo necesita un SPI.
Lo que dice uhors. Lo que se requiere es un bus SPI y seis selecciones de chip. A menos que sea demasiado lento. Sin embargo, la velocidad del reloj SPI de esos ADC es muy rápida, por lo que no veo que eso sea un problema a menos que me falte algo en el ADC. Una "tasa de datos razonable" no es una especificación "razonable";)
Bueno, no es demasiado crítico, pero generalmente quiero mejorar el rendimiento de este sistema de adquisición de datos. Me imaginé que en este tipo de configuración podría leer los datos de 6 canales en (aproximadamente) el período de 24 horas. Leer los datos de un solo SDO llevaría 6 veces más. Con respecto a la tasa de datos, preferiría alcanzar la tasa de 200 kSps que puede ofrecer el chip ADC.
Interesante idea, y puedo ver que funcione. Estaba pensando en usar la interfaz quad-SPI (lea dos valores), pero no estoy seguro de si se puede hacer que funcione como un SPI "normal".
Supongo que debería enunciar que mi principal preocupación es que no sé cómo las interfaces SPI 1 maestra y 5 esclavas manejarán los datos entrantes coincidentes en el tiempo del ADC. ¿Puedo esperar que todos los datos se reciban correctamente en la MCU?
Cada SPI tiene un registro de desplazamiento interno que se llena con los datos provenientes de la línea MISO. Después de que se haya recibido un byte, debe asegurarse de manejar todo el registro de desplazamiento completo antes de que su maestro registre el siguiente byte. De lo contrario, podría perder un byte debido a la saturación. Aparte de eso, no veo ningún problema.
Su enfoque suena factible para mí. No he mirado la combinación de funciones alternativas para ese procesador, pero si está usando pines para otros periféricos, puede tener problemas para configurar para usar los 6 SPI. No sé si su tasa de datos permitiría menos SPI, pero en el lado derecho del diagrama de tiempo de ADC parece que probablemente podría usar 1, 2, 3 o 6 SPI con tasas de datos escaladas a la cantidad de SPI que necesita. usar. ... Por cierto, es posible que también quieras probar el foro STM32 .

Respuestas (2)

No soy un experto en STM, pero para casi todos los controladores con los que he trabajado, esto no funcionaría por las siguientes razones:

  • Probablemente (no verifiqué) no puede acceder a las 6 interfaces SPI simultáneamente debido a las restricciones de asignación de pines, incluso si usa solo un pin MISO de cada uno; Supongo que no funciona.
  • Las seis interfaces son todas independientes entre sí, no hay forma de sincronizar el reloj de la interfaz 0 a la interfaz n. Este suele ser el caso porque el periférico SPI generalmente se compra como IP y luego se instancia 6 veces; pero no hay interconexión entre ellos; son instancias separadas con sus propios registros/regiones de memoria.

En su lugar, lo que debe hacer es leerlos según lo previsto en serie (por lo general, esto se hace a través de una lectura DMA). Dado que solo hay un ADC en el interior y la frecuencia de muestreo máxima según la hoja de datos es de 200k (8 canales), suponiendo que una transferencia de 24 bits (no estoy seguro de si el DMA del STM puede manejar esto) da como resultado una velocidad de datos / velocidad de spi de aproximadamente 40 MBit. Esto debería ser posible, sin tener en cuenta el procesamiento posterior.

1) Es físicamente posible utilizar todos los SPI en el STM32F746ZGT (es un chip relativamente grande de 144 pines). 2) La sincronización SCK entre los SPI no sería interna. Todos los pines SPIn_SCK estarían conectados externamente (junto con el ADC) y el SPI maestro (SPI1) sería el que proporcionaría el reloj para todo el bus. Me imagino que los esclavos SPI deberían adherirse a la señal de reloj particular.
Solía ​​hacerlo. Un maestro y muchos esclavos en un micro. Los esclavos fueron cronometrados desde el maestro en el mismo chip. Esta transferencia no es nada para stm32
@laptop2d: Gracias por corregir mi 4.5MBit. Supuse que la frecuencia de muestreo combinada era de 200 kSps, no para cada canal.
@PeterJ: ¿Puede indicar qué controlador usó?
@KR: La última parte es donde creo que estás equivocado, pero no lo he probado.
@Tom L. STM32F429Zi

Su procesador STM no tiene subprocesos múltiples, no lo olvide. No puedes leer físicamente 6 líneas en paralelo. Solo uno a la vez, use los ID de canal y conéctelo todo a una línea. La conversión ADC es lo que lleva más tiempo en el proceso. Ordene a los ADC que conviertan y luego lea las salidas individualmente. Póngalos todos en la misma línea, luego diga 'línea 1 dame datos', ahora 'línea 2 dame datos', uno por uno. Esta es la razón por la que existen los ID de canal, de lo contrario estarían desperdiciando bits valiosos.

Soy consciente de que la MCU de STM no tiene subprocesos múltiples. No es demasiado difícil leer los datos de los ocho canales a través de una sola línea SDO (como se menciona en uhours en un comentario anterior) o leerlos uno por uno. Lo que más me interesa es cómo funcionaría tal arreglo SPI. ¿La MCU recibiría datos solo de un canal SPI y los demás serían ignorados?
@sidA30 DMA + interrupciones de DMA bien administradas
Puedes leer 6 líneas sdo en paralelo, lo hago todo el tiempo.
Estoy seguro de que puedes, pero no en esta aplicación. - El ADC tiene un búfer, por lo que mantendrá los datos por usted, solo dígale al ADC que se ejecute y obtenga DATOS de todas las líneas que desee, luego, una vez que haya terminado de convertir, lea todas las líneas individualmente, una por una . Su entrada de línea de datos será fácilmente lo suficientemente rápida como para tomar entradas de 6 a 18 bits entre cada ciclo de conversión.