TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: raquena en 27 de Marzo de 2013, 10:08:44
-
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.
}
-
Hola! Simulaste en proteus como para ver que estas haciendo? O sea, si se configuro el puerto SPI, velocidad, datos, etc..
Saludos!
-
Se supone que el SPI funciona (correctamente o no, esa es otra historia).
He aquí la foto de la simulación con la sonda SPI conectada:
(http://www.raquena.com/images/simspi.jpg)
-
El reset esta a GND, esta desactivado :roll:
-
Estoy tonto... Se nota que necesitaba unas vacaciones.
-
Bueno... Sigo con algunos problemillas, ahora la escritura de datos funciona correctamente, pero parece que la lectura sigue sin funcionar...
CUelgo el código nuevo:
Este es el MCP23S08.h
#ifndef MCP23S08_H
#define MCP23S08_H
# define MCP23S08_W_ADRESS 0X40
# define MCP23S08_R_ADRESS 0X41
// PIN DEL MICRO AL QUE ESTARÁ CONECTADO EL CHIP SELECT DEL MCP
# define MCP23S08_CS PORTBbits.RB2
# define MCP23S08_CS_TRIS TRISBbits.TRISB2
void WriteMCP23S08(char address, char data);
char ReadMCP23S08(char adress);
Este el MCP23S08.c
void WriteMCP23S08(char address, char data){
MCP23S08_CS = 0;
WriteSPI(MCP23S08_W_ADRESS); // Indicamos al MCP23S08 que vamos a realizar una ESCRITURA
WriteSPI(address); // Indicamos el registro que vamos a escribir
WriteSPI(data); // Todo el tris pasa a ser SALIDAS.
MCP23S08_CS = 1;
}
char ReadMCP23S08(char address){
char data = 0;
MCP23S08_CS = 0;
WriteSPI(MCP23S08_R_ADRESS); // Indicamos al MCP23S08 que vamos a realizar una LECTURA
WriteSPI(address); // Indicamos el registro que vamos a leer
data = ReadSPI(); // Obtenemos el valor del registro seleccionado
MCP23S08_CS = 1;
return(data);
}
Y esto todo lo que ha quedado del main:
WriteMCP23S08(0x00,0x00); // Todos los pines del MCP como salidas
while(1){
char i;
for(i = 0; i <= 0x0A; i++){
WriteMCP23S08(0x09,i);
rcv = ReadMCP23S08(0x09);
}
}
CloseSPI(); // termina la comunicación serie.
Seguro que es algo tan ridículo como lo de antes...
-
Porque dices que no funciona? Cual es el error?
-
Conforme está escrito el programa, el dato leído debería ir variando entre 0 y 10, el caso es que la escritura se produce correctamente porque se encienden los pines correctos del MCP, pero luego cuando quiero leer los datos del MCP, siempre recibo el caracter 'o' en lugar del valor correspondiente.