TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: yopicuo en 15 de Abril de 2010, 10:02:51
-
Hola, estoy intentando comunicar un transmisor de la casa nordic el nRF24L01+ (http://www.nordicsemi.com/index.cfm?obj=product&act=display&pro=89#) con el pic 18F2450 mediante SPI. El principal reto es implementar el módulo SPI en el pic mediante software, ya que ese modelo no lo trae de serie en hardware.
Les paso el código que estoy empleando:
#include <18F2450.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV2,VREGEN
#use delay (clock=48000000)
// Configuracion para SPI modo software.
#USE SPI(MASTER,DI=PIN_B1,DO=PIN_B2,CLK=PIN_B3,ENABLE=PIN_B5,BITS=8,LSB_FIRST)
#include <usb_cdc.h>
/*Definición de pines de conexión PIC-NRF*/
#define CE PIN_B5 //Definición de Chip Enable PIN
#define nSEL PIN_B4 //Deficición PIN nSEL (chip select)
#define SCK PIN_B3 //Deficición PIN SCK
#define MOSI PIN_B2 //Deficición PIN MOSI
#define MISO PIN_B1 //Deficición PIN MISO
#define nIRQ PIN_B0 //Definición PIN nIRQ
//Definiciones
#define SET_nSEL ( OUTPUT_HIGH (nSEL) )
#define CLR_nSEL ( OUTPUT_LOW (nSEL) )
/*Definición de Registros del nRF*/
#define CONFIG 0x00
#define STATUS 0x07
/*Definición de Modos del nRF*/
#define POWER_DOWN 0x7C
/*Definición de Comandos del nRF*/
#define R_REGISTER 0x00
#define W_REGISTER 0x20
#define NOP 0xFF
void main()
{
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_CLOCK_DIV_2|ADC_TAD_MUL_0);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
int8 datout=0,datoin=0,i;
/*Configuración del SPI PIC*/
setup_spi(SPI_MASTER|SPI_H_TO_L|SPI_CLK_DIV_4);
set_tris_b (0xC3);
usb_cdc_init();
usb_init();
while(!usb_cdc_connected()) {}
do{
usb_task();
if (usb_enumerated()){
printf(usb_cdc_putc,"\n\r Valor a mantar: 0x7C --> 124\r\n");
datout=0x7C;
CLR_nSEL;
spi_write(W_REGISTER|CONFIG);
if(datout!=NOP){spi_write(datout);}
delay_cycles(2);
datoin=spi_read(R_REGISTER|STATUS);
printf(usb_cdc_putc,"\n\r Valor a recibido: %u",datoin);
SET_nSEL;
}
}
While (TRUE);
}
El principal problema que tengo es que no compila.. me dice que los identificadores SPI_read(), SPI_write() y setup_SPI(), no han sido identificados.
Si algun@ ha trabajado antes con el nrf24l01 y los pics, le agradecería que me ayudara con este asuntillo.
Bueno un saludo y gracias.
-
¿No se si te estoy entendiendo bien?.
Estas diciendo que intentas usar SPI en un micro que no lo lleva incluido por Hardware.
Si es así, es normal que las funciones que intentas utilizar no existan ya que las que el compilador tiene no sirven porno sabe porque para ese micro no sabe lo que tiene que hacer.
Por eso te las tendrás que crear tu mismo con tu propio codigo.
-
Puedes usar una de las que define El compilador y adaptarla a tus necesidades. pr ejemplo el de la memoria 9356C que es spi y incluye 2 librerías una spi y otra sin léela y la modificas según tus necesidades.
9356C.c ->directo.
9356spi.c ->spi hardware.
las dos se incluyen en los devices del CCs.
-
Puedes implementar el SPI por software basándote en este ejemplo:
http://jumptuck.wordpress.com/2008/11/16/3595-lcd-hello-world/
Es simplemente desplazar bits a través de un pin.
A esta técnica se le llama bit-banging.
Otro ejemplo:
http://en.wikipedia.org/wiki/Bit-banging
-
Gracias a todos por responder..
voy a probar primero con las librerías del 9356C, a ver si consigo que funcione... y ya después, si la cosa no avanza, me pondré con los ejemplos que ha propuesto migsantiago..
Un saludo y gracias por la ayuda.
-
Saludos a todos, y escribo por que veo que ya no hay más, ni se ven soluciones o algo así sobre el módulo nRFL24L01, quisiera saber si yopicuo, pudiste hecharlo a andar?? o ya no?? o que resultados obtuviste??, gracias.