Cómo stm32 implementa la comunicación multi-SPI
1) Valor de división de frecuencia: la frecuencia más alta de SPI es 18M, SPI1 está en APB2, la frecuencia es 72M, SPI2 está en APB1, la frecuencia es 36M. Si la frecuencia del reloj del chip es 72M, el valor de división de frecuencia de SPI1 es 4 y el valor de división de frecuencia de SPI2 es 2.
2) Secuencia DMA: vi a alguien en Internet diciendo que el esclavo debe comenzar a enviar primero, luego el host enviará, luego el esclavo recibirá y finalmente el host recibirá. No estoy seguro de por qué está tan abierto y es tan difícil abrir DMA. Es posible que deba agregar dos líneas de protocolo de enlace más para determinar si la otra parte ha habilitado DMA. Mi programa "recibir desde - enviar desde - recibir desde el host - enviar desde el host" también está en este orden.
3) Interrupción DMA: cuando los datos se envían al primer bit del último byte, si la interrupción de envío DMA está activada, se ingresará la función de interrupción de envío DMA y el bit de bandera no se puede aclarado inmediatamente. Es necesario consultar el registro ISR para determinar si se han enviado los 7 bits de datos restantes y luego determinar si el registro SR está ocupado. Una vez completado, el bit de bandera se puede borrar y la longitud de los datos DMA se puede reconfigurar; de lo contrario, los datos posteriores serán incorrectos.
4) Resistencia al pull-up: Sin tirones, ocasionalmente habrá errores. Este error no es visible en la simulación. Siempre obtengo resultados correctos en la simulación, pero cuando desconecto el emulador y continúo probando, encuentro que los datos son incorrectos. Cinco reinicios pueden provocar 1 error. Después de agregarlos, los datos son extremadamente estables. No entiendo por qué no se ha agregado la información en Internet.
5) Restablecer la dirección del búfer: debido a que el proyecto requiere un búfer de longitud variable, utilicé malloc y free muchas veces para asignar el tamaño del búfer, lo que provocó que la dirección del búfer siguiera cambiando, por lo que tuve que deshabilitar DMA. y luego reconfigure la dirección del búfer del DMA.
6) El proceso de envío del host no se interrumpe: la información que vi en Internet es que después de que el host habilita DMA, espera para verificar si la transmisión DMA se completa, por lo que no puede desempeñar el papel de DMA. La frecuencia de SPI es de 18M, mientras que se dice que la frecuencia de DMA es de aproximadamente 10M. Si está esperando morir, es mejor que no utilice DMA.
Entonces, si el host no usa interrupciones DMA, puede escribir dos funciones, una es habilitar DMA y la otra es determinar si la transferencia DMA se completa. Entre estas dos funciones, la CPU puede hacer lo suyo y el host tiene la iniciativa de todos modos.
Para esclavos múltiples, se recomienda agregar un chip controlador de tres estados como el 243, para que la velocidad SPI pueda ser rápida y estable. Si se permite, una mejor manera es agregar uno para cada esclavo y aislarlo del maestro, de modo que incluso si hay un problema con un esclavo, no afectará al bus.