Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
Muy buenas, hoy en un rato me ha dado por probar unas cosillas con mi placa pinguino y la verdad... llevo ya 3 horas y aún no he conseguido hacer lo que quería. Básicamente no soy capaz de acceder a los bits de los registros que están definidos en el fichero pic18f2550.h, por ejemplovoid spi_hw_init(char mode0, char mode1, char role){
SSPCON1Bits.SSPEN=0;
SSPCON1Bits.CKP = mode0&0x01;
SSPSTATBits.CKE = (~mode1)&0x01;
SSPCON1 = SSPCON1&(role&0x07);
if(role <= MASTER_FOSC_T2)
pinmode(SCK, OUTPUT);
else
pinmode(SCK, INPUT);
pinmode(SDI, INPUT);
pinmode(SDO, OUTPUT);
if(role == SLAVE_SS)
pinmode(SS, OUTPUT);
SSPCON1Bits.SSPEN = 1;
}
Me da estos errores:C:/pinguino/tools/bin/../include/pic16/spihwlib.c:34: error 25: Structure/Union expected left of '.->'
C:/pinguino/tools/bin/../include/pic16/spihwlib.c:36: error 20: Undefined identifier 'SSPCON1Bits'
C:/pinguino/tools/bin/../include/pic16/spihwlib.c:36: error 25: Structure/Union expected left of '.->'
C:/pinguino/tools/bin/../include/pic16/spihwlib.c:37: error 20: Undefined identifier 'SSPSTATBits'
C:/pinguino/tools/bin/../include/pic16/spihwlib.c:37: error 25: Structure/Union expected left of '.->'
C:/pinguino/tools/bin/../include/pic16/spihwlib.c:49: error 20: Undefined identifier 'SSPCON1Bits'
C:/pinguino/tools/bin/../include/pic16/spihwlib.c:49: error 25: Structure/Union expected left of '.->'
Error mientras compila archivoC:pinguinomyLibsSPIv1
Estoy haciéndolo todo como si fuese una librería, es decir, tengo mi .c y mi .h en el directorio tools/include/pic16/. El fichero .h es así:/**
* SPI Hardware library for pinguino project
*
* Author: Francisco J. Sánchez Rivas (FJ_Sanchez)
* fran [at] mipixel [dot] com
*
*/
#ifndef __SPIHWLIB_H__
#define __SPIHWLIB_H__
/* link the I/O library */
#pragma library io
#include <pic18fregs.h>
#include <digitalw.c>
#define SDI 0
#define SDO 9
#define SCK 1
#define SS 17
#define MASTER 0x00
#define MASTER_FOSC_4 0x00
#define MASTER_FOSC_16 0x01
#define MASTER_FOSC_64 0x02
#define MASTER_FOSC_T2 0x03
#define SLAVE 0x04
#define SLAVE_SS 0x05
#define FALLING 0x01
#define RISING 0x00
#endif /* __SPIHWLIB_H__ */
Y el fichero .c así:/**
* SPI Hardware library for pinguino project
*
* Author: Francisco J. Sánchez Rivas (FJ_Sanchez)
* fran [at] mipixel [dot] com
*
*/
#ifndef __SPIHWLIB_H__
#include <spihwlib.h>
#endif
/**
* This function initializes the SPI hardware configuring polarity and edge
* of transition using Standard SPI Mode Terminology
*
* Mode0,Mode1 CKP CKE
* 0,0 0 1
* 0,1 0 0
* 1,0 1 1
* 1,1 1 0
*
* Also is possible to use LOW or HIGH for mode0 to indicate the idle state
* clock level, and RISING or FALLING to indicate when the transmit should
* take place.
*
* The role param could be any of MASTER, MASTER_FOSC_4, MASTER_FOSC_16,
* MASTER_FOSC_64, SLAVE or SLAVE_SS, where MASTER_FOSC_X indicates the SPI
* clock speed used. If you want to use the /SS pin in slave mode you should
* initialize the SPI using SLAVE_SS.
*/
void spi_hw_init(char mode0, char mode1, char role){
SSPCON1Bits.SSPEN=0;
SSPCON1Bits.CKP = mode0&0x01;
SSPSTATBits.CKE = (~mode1)&0x01;
SSPCON1 = SSPCON1&(role&0x07);
if(role <= MASTER_FOSC_T2)
pinmode(SCK, OUTPUT);
else
pinmode(SCK, INPUT);
pinmode(SDI, INPUT);
pinmode(SDO, OUTPUT);
if(role == SLAVE_SS)
pinmode(SS, OUTPUT);
SSPCON1Bits.SSPEN = 1;
}
char spi_hw_write(char c) {
char aux;
//PIR1Bits.SSPIF = 0;
aux = SSPBUF;
SSPBUF = c;
//while(PIR1.Bits.SSPIF == 0);
c = SSPBUF;
return c;
}
char spi_hw_read(void) {
return spi_hw_write(0x00);
}
Las cosas que hay comentadas en el .c es para que no haya tantos errores a la salida. La verdad empiezo a desesperarme, pretendía hacer una librería SPI hardware para pinguino, pero por momentos se me van quitando las ganas...
Vale, estoy echo un animal... el problema está en que es "XXXXbits" con minúsculas... siempre me pasan cosas así, jeje.