¿Cómo hacer que un puerto PIC32 SPI funcione para transmitir datos?

4

Estoy buscando que un puerto serie SPI se ejecute en un PIC32 (PIC32MX360F). ¿Alguien puede indicarme algunos buenos recursos sobre cómo hacer esto para que un novato pueda averiguarlo? Estoy usando el kit de inicio PIC32 y tengo una tabla de salida PIC32 de Digi-Key.

Este es el código que he estado usando ... lo encontré en el manual de la familia PIC32.

#include <p32xxxx.h>
   int main(void){
        int rData;
        IEC0CLR=0x03800000; // disable all interrupts
        SPI1CON = 0; // Stops and resets the SPI1.
        rData=SPI1BUF; // clears the receive buffer
        IFS0CLR=0x03800000; // clear any existing event
        IPC5CLR=0x1f000000; // clear the priority
        IPC5SET=0x0d000000; // Set IPL=3, Subpriority 1
        IEC0SET=0x03800000; // Enable RX, TX and Error interrupts
        SPI1BRG=207; // use FPB/4 clock frequency
        SPI1STATCLR=0x40; // clear the Overflow
        SPI1CON=0x8220; // SPI ON, 8 bits transfer, SMP=1, Master mode
        // from now on, the device is ready to transmit and receive data
        SPI1BUF='A'; // transmit an A character

        while(1){
            SPI1BUF= 'A'; // transmit an A character
            while(i < 10000){i++;}
            i = 0;
        }
}

¿Cómo configuro la velocidad de transmisión? Supongo que tiene algo que ver con SPI1BRG

EDITAR:

Gracias a tcrosley siento que estoy más cerca de poder comunicarme con mi pic32. Cambié SPI1BRG a 207. Según mis cálculos, esto establecerá la velocidad en baudios en aproximadamente 9600.

Fsck = Fpb / (2 (SPIxBRG +1)) = 4MHZ / (2 * (207 + 1)) = 9615

Estoy tratando de ver la salida en el picchip con HyperTerminal. Los ajustes que estoy usando son:

Baud: 9600
Data bits: 8
Parity: None
Stop bits: 1
Flow Control: None

Los pines que estoy usando son:

93 - connected to db9 3
95 - connected to db9 2

y db9 5 está conectado a tierra de las placas ...

Ahora estoy obteniendo una salida, lo cual es bueno, pero desafortunadamente es basura. mi salida en HyperTerminal sale como un montón de corazones: S ahora siento que mi pic32 se está burlando de mí

    
pregunta Richard

5 respuestas

5

Esta nota de aplicación AN1277 describe cómo interactuar con un SRAM serial a un microcontrolador PIC32 usando el compilador C32. La página tiene un enlace a un archivo zip que contiene código fuente, que debería tener rutinas de bajo nivel para leer y escribir datos a través de la interfaz SPI.

EDITAR:

  

¿Cómo configuro la velocidad de transmisión? yo soy   adivinando que tiene algo que ver con   SPI1BRG

Veo que ha descargado la " hoja de datos " para su procesador (hoja de datos es una un nombre poco apropiado, tiene 632 páginas de largo), así que usaré referencias de páginas de eso.

La ecuación (en la página 397) para la frecuencia de reloj SPI es

Fsck = Fpb / (2 * (SPI1BRG + 1))

Creo que el PIC32MX360F comienza con un oscilador FRC interno de 8 MHz, dividido por 2 (debido al valor predeterminado de FRCDIV de 1 en el registro OSCCON, página 56), y como no está realizando cambios en su código para OSCCON, el valor de SYSCLK será de 4 MHz.

Fpb es la frecuencia del reloj del bus periférico. Se configura en el campo PBDIV del registro OSCCON, que a su vez se inicializa con el valor del campo FPBDIV en el DEVCFG1 (registro de configuración de inicio), que se muestra en la página 63. Suponiendo que no haya cambiado esto, el POR predeterminado ( el valor de reinicio de encendido) es binario 11, lo que significa que el Fpb es SYSCLK dividido por 8.

Por lo tanto, Fpb = 4 MHz / 8 o 500 KHz.

Si SPI1BRG = 1, como en su ejemplo, Fsck = Fpb / (2 * (1 + 1)) = Fpb / 4 = 500 KHz / 4 o 125 KHz.

Si su SYSCLK difiere de 4 MHz, entonces escale el Fpb en consecuencia.

¿No son divertidos los procesadores integrados?

    
respondido por el tcrosley
2

Compre este libro: Programando microcontroladores de 32 bits en C. Aprendiendo a volar el PIC32 .

Tiene un capítulo llamado Comunicación síncrona mediante los módulos SPI y mucho más.

    
respondido por el Daniel Grillo
1

¿A qué estás conectando el SPI? Sea lo que sea, tendrá una hoja de datos que le dará los requisitos para su canal SPI. Entonces,

  1. configure su registro TRIS correctamente,
  2. habilitar correctamente el canal SPI,
  3. establezca los niveles de SI y SO y cómo se escalonan con el SCLK. Y es posible que necesite una habilitación (selección de esclavo). La hoja de datos de su interfaz le dirá eso.

Usa un oscope para verificar que lo estás haciendo correctamente.

    
respondido por el ArielP
1

Es probable que su problema sea que después de enviar la primera "A" no está leyendo SPI1BUF para borrar lo que sea que SPI "lea" nuevamente. Recordemos que SPI funciona como un registro de desplazamiento; por cada bit que empuja, recibe un poco. Si no lee el contenido de SPI1BUF, es probable que obtenga un overun, y según la sección 17.2.6 de la hoja de datos, el dispositivo deja de funcionar hasta que borre SPIROV

    
respondido por el Malife
0

Para empezar:

  1. Asegúrese de tener la configuración de sus registros TRIS correctamente
  2. Use un monitor de bus o un osciloscopio para ver si la sincronización de la señal SPI es correcta para el dispositivo con el que está tratando de comunicarse
respondido por el mjh2007

Lea otras preguntas en las etiquetas