SPI Read devuelve solo 0 en el esclavo cuando conecto SS a INT

4

Estoy codificando un esclavo SPI usando un PIC16F877A en CCS C y necesito saber cuándo la línea SS (pin 7) va de alto (inactivo) a bajo (activo), ya que la información del maestro se enmarca como un flujo de bytes con el byte inicial (el primer byte después de que SS se active) me indica para qué sirven los bytes restantes.

Corto SS (desde el maestro) hasta INT (pin 33) y escribí esto:

#include <16F877A.h>
#device adc=16

#device *=16 

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O

#use delay(clock=20000000)
#use rs232(baud=57600,parity=N,xmit=PIN_C6,rcv=PIN_C7, ERRORS)

// TODO: add a 100ohm resistor between the SS pin and the chip select output of the master microcontroller                                                     // Clock base   Sample on 
#define SPI_MODE_3  (SPI_H_TO_L | SPI_XMIT_L_TO_H)   //    high      trailing edge 

volatile int1 slave_cs_enabled = false; //has the slave STB been enabled?

//#PRIORITY EXT, SSP
#PRIORITY INT_EXT, INT_SSP

#INT_EXT
void slave_cs_isr() 
{ 
   slave_cs_enabled = true; 
} 

//#INT_SSP

void main()
{
   unsigned int8 data = 0;

   enable_interrupts(INT_EXT);
   ext_int_edge( H_TO_L );
   clear_interrupt(INT_EXT); //if you read the data sheet, you will 
   enable_interrupts(GLOBAL); 
   //Now the code will call the interrupt in the rising edge. 

   setup_spi(SPI_SLAVE | SPI_MODE_3);

   while(1) {
      if(slave_cs_enabled)
      {
         slave_cs_enabled = false;
         printf("STB\n\r");
      }

      if(spi_data_is_in())
      {
         data = spi_read();
         printf("%X\n\r", data);
      }
   }
}

Todo lo que obtengo después de STB es "00". Literalmente ceros.

Este comportamiento permanece sin cambios incluso si desconecto físicamente el pin 33 del pin 7, señalando un problema en mi código.

Cuando saco la lógica STB (incluida la desactivación del código de interrupción), obtengo un flujo de bytes, pero eso no me sirve, ya que ahora no sé dónde comienza y dónde termina un flujo.

¡Ayuda!

    
pregunta vsmGuy

1 respuesta

1

Debe verificar la configuración del registro TRISB. Lea la sección 4.2 de este documento ( enlace ). Explica cómo los registros TRIS (triples) controlan el comportamiento de entrada / salida de la familia PIC16F. Si TRISB [0] se establece en 0, el pin RB0 / INT dará una salida baja y anulará el mecanismo de interrupción.

He perdido muchas horas en ese pequeño registro en el pasado.

    
respondido por el Kevin Moore

Lea otras preguntas en las etiquetas