STM32 I2C Leer mensaje de longitud variable desde el esclavo

0

Tengo dos dispositivos que deben comunicarse a través de I2C. El maestro escribe algunos datos al esclavo, y luego debe leer una respuesta del esclavo.

Ni el esclavo ni el maestro conocen la longitud del mensaje que se debe recibir. En el Esclavo, esto no es un problema, configuro el DMA para que reciba 255 bytes (más de lo que el maestro escribirá en un solo mensaje), y luego espero que se levante la condición de PARADA para indicar el final de la transferencia.

En el Maestro no puedo averiguar cómo leer un mensaje del esclavo sin saber cuántos bytes se deben leer. ¿Hay alguna forma de hacer esto? Mi entendimiento es que el Maestro genera la condición de DETENER, por lo que no puedo usar eso.

Actualmente, acabo de leer un byte del esclavo que contiene la cantidad de bytes que se van a transferir, y luego hago otra lectura para esa cantidad de datos, pero estoy buscando una forma más eficiente y rápida.

Estoy usando MCU STM32L433 y he usado las bibliotecas LL para el código I2C con DMA para transferir los mensajes al periférico.
Saludos cordiales

    
pregunta AJBotha

1 respuesta

1

Cada byte transmitido a través de I2C requiere reconocimiento. Cuando el esclavo está transmitiendo datos al maestro, es responsabilidad del maestro permitir que el esclavo continúe (respondiendo ACK) o indicándole que se detenga (respondiendo NACK).

Entonces, si envía primero el número de bytes N disponibles para leer, entonces su maestro simplemente puede continuar leyendo y respondiendo con N-1 ACK y terminarlo todo respondiendo NACK antes de emitir la condición de PARADA.

Alternativamente, si su formato de datos lo permite, puede marcar el último byte como "fin de datos". Por ejemplo, los datos de 7 bits se pueden marcar con 1 bit de altura. Los datos que son un subconjunto de valores de 8 bits pueden marcarse con cualquier valor fuera de ese subconjunto. O puede reservar dos valores como señales ESC y EOD, etc.

Tenga en cuenta que todos estos métodos son generalmente menos eficientes que enviar primero un byte de longitud de mensaje. Después de todo, incluso si hubiera alguna forma "mágica" de 1 bit para finalizar la transmisión desde el lado esclavo en el protocolo I2C, estaría ahorrando solo 7 bits de tiempo en una transmisión.

    
respondido por el Maple

Lea otras preguntas en las etiquetas