Cómo stm32 implementa la comunicación SPI entre múltiples dispositivos
Hay varios puntos fáciles de cometer errores en la comunicación SPI de doble máquina usando DMA:
1) Valor de división de frecuencia: la frecuencia más alta de SPI es 18M y SPI1 está en una frecuencia de 72M en APB2 y SPI2 está en APB1 con una frecuencia de 36M. Si la frecuencia del reloj del chip es 72M, entonces 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 abierta: vi a alguien en Internet diciendo que el esclavo La máquina debe encenderse primero para enviar, luego encender el maestro para enviar, luego encender el esclavo para recibir y finalmente encender el maestro para recibir. No sé por qué está habilitado de esta manera, y este método para habilitar DMA es difícil de implementar. Es posible que deba agregar dos líneas de protocolo de enlace más para determinar si la otra parte ha habilitado DMA. La secuencia de mi programa "recepción de esclavo - envío de esclavo - recepción de host - envío de host" también es factible.
3) Interrupción DMA: cuando los datos se envían al primer bit del último byte, si activa la interrupción de envío DMA, ingresará a la función de interrupción de envío DMA. En este momento, la bandera. El bit no se puede borrar inmediatamente. Se debe consultar el registro ISR para determinar si se han transmitido los datos restantes de 7 bits y luego se determina si el registro SR está ocupado. Solo después de que todo esté completo podrá borrar los bits de bandera y reconfigurar la longitud de los datos DMA; de lo contrario, los datos posteriores serán incorrectos.
4) Resistencia pull-up: Ocasionalmente se producirán errores si no se agrega la resistencia pull-up. Este error no se puede ver mediante la simulación. Mi simulación es correcta siempre, pero después de desconectar el emulador y probar. continuamente, encuentro que los datos son incorrectos. Sí, puede haber 1 error después de 5 reinicios. Después de agregarlos, los datos son extremadamente estables. No entiendo por qué la información en línea no incluye dominadas.
5) Restablecer la dirección del búfer: dado 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ó inconsistencias en la dirección del búfer. Deje de cambiar, por lo que DMA. debe deshabilitarse y luego se debe reconfigurar la dirección del búfer DMA.
6) El proceso de envío del host sin interrupción: vi información en Internet que después de que el host habilita DMA, espera allí para verificar si la transmisión DMA se completa, por lo que no se puede desempeñar el papel de DMA. . La frecuencia de SPI es 18M y se dice que DMA es de aproximadamente 10M. Si usa el método de espera muerta, es mejor no usar DMA.
Entonces, si el host no utiliza la interrupción DMA, entonces puede escribir dos funciones, una es para habilitar DMA y la otra es para determinar si la transferencia DMA se ha completado. Entre estas dos funciones, la CPU puede hacer lo suyo de todos modos. El host tiene la iniciativa.
Para máquinas multiesclavo, se recomienda agregar un chip controlador de tres estados como el 243. La velocidad SPI puede ser muy rápida y estable. Si se permite, una mejor manera es agregar uno a cada esclavo para aislarlo del maestro, de modo que incluso si hay un problema con un esclavo, no afectará al bus.