Tengo dos PIC18F4620 conectados a través de SPI + Slave Select + línea IRQ adicional. Ambos controladores se controlan desde el mismo oscilador de cristal utilizando los mismos ajustes de reloj. El maestro envía un byte y luego espera hasta que el esclavo alterne esa línea IRQ adicional. La duración de la conmutación es de 4 ciclos de instrucción. Todos los bordes se ven bien en el alcance y la comunicación SPI funciona correctamente, a excepción de la detección de conmutación ( while(!PORTBbits.RB1);
).
Este es mi código de envío SPI:
while (spi_out_msg_buffer.write_cursor > spi_out_msg_buffer.read_cursor)
{
DisableInterrupts;
SSPBUF = spi_out_msg_buffer.data[spi_out_msg_buffer.read_cursor];
LATBbits.LATB0 = 1;
while(!PORTBbits.RB1); // wait for toggle on IRQ line
LATBbits.LATB0 = 0;
EnableInterrupts;
spi_out_msg_buffer.read_cursor++;
}
El while(!PORTBbits.RB1);
se traduce en dos instrucciones:
BTFSS PORTB, 1, ACCESS
BRA 0x188
Instalé esa línea B0
para propósitos de depuración, puedes verla al final de este diagrama de tiempo:
PuedeverelcambiodelalíneaIRQ(segundodesdelaparteinferior)ycómonosedetecta,porquelalíneadedepuraciónB0
semantienealta.CuandodetengolaejecuciónatravésdeICD,secuelgadentrodewhile
.Valelapenamencionarquegeneralmentefuncionaparaunospocosbytesyluegosedetiene,comopuedeveraquí:
Medí que el pulso es en realidad 4 ciclos de instrucción (= 16 ciclos PLL = 4 ciclos de reloj) largos:
Creoquedeberíasersuficienteparaquesedetecteelpulso.InclusosielprimerBTFSSlopierdeporqueelpuertosemuestreaalcomienzodelciclodeinstrucciones,entonceselsegundodeberíaobtenerlo:
10 MHz - > PLL - > 40 MHz - > 10 M instrucciones por segundo - > 100 ns por instrucción.
¿No debería ser eso lo suficientemente largo para salir de while
?