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.
- Espere a que TXBUF esté vacío (TXIFG);
- desactivar las interrupciones;
- escriba el 1er byte a TXBUF;
- espera TXBUF vacío;
- escriba el segundo byte a TXBUF;
- 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ó.