Hola a todos
Estoy empezando con el bus SPI, así que decidi comenzar comunicando un integrado MCP23S08 con un 18f4550.
Se supone que debería ser un ejemplo muy sencillo para comenzar a familiarizarme con el bus SPI, el caso es que mi ejemplo no funciona en absoluto.
Le he dado varias vueltas y he realizado diferentes pruebas y no consigo comunicación.
Utilizo el SPI hardware con la librería SPI.h, realizando las siguientes conexiones:
18f4550.SDO -> MCP23S08.SI
18f4550.SDA -> MCP23S08.SO
18f4550.SCK -> MCP23S08.SCK
18f4550.CS -> MCP23S08.RB2
Adjunto código:
# include<p18f4550.h>
# include<delays.h>
# include<spi.h>
//# pragma config FOSC = INTOSCIO_EC
# pragma config MCLRE = OFF
# pragma config WDT = OFF
# pragma config LVP = OFF
// ZONA DE LOS DEFINES ///////////////////////////////////////////////////
# define MCP23S08_W_ADRESS 0X40
# define MCP23S08_R_ADRESS 0X41
# define SPI_CS PORTBbits.RB2
# define TRIS_SPI_CS TRISBbits.TRISB2
# define CS_MCP23S08 TRISCbits.RC7
//////////////////////////////////////////////////////////////////////////
// VARIABLES GLOBALES ////////////////////////////////////////////////////
unsigned char var;
char dataSend; // datos a enviar por SPI
char dataReceive; // datos a recibir por SPI
//////////////////////////////////////////////////////////////////////////
void main(){
// INICIALIZACIÓN DE VARIABLES ///////////////////////////////////////
dataSend = 25;
dataReceive = 0;
//////////////////////////////////////////////////////////////////////
// CONFIGURACIÓN DE I/O //////////////////////////////////////////////
ADCON1 = 0X0F; // Configuramos todos los puertos como I/O digitales
TRIS_SPI_CS = 0; // El pin correspondiente al chip select del SPI, queda como salida
TRISB = 0; // El PORTB0, controla el Slave Input del bus SPI
//////////////////////////////////////////////////////////////////////
// CONFIGURACIÓN SPI /////////////////////////////////////////////////
//CloseSPI();
SPI_CS = 0;
OpenSPI(SPI_FOSC_4, MODE_11, SMPMID);
//////////////////////////////////////////////////////////////////////
while(1){
SPI_CS = 0;
WriteSPI(MCP23S08_W_ADRESS); // Indicamos al MCP23S08 que vamos a realizar una escritura
Nop();
WriteSPI(0x00); // Indicamos que escribiremos en la dirección de memoria del TRIS del MCP
Nop();
WriteSPI(0x00); // Todo el tris pasa a ser SALIDAS.
Nop();
SPI_CS = 1;
SPI_CS = 0;
WriteSPI(MCP23S08_W_ADRESS); // Indicamos al MCP23S08 que vamos a realizar una escritura
Nop();
WriteSPI(0x09); // Indicamos que escribiremos en la dirección de memoria del TRIS del MCP
Nop();
SPI_CS = 0;
WriteSPI(0xF0); // MEDIO PUERTO ON, MEDIO PUERTO OFF
Nop();
SPI_CS = 1;
}
CloseSPI(); // termina la comunicación serie.
}