¿Puedo usar SPI para salida serial asíncrona?

1

Necesito un segundo canal de salida asíncrono en serie en el MSP430G2553 y me gustaría usar SPCI USCI para hacer esto.

¿Es la velocidad de transmisión de USCI SPI lo suficientemente estable para hacer esto a 300 baudios, 2400 baudios o 9600 baudios? Actualmente estoy usando el reloj de 8 MHz.

¿Hay alguna otra opción que pueda salvarme de los golpes de bits?

Mi pensamiento actual para 300 bd Tx es el siguiente:

  1. establezca primero el preescalador en 26666 LSB
  2. carga el byte en Txbuf
  3. cargue 0x7F en Txbuf para generar los bits de parada e inicio
  4. repite 2-3
  5. enviar los bits de parada finales 0xFF

También podría ser posible enviar diez bits de datos a otros miembros de la familia MSP430 que contienen un SPI.

Gracias por tus respuestas.

    
pregunta skvery

1 respuesta

1

Es posible utilizar SPI para generar más de ocho bits, siempre y cuando pueda asegurarse de que TXBUF esté siempre lleno.

Su esquema de usar 0x7F cada segundo byte se vuelve poco confiable si ocurre un retraso; Podría ser una mejor idea distribuir los datos reales en dos bytes:

1110xxxx xxxx1111
iiisdddd ddddSiii

( i = inactivo, s = bit de inicio, S = bit de parada, d = datos)

Entonces solo debes mantener estos dos bytes juntos y puedes permitir una pausa después de ellos.

  1. Espere a que TXBUF esté vacío (TXIFG);
  2. desactivar las interrupciones;
  3. escriba el 1er byte a TXBUF;
  4. espera TXBUF vacío;
  5. escriba el segundo byte a TXBUF;
  6. habilitar interrupciones.

Sin embargo, verifique que el módulo SPI de su MCU realmente genere 1 (el valor más reciente) cuando está inactivo. Puede generar el primer bit del último byte en su lugar; en ese caso, deberá enviar 0xFF después (o la siguiente combinación válida de dos bytes).

Recibir con SPI podría ser más peligroso. Cualquier latencia de interrupción afectará el momento en que muestree los bits de datos, por lo que tendrá un retraso que, en la práctica, es incontrolable.

Alternativamente, puede usar una salida de temporizador para emular un UART. Use el modo continuo, programe un CCR para la hora del siguiente flanco de señal, y configure o restablezca el modo de salida según sea necesario. En el controlador de interrupciones, programe el siguiente borde (agregue la longitud de bit al CCR y cambie el modo de configuración / restablecimiento, si es necesario). Esto es similar a golpear los bits, pero garantiza la sincronización siempre que pueda manejar la interrupción para cada bit lo suficientemente rápido.

Del mismo modo, puede usar un temporizador para recibir: programe un CCR en modo de captura en el flanco descendente. Cuando recibe una interrupción, obtiene la hora exacta del borde en el registro CCR, y luego puede reprogramar el CCR para el modo de comparación, disparando en medio del bit siguiente respectivo; en el controlador de interrupciones, el bit SCCI muestra el valor de la entrada del temporizador cuando se activó.

    
respondido por el CL.

Lea otras preguntas en las etiquetas