¿Qué frecuencias SPI admite Raspberry Pi?

22

¿Qué frecuencias SPI admite Raspberry Pi?

Adicionalmente:

  • ¿Todos ellos son compatibles con el controlador bootc.net SPI ?
  • ¿Hay alguna cosa adicional que deba tener cuidado al tratar de comunicarme con algún otro chip a través de SPI?
akavel
fuente

Respuestas:

21

El SPI de Raspberry Pi funciona a la velocidad de reloj APB, que es equivalente a la velocidad de reloj central, 250 MHz. Esto se puede dividir por cualquier número par de 2 a 65536 para la velocidad deseada. La hoja de datos especifica que el divisor debe ser una potencia de dos, pero esto es incorrecto . Los números impares se redondean hacia abajo y 0 (o 1) es equivalente a 65536. Por lo tanto, un divisor menor que 2 es imposible.

Esto hace que el rango de frecuencia sea de 3.814 kHz a 125 MHz, con 32768 pasos intermedios.

(Ha habido mucha información errónea sobre este asunto, pero estos resultados han sido verificados por experimentación. Por favor, corra la voz).

Desnudo
fuente
1
Creo que esta respuesta debería estar en la parte superior.
Jon Watte
¿Estas seguro acerca de esto? Gordon afirma que, si bien puede alimentarlo con cualquier número par, solo las potencias de dos realmente marcan la diferencia: Comprender SPI en la Raspberry Pi | Gordons Projects
scruss
3
Probé esto con un osciloscopio. Creo que el problema con Gordon es que usa el controlador del núcleo, que reduce la velocidad del reloj, en lugar de ordenar directamente al procesador sin usar el controlador del núcleo.
Desnudo
2
Este hilo del foro proporciona más información para probar la respuesta de Nakedible: raspberrypi.org/phpBB3/…
Nippey
5

El SPI puede ejecutarse a la velocidad del reloj central o dividirse para obtener periféricos más lentos. El reloj central es de 250 MHz. El divisor se puede establecer en cualquier potencia de dos, desde 2 ^ 0 hasta 2 ^ 16. Esto significa que se admiten frecuencias SPI de 3.8 kHz a 250 MHz.

Fuentes:

Maria Zverina
fuente
1
Tal vez: Farhad obtiene de hojas de datos para BCM2835, que es el SoC real para RPi, mientras que mi referencia es para el BCM2708, que es solo una parte del SoC. Las fuentes pueden converger ... pero, de nuevo, puede que no. Así que creo que es mejor preservar fuentes alternativas por ahora.
Maria Zverina
1
Ah, y area51 nos enumera con 1.7 respuestas por pregunta y afirma que "2.5 respuestas por pregunta es buena, solo 1 respuesta por pregunta necesita algo de trabajo. En un sitio saludable, las preguntas reciben múltiples respuestas y la mejor respuesta se vota al principio". :-)
Maria Zverina
1
Respuesta incorrecta: 2 ^ 0 no es compatible, y el divisor no necesita ser una potencia de dos.
Desnudo
1
@Nakedible, ¿puede proporcionar la fuente de sus declaraciones?
Maria Zverina
1
La hoja de datos bcm2835 confirma el punto 2 ^ 0. raspberrypi.org/wp-content/uploads/2012/02/… Esto también está confirmado por define en la biblioteca bcm2835. open.com.au/mikem/bcm2835 En cuanto a la no potencia de dos divisores, la errata de la hoja de datos menciona que posiblemente se entiende el múltiplo de 2. elinux.org/BCM2835_datasheet_errata Esto también se publicó en algún foro en el que cualquier múltiplo de 2 parece funcionar. Todo esto también se ha confirmado al probar la salida SPI en hardware real. Vea mi respuesta a continuación que especifica esto exactamente.
Desnudo
4

La hoja de datos de BCM2835 dice lo siguiente en la página 120: El valor del registro de reloj del bloque SPI contiene.

BC Clock Divider SCLK = Core Clock / CDIV Si CDIV se establece en 0, el divisor es 65536. El divisor debe ser una potencia de 2. Números impares redondeados hacia abajo. La velocidad máxima del reloj SPI es del reloj APB.

No puedo encontrar ninguna referencia a cuál es la frecuencia máxima del bus APB, creo que es parte de la documentación de ARM11 y no de este SoC.

FarhadA
fuente
1
Gracias por la referencia; Creo que la página es 156? CDIV parece tener 16b de ancho, por lo que va de 1 a 65536. ¿"Core clock" es probablemente el 700MHz? ¿Entonces obtendríamos un rango de ~ 10.7kHz hasta el misterioso límite APB?
akavel
1
De nada, pero me temo que este reloj no es el reloj central. Es el bus APB: "APB está diseñado para accesos de control de bajo ancho de banda, por ejemplo, las interfaces de registro en los periféricos del sistema. Este bus tiene una dirección y una fase de datos similar a AHB, pero una lista de señales muy reducida y de baja complejidad (por ejemplo, sin ráfagas) ). Tiene que admitir señales de 32 bits y 66 MHz ".
FarhadA
4

He probado con lo que se ve en http://www.brianhensley.net/2012/07/getting-spi-working-on-raspberry-pi.html y he cambiado la velocidad.

La velocidad máxima cuando se pasa la prueba es de 15MHz = 15000KHz: Ver resultado:

spi mode: 0
bits per word: 8
max speed: 15000000 Hz (15000 KHz)

FF FF FF FF FF FF
40 00 00 00 00 95
FF FF FF FF FF FF
FF FF FF FF FF FF
FF FF FF FF FF FF
DE AD BE EF BA AD
F0 0D

La prueba a 16MHz falló. André

andré
fuente
1
La mía funcionó bien a 32MHz = 32,000KHz. He visto mencionar aquí que este es el límite práctico también. Estoy ejecutando el último firmware RPi en Raspbian hard float si eso marca la diferencia.
dodgy_coder
Tener RPi 3 ejecutando esa prueba a 60MHz con éxito.
Vlad