SPI en PIC24H no avanza

4

Estoy intentando configurar el puerto SPI1 en mi micro PIC24HJ206GP256. He configurado el registro de control SPI1CON1 con 0x0020, el registro de control SPI1STAT con 0x8000 (es decir, encender el SPIEN) y SPI1CON2 = 0.

En este momento, una simple escritura en SPI1BUF se implementa así:

 void writeSPI1(char data){
     _SPI1IF = 0;             //set interrupt flag to zero
     SPI1BUF = data;          //write data to SPI1BUF
     while( _SPI1IF == 0);    //wait to flag to go high
 }

Cuando se escriben los datos, el SPI1IF debe ir alto, pero nunca llega a este punto, por lo que el programa simplemente permanece en el bucle para siempre. Por lo tanto, parece que nunca se registrarán datos del puerto SPI a través de MOSI.

He intentado que funcione configurando TRISF = 0x0000, aunque he leído que el puerto SPI debería encargarse de la configuración del pin SPI.

Estoy usando una ventana de visualización para ver el contenido de SPI1BUF.

He intentado con diferentes configuraciones dentro de los registros de control pero no he tenido suerte. También he intentado habilitar SPI1IF (IEC0: Registro de control de habilitación de interrupción 0) y el problema persiste.

¿He olvidado alguna configuración adicional, como alguna funcionalidad extraña de PORTF que tiene prioridad sobre el puerto SPI?

    
pregunta Kevin Reid

2 respuestas

2

Utilice la biblioteca de periféricos SPI, hará las cosas mucho más fáciles.

Verifique en la hoja de datos las funciones alternativas de los pines que está utilizando. Si se comparten con el ADC, esa será la función predeterminada y deberá habilitarlos para la E / S digital.

Debería usar los foros de Microchip para este tipo de pregunta, muchas más personas utilizarán los PIC de 16 bits.

    
respondido por el Leon Heller
2

¿Ha intentado sondear en el registro SPI1STAT: SPITBF en lugar del SPI1IF? Si el indicador de interrupción no cambia cuando debería, ¿el registro SPI1STAT: SPITBF cambia también? De acuerdo con la hoja de datos que el registro debe establecer cuando los datos se cargan en el búfer de TX, a través de SPI1BUF, y se borran cuando los datos salen del búfer de TX y se transmiten a través del pin. Para un primer intento, esperaría a ver si SPI1STAT: SPITBF se pone a 0 después de cargar SPI1BUF. Si tiene un osciliscopio, sería una buena manera de ver si se está transmitiendo algo a través de los pines de salida.

Además, ¿de dónde viene la definición de _SPI1IF? Si está utilizando MPLAB como su entorno de desarrollo, haga que use las definiciones de registro del archivo de encabezado del chip. Me pregunto si _SPI1IF se asigna incluso al registro correcto.

    
respondido por el spade78

Lea otras preguntas en las etiquetas