Deseo leer un dispositivo esclavo SPI. Así es como pensé que sería el procedimiento:
CS_BAJO
CS_ALTO
Sin embargo, esto no funciona. Para que funcione, esto es lo que tengo que seguir:
CS_BAJO
CS_ALTO
¿Por qué tengo que leer los datos en la línea MISO incluso cuando sé que no habrá nada deseable?
PD: Las funciones SPI Read() y Write() son solo mis propias implementaciones, nada en particular para una sola MCU.
Editar: según lo solicitado, proporciono algunos detalles sobre las MCU.
Estoy usando dos MCU: STM32F303VCT y TI TIVA123GH6PM . Ambas MCU requieren que siga dicho procedimiento.
Aquí está mi implementación de la función de transmisión y recepción SPI en STM32
uint8_t SPI_rdwr(uint8_t data)
{
*(__IO uint8_t *)&SPI1->DR = data; //send data
while(!(SPI1->SR & SPI_SR_TXE)); // wait till TX buffer is empty
while(SPI1->SR & SPI_SR_BSY); // wait if SPI line is busy
while(!(SPI1->SR & SPI_SR_RXNE)); //wait till RX buffe is NOT empty
return *(__IO uint8_t *)&SPI1->DR; //return data if data received on MISO line
}
¿Por qué la operación de lectura SPI de 4 cables necesita que lea la línea MISO en cada operación de transmisión?
Porque:
Por razones de rendimiento, los implementadores de HAL escribieron SPI_Write sin el bucle "esperar a que el registro de transmisión esté vacío" incorporado, pero SPI_Read
tiene dicho bucle. En ese caso, emitir escrituras sin lecturas sobrecargaría el búfer. Su implementación también desperdicia tiempo en ese ciclo: una vez que puede leer, también puede escribir; o
La biblioteca de abstracción de hardware (HAL) que está utilizando configura el silicio para que funcione de esa manera, cuando el silicio no requiere que sea así,
y tal vez no estés configurando el HAL para que lo haga de la forma que quieres, en caso de que el HAL lo admitiera (y necesariamente también el silicio); o
tal vez no esté configurando el silicio para que haga lo "correcto" cuando el silicio lo permite; o
el silicio está diseñado para funcionar de esa manera y no de otra manera.
No recuerdo los detalles de la implementación de SPI en los chips que está utilizando, pero:
Algunas implementaciones de SPI pueden tener el receptor apagado y, por lo tanto, las lecturas no serán necesarias ya que esa función estará deshabilitada.
SPI probablemente se puede usar con DMA, por lo que no le importará demasiado la sobrecarga de hacer las lecturas.
Incluso si lo hace en software, las lecturas pueden ser baratas. No usar HAL probablemente también ayudaría con eso, aunque asegúrese de compilar el código en una configuración de versión optimizada y auditar el ensamblado para confirmar que no hace nada innecesario. Incluso su código escrito a mano hace cosas innecesarias.
annie
Sólo yo
usuario_1818839
Sólo yo
usuario253751
Luffy
Luffy
usuario253751
Sólo yo
Luffy
Sólo yo
Kuba no ha olvidado a Monica