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!