SPI leyendo desde esclavo

1

Tengo una pequeña pregunta sobre cómo se mueven los bytes durante la lectura de SPI. Tengo un chip de memoria flash y un microcontrolador. Supongamos que quiero saber datos jedec del chip (aunque puede ser cualquier dato, esto es solo un ejemplo), encontré cómo hacerlo y funciona bien, pero no entiendo la parte cuando asignamos parámetros jedec a variables .

Desde el código C a continuación puedo ver la posible lógica como esta:
enviamos el comando "recuperar jedec" al chip, luego, por alguna razón, comenzamos a enviar ceros para asignar valores a las variables, probablemente lea el valor enviando dummy-bytes. La pregunta es: ¿no se supone que debe sobrescribir los bytes que estamos leyendo?
Quiero decir: transfiere algo al registro que desea leer, por lo tanto, recupera el valor al reemplazarlo con lo que ha enviado.

Tal vez exprese mi pregunta borrosa, pregunte más información si está confundido, pero para resumir todo tengo dos preguntas:
1. ¿Por qué estamos enviando ceros durante las asignaciones de valores como * b1 = SPI_MasterTransmit (0); 2. Si lo hacemos para cambiar el valor del dispositivo esclavo al maestro, ¿por qué no borramos el valor del esclavo haciendo esto?

void get_jedec_id(uint8_t *b1, uint8_t *b2, uint8_t *b3) {  
    PORTB |= 1<<PINB2; // turn high ss pin(/cs)
    PORTB &= ~1<<PINB2; // turn low ss pin(/cs)
    SPI_MasterTransmit(0x9F); // transmit get_jedec command of this chip
    *b1 = SPI_MasterTransmit(0); // manufacturer id
    *b2 = SPI_MasterTransmit(0); // memory type
    *b3 = SPI_MasterTransmit(0); // capacity
    PORTB |= 1<<PINB2;
    not_busy();
}

SPI_MasterTransmit code:

unsigned char SPI_MasterTransmit(uint8_t outData)
{
// Transmission start
SPDR = outData;
// Waiting for transmission to end
while(!(SPSR & (1<<SPIF))) ;
return SPDR; // return received byte
}
    
pregunta ScienceSamovar

1 respuesta

1

SPI es un protocolo de dúplex completo. Para recibir datos, debe enviarlos al mismo tiempo, aunque el chip Flash no haga nada con los datos que envíe.

Entonces, por ejemplo, quieres leer el ID de JEDEC. Baja la señal / CS y envía el comando "leer ID de JEDEC". Ese comando le indica al chip de Flash que "envíe su ID JEDEC y no haga nada con ningún otro dato que reciba". Continúa enviando datos (que son todos ceros y se ignorarán de todos modos), y al hacerlo, le devuelve su ID de JEDEC: obtiene un byte de JEDEC ID por cada cero bytes que envíe. Cuando levanta / CS al final de la transacción, eso restablece el controlador del chip Flash.

    
respondido por el markt

Lea otras preguntas en las etiquetas