spi código de interrupción

1

Estoy tratando de dejar que dos uC se hablen. Ambos chips son de la familia dsPIC33EP. El esclavo responderá según lo que el amo le haya enviado. Mi pregunta es que, dado que SPI es dúplex completo, ¿sería demasiado tarde para enviar los datos al maestro en un ciclo de comunicación? ¿Debo cargar un byte para transmitir el búfer antes de recibir un byte? Por favor vea mi código mientras demuestro mis dudas.

void ISR() iv IVT_ADDR_SPIINTERRUPT{
    char data;
    SpiIntFlag=0;//clear interrupt flag
    data=SPIBUF;//read the incoming byte

    //send back one byte according to the received byte
    if(data==0x01){
        SPIBUF=0xF1;
    }
    else if(data==0x02){
        SPIBUF=0xF2;
    }
    else if(data==0x03){
        SPIBUF=0xF3;
    }
    else if(data==0x04){
        SPIBUF=0xF4;
    }

}

Como puede ver, se enviará un byte después de que el esclavo reciba uno. ¿Significa que recibir y enviar no sucede al mismo tiempo? He intentado este código con ATmega32u4 en 5MHZ. Pero parece que el maestro recibe un byte correspondiente de acuerdo con el byte enviado al esclavo. Además, no se reciben bytes adicionales, por lo que creo que este proceso de comunicación (lectura y envío) ocurre al mismo tiempo. ¿Qué pasa con el retraso que causaron las declaraciones ()?

¿Es esta la forma correcta de hacer la comunicación SPI? Todo lo que quiero lograr es que el maestro envíe un byte de comando y el esclavo devuelva un par de bytes de vuelta de acuerdo con él.

    
pregunta Timtianyang

1 respuesta

1

Con SPI, el maestro genera el reloj, por lo que realmente no existe el concepto de poder recibir múltiples bytes de un esclavo automáticamente, tiene que enviar bytes adicionales para generar el reloj. Diga que si tuviera un sensor y quisiera que el comando 0x01 devolviera la temperatura actual, el pseudo-código para el maestro podría ser:

spi_write(0x01);
t_lsb = spi_write(0x00); // These dummy bytes are just needed to generate a clock
t_msb = spi_write(0x00); // So that the slave gets a chance to send the results back

Encendido y el esclavo podría verse así:

cmd = spi_read();
if (cmd == 0x01) {
  spi_write(t_lsb);
  spi_write(t_msb);
}

Técnicamente, puede devolver un byte desde el esclavo para cada byte enviado desde el maestro, pero para la mayoría de los protocolos probablemente no haya nada útil para devolver hasta que el esclavo haya recibido y decodificado el comando. Con suerte, puedes entender que el pseudocódigo y el concepto general están bien, ha pasado un tiempo desde que programé PIC SPI en el nivel de registro pero parece que estás al tanto de ese lado de las cosas.

    
respondido por el PeterJ

Lea otras preguntas en las etiquetas