Para la indagación del autobús, sugeriría usar un microcontrolador que, mientras observa el autobús, dedicará toda su energía a esa tarea; Si se necesita algún tipo de respuesta de interrupción mientras se supervisa el bus, use un procesador separado para la supervisión del bus y otras tareas. El procesador de monitoreo de bus probablemente podría actuar como un esclavo SPI mientras está monitoreando el bus, si ninguna de las cosas que se le pide que haga mientras monitorea el bus sería demasiado complicada [por ej. si lo único que el maestro desea que haga es decir si ha ocurrido algún ciclo de bus interesante y, si es así, qué datos se transfirieron entonces]. Tenga en cuenta que es probable que el firmware para el procesador de monitoreo de bus tenga que estar escrito en el código de la máquina y se vea así:
MAIN_LOOP:
bl R12 ; Assume R12 holds address of bus-polling rou
ldrb r0,[r11,#SPI_REGS_OFS] ; Assume R11 always holds base of SPI peripheral
and r0,r0,#SPI_READY_FLAG
beq MAIN_LOOP
bl R12
ldrb r4,[r12,#SPI_DATA_REG]
and r0,r4,#15
ldr pc,[pc,r0,asl,#2]
nop
; Insert table of 15 jump addresses here
dc.w CMD00_HANDLER, CMD01_HANDLER, CMD02_HANDLER, ... etc.
CMD00_HANDLER:
bl R12
sub r0,r8,r9 ; Assume R8 and R9 are queue pointers
strb r0,[r12,#SPI_DATA_REG]
b MAIN_LOOP
CMD01_HANDLER:
bl R12
ldrb r0,[r8],#1
bic r8,#256 ; Assume queue is located at address of form xxxx0xxxxxxxx.
strb r0,[r12,#SPI_DATA_REG]
b MAIN_LOOP
POLL_BUS:
ldr r5,[r10,#PORT_OFS] ; Assume R10 always holds port base
and r0,r5,r7 ; Assume R7 always holds mask
cmp r0,r6 ; Assume R0 holds compare value
addeq r12,#(POLL_BUS2-POLL_BUS)
b r14
POLL_BUS2:
str r5,[r9],#4
bic r9,#256 ; Assume queue is located at address of form xxxx0xxxxxxxx.
add r12,#(POLL_BUS3-POLL_BUS2)
POLL_BUS3:
ldr r0,[r10,#PORT_OFS] ; Assume R10 always holds port base
cmp r5,r6 ; See if anything changed
addne r12,#(POLL_BUS-POLL_BUS3)
b r14
Tenga en cuenta que el código nunca pasa mucho tiempo sin un bl R12
que llama a una de las funciones POLL_BUS, y ninguno de ellos toma mucho tiempo antes de regresar. Mantener todo en registros dedicados permite que el código se ejecute mucho más rápido de lo que sería posible en C. El código anterior se diseñaría para capturar registros de cuatro bytes cada vez que el estado del bus cambie a un patrón particular; una vez que agarre algo, esperará hasta que algo en el puerto (ya sea enmascarado o no) cambie antes de agarrar el siguiente elemento.