Interfaz hecha a mano para SWD para escribir flash de chip ARM

Estoy interesado en crear una interfaz simple para SWD para poder escribir memoria flash de chips ARM. Es decir, para crear un dispositivo de programación improvisado, más por el bien del ejercicio.

Empecé a leer la documentación y a buscar ejemplos (porque creo que la gente ya lo intentó). Actualmente tengo algunas preguntas, para las cuales agradecería su orientación:

  • Voy a configurar SWDCLK como salida normal y SWDIO como drenaje abierto (que actúa como entrada cuando está en Z alto, ver más abajo). Sospecho que también es drenaje abierto en el lado del dispositivo de destino. , por lo que con la ayuda de pull-up nunca tendré un cortocircuito por error, ¿es correcto?
  • ¿Hay un período de reloj mínimo permitido? o cualquier cosa servirá, incluso unos pocos Hertz? ¿O tal vez esto depende del dispositivo de destino?
  • ¿Es correcto que en el modo de espera ambas líneas estén en ALTO en el lado del host, y cuando comienza la comunicación, el primer flanco en SWDCLK está cayendo?
  • HOST debería cambiar SWDIO en el borde descendente de SWCLK, y muestrear datos del objetivo (cuando sea necesario) en el borde descendente de SWCLK, ¿verdad?

Creo que actualmente es suficiente (aunque también estaría agradecido por una breve muestra de la secuencia de comandos para leer / escribir el flash, pero creo que lo descubriré pronto de todos modos), ¡gracias de antemano!

Actualmente estoy tratando de usar Arduino para crear un prototipo básico, aunque puedo cambiar a Atmega simple o LPC111x con cable FTDI en cualquier momento... Aunque creo que esto no es importante.

PD: para explicar mejor SWDIO: con AVR, por ejemplo, coloco el pin en estado BAJO y luego, si se cambia a salida, produce 0. Sin embargo, si se cambia a entrada, está en estado Z alto y realmente funciona como aporte. Es decir, no manipulo el bit PORTx, sino DDRx (mientras que PORTx es 0 permanente y PINx se usa para leer).

Respuestas (1)

Voy a configurar SWDCLK como salida normal y SWDIO como drenaje abierto

SWDCLK está bien, pero SWDIO es bidireccional y no abre el drenaje. Eso significa que debe poder cambiar del modo de salida al modo de entrada y viceversa.

¿Hay un período de reloj mínimo permitido?

Por lo general, no, pero algunos dispositivos tienen velocidades de reloj mínimas para funciones especiales como el desbloqueo.

También estaría agradecido por una breve muestra de la secuencia de comandos para leer/escribir el flash

Eso es específico para cada dispositivo. OpenOCD admite muchos tipos diferentes (tanto microcontroladores como programadores) y tiene código fuente disponible.

Ya he portado Versaloon a la MCU LPC1343 en el CCC R0ket , este podría ser un punto de partida más simple.

"pero SWDIO es bidireccional y no de drenaje abierto" - oh, expliqué mal mi idea, actualizaré la descripción. ¡Gracias por todos tus consejos!
Si el consumo de energía y la velocidad no son importantes, es posible usar una resistencia en lugar de un controlador de 3 estados para conectar una salida a un pin de E/S. Cuando el pin de E/S genera una señal, gana. Cuando está flotando, la salida ligada a la resistencia gana. Por lo general, no es difícil encontrar una resistencia que sea lo suficientemente alta como para evitar dañar la salida, pero lo suficientemente baja como para dominar cualquier fuga parásita. La capacitancia parásita puede limitar la velocidad utilizable, pero para una interfaz manual eso no debería ser un problema.
Por cierto, nunca he cambiado la programación de un procesador en serie, pero he usado un grupo de 8 interruptores de datos, 8 LED, algunos interruptores de modo y un botón para alimentar un programa corto de 16 bytes en un procesador RCA-1801 .