I2C: ¿Se requiere DMA?

4

Estoy tratando de portar algún código de ejemplo de la ST biblioteca estándar ejemplos. Específicamente, hay un archivo llamado stm32_eval_i2c_tsensor.c que lee y escribe registros para el sensor de temperatura y lee la temperatura.

No entiendo por qué se usó DMA aquí. Las respuestas del sensor de temperatura tienen como máximo dos bytes de longitud. La parte más difícil de la transferencia es el DMA, y preferiría usar "sondeo" en su lugar.

¿Realmente se requiere DMA aquí para leer la temperatura de un sensor de temperatura?

    
pregunta Randomblue

2 respuestas

11

Es muy posible que la razón para usar DMA se encuentre en STM32 errata (el enlace es para la subfamilia stm32f101 / 103 de «alta densidad»), un documento tan fascinante como el propio manual de referencia. Básicamente, el periférico I2C está roto de muchas maneras interesantes. Uno de los elementos de errata (2.11.1) indica que ciertos eventos de hardware deben ser atendidos inmediatamente, o puede ocurrir algún tipo de condición de carrera de hardware:

  

Cuando los eventos EV7, EV7_1, EV6_1, EV6_3, EV2, EV8 y EV3 no son   administrado antes de que se transfiera el byte actual, los problemas pueden ser   encontrado como recibir un byte extra, leer los mismos datos   Dos veces o datos faltantes.

Básicamente, el funcionamiento correcto no está garantizado en todos los casos, a menos que I2C reciba el servicio de las interrupciones de mayor prioridad (Solución 2) o DMA (Solución 1). Ahora, si lo estoy leyendo correctamente, una simple transferencia encuestada con todas las interrupciones deshabilitadas también funcionaría, pero eso va en contra de toda la filosofía de diseño de Cortex-M (la concurrencia sale por la ventana). Si se usa un RTOS preventivo, es aún peor.

Dicho esto, varias personas tienen a I2C trabajando en los modos de encuesta e interrupción sin seguir estrictamente las recomendaciones de errata y sin problemas aparentes. Sin embargo, esto no puede tomarse como una indicación de que un problema nunca ocurrirá, por supuesto. Si va a implementar su propio controlador I2C, le recomiendo que maneje no solo todas las posibles condiciones de error indicadas por el periférico, sino también los tiempos de espera. Si ocurre un error o se agota el tiempo de espera, asegúrese de enviar una PARADA (para reiniciar los esclavos) y reiniciar el controlador tal como se documenta en el manual. Recibir datos erróneos de esclavos también es una posibilidad en la que deberías pensar. Puede encontrar muchas discusiones sobre este problema en los foros de ST y en otros lugares.

    
respondido por el Thorn
1

No dice cómo se conecta el sensor, excepto que se menciona IIC en su título. Si es IIC, entonces todo lo que realmente necesita es que IIC se implemente sobre dos pines. DMA es un medio dentro del procesador de tratar con datos de E / S, que no tiene nada que ver directamente con la forma en que ese periférico hace señales al mundo exterior.

En otras palabras, IIC y DMA son conceptos independientes. Me sorprende que DMA sea incluso una opción para algo tan lento como IIC, pero aparentemente su procesador implementa eso a partir de lo que dice. No estoy familiarizado con ese procesador, pero lo más probable es que el periférico IIC se pueda ejecutar en otros modos de E / S, como el sondeo explícito o la activación por interrupción.

Retrocede y piensa en el problema que estás tratando de resolver. IIC es un protocolo simple que se puede implementar fácilmente con el firmware que controla directamente dos líneas de E / S siempre y cuando usted sea el maestro. Con un procesador que lee un sensor de temperatura, el procesador será el maestro, por lo que no hay problema.

Este es un gran ejemplo de pasar más tiempo tratando de hacer que el código de otra persona trabaje para usted que solo hacerlo usted mismo. En el pequeño mundo integrado del sistema, debes comprender los niveles bajos de todos modos. Si no entiende cómo funciona el IIC, deténgase y apréndalo antes de continuar. Eso es parte del trabajo. El solo hecho de llamar ciegamente a la biblioteca de otra persona le causará problemas, y ya ha perdido más tiempo que (¡jadeo!) Escribiendo su propio código.

    
respondido por el Olin Lathrop

Lea otras preguntas en las etiquetas