Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

03/07/2013 #1

Avatar de fife89

Comunicación SPI con PIC16F877A y CC1101
Buenas Gente del foro
me decidi por comprarme dos modulos RF para comunicar dos pics 16f877A
estoy comenzando en esto de la comunicacion spi estuve leyendo información del foro sobre esto y en realidad me surgieron dudas al respecto
este caso en particular no lo encontre asi que presento mi duda
Este modulo es un de comunicacion spi basado en el circuito CC1100 DE TI y funciona en 3.3v el micro a utilizar es 5v 16f877A.

no se como seria la manera correcta de comunicar los modulos ya que puedo quemarlos estaba pensando en algo asi

de igual manera no estoy seguro.
adjunto la hoja de datos de el CI y de el modulo armado
la otra duda es la manera de coneccion de este modulo al micro se supone que uno debe ser master y el otro slave tengo ciertas dudas por ejemplo cual es el SDO y el SDI en el modulo
voy a realizar el codigo en PBP
pienso usar un codigo ejemplo de la web para probar
04/07/2013 #2

Avatar de Daniel Meza

Existen interfaces adaptadoras de niveles de 3.3V a 5V; es cuestión de buscar (este tema ya se ha tratado el foro), otra alternativa (rápida y barata) es hacer una interfaz con divisores de voltaje para reducir los 5V de tu PIC al voltaje adecuado para el módulo RF.
Paraello solo sustituye la conexión de R15 y R14 por GND en lugar de 3.3 volts. EL valor de las R tiene que ir adecuado de tal manera que al tener 5V como uno lógico de salida del PIC garantices un nivel alto que puede interpretar el módulo de 3.3V, es el mismo caso para un 0 lógico
04/07/2013 #3

Avatar de Ardogan

MISO = master input slave output -> conectar a SDI del pic
MOSI = master output slave input -> conectar a SDO del pic

Ya hay muchos temas sobre conversión de 3.3V a 5V, tu caso es de conversión de 5V a 3.3V.
Para la pata MISO de los módulos (que se conecta al SDI del pic) no debería haber problema, no hace falta conversión (en la imagen lo conectaste directo, coincido).
04/07/2013 #4

Avatar de fife89

Muchas gracias por sus respuestas las aprecio mucho
si se que hay varios divisores resistivos y ese fue el que encontre, en particular me gustaria saber si ese me sirve en la configuracion para mi modulo, ya que es transceiver,
Bueno y en la configuracion de pines
Ardogan dijo: Ver Mensaje
MISO = master input slave output -> conectar a SDI del pic
MOSI = master output slave input -> conectar a SDO del pic
Ardogan para el modulo hay: SI SCLK SO GDO2 GDO0 CSn
yo ya sabia lo de miso y mosi que significan pero particularmente no se donde lo conecto en el modulo
Archivos Adjuntos
Tipo de Archivo: pdf W-CC1100 manual.pdf (722,0 KB (Kilobytes), 99 visitas)
04/07/2013 #5

Avatar de Ardogan

fife89 dijo: Ver Mensaje
Ardogan para el modulo hay: SI SCLK SO GDO2 GDO0 CSn
yo ya sabia lo de miso y mosi que significan pero particularmente no se donde lo conecto en el modulo
Perdón no me había fijado en la hoja de datos del módulo

pata SO del módulo = MISO -> conectar a SDI del pic
pata SI del módulo = MOSI -> conectar a SDO del pic
pata CSn del módulo -> conectar a una pata cualquiera del pic
pata SCLK del módulo -> conectar a pata SCK del pic

GDO2, GDO0 deben ser configurables, para usarlas como líneas de interrupción al pic o como un puerto uart.
04/07/2013 #6

Avatar de fife89

Gracias amigo y la señal del clock? sclk?

Daniel Meza dijo: Ver Mensaje
Paraello solo sustituye la conexión de R15 y R14 por GND en lugar de 3.3 volts. EL valor de las R tiene que ir adecuado de tal manera que al tener 5V como uno lógico de salida del PIC garantices un nivel alto que puede interpretar el módulo de 3.3V, es el mismo caso para un 0 lógico
seria algo como asi:

cierto ahora encontre este otro mas


teniendo en cuenta las prestaciones de el modulo y su velocidad de transferencia cual seria el mas recomendado,
esto seria para transmitir datos , ahora para recivir y para el SCLK,
al momento de conectar el modulo al slave los niveles logicos ttl 3.3v seran reconocidos por el otro 16f877a
Imágenes Adjuntas
Tipo de Archivo: jpg TTL adaptador hc-06.jpg (11,2 KB (Kilobytes), 205 visitas)
Tipo de Archivo: jpg TTL hc-06.jpg (28,6 KB (Kilobytes), 200 visitas)
04/07/2013 #7

Avatar de Daniel Meza

Para el convertidor de 5V a 3.3V el divisor de tensión está bien. Para el caso contrario puedes usar el circuito que propones o en experimentar sin interfaz (algunos circuitos de 5V toman un nivel alto desde menos de 3.3V)
05/07/2013 #8


Hola, Yo trabaje con unos modulos similares RFM70 y toleraban 5V en las lineas I/O, ahora viendo el manual del CC1100 solo operan a 3.3v. Pienso que añadir mas circuito para cambiar la logica no es muy practico y por ello trataria de buscar el PIC16LF877A que trabaja a 3.3v.

La otra opcion es que utlizes el PIC16F887, este PIC es compatible y es el que se recomienda para nuevos diseños, ademas es mucho mas barato y puedes emplear el oscilador interno. Si ves en el manual y las especificaciones electricas veras que puede trabajar a 3.3v hasta los 10MHz.

En fin solo es una opinion particular, tambien realize el cambio de logica empelando transitores, el divisor no es muy conveniente porque incrementa el consumo de corriente y en algunos casos afecta a la velocidad de comunicacion.
06/07/2013 #9

Avatar de fife89

pabloz dijo: Ver Mensaje
Hola, Yo trabaje con unos modulos similares RFM70 y toleraban 5V en las lineas I/O, ahora viendo el manual del CC1100 solo operan a 3.3v. Pienso que añadir mas circuito para cambiar la logica no es muy practico y por ello trataria de buscar el PIC16LF877A que trabaja a 3.3v.

La otra opcion es que utlizes el PIC16F887, este PIC es compatible y es el que se recomienda para nuevos diseños, ademas es mucho mas barato y puedes emplear el oscilador interno. Si ves en el manual y las especificaciones electricas veras que puede trabajar a 3.3v hasta los 10MHz.

En fin solo es una opinion particular, tambien realize el cambio de logica empelando transitores, el divisor no es muy conveniente porque incrementa el consumo de corriente y en algunos casos afecta a la velocidad de comunicacion.
Gracias amigo esa podría ser una solución pero hay un problema y es que tengo un 16f877a tqfp montado ya en un circuito con los pines de spi libres. que en este caso seria el master.
por casualidad no podrás ayudarme con un código de spi en pic basic? es que encontré uno en el foro y lo monte en una entrenadora y el slave en una board sin los módulos con conexión de cables y en realidad no funciono no hubo comunicación.
alguien podría pasarme un codigo ejemplo y un sch para montarlo en una tarjeta de desarrollo y probarlo ? asi podría aprender a hacer la comunicación spi
Muchas Gracias
06/07/2013 #10


Entonces no hay opcion. Yo utilze divisor con resistencias de 1.8k y 3.3k para los pines SDO, CLK y CS del PIC en cuanto al pin de entrada SDI no fue necesario hacer la conversion(3V a 5V) si observas el manual el pin RC3(SPI) el voltaje minimo para VIH es 0.7VDD o sea unos 3.5V.
Tambien puedes emplear un buffer bidireccional 74LXX245 es mucho mejor que usar resistencias.

No tengo ejemplos en PICBasic, solo en C. pero podria servirte del algo.

//CONFIGURACION MSSP MODE SPI A 1MHz FOSC=16MHz PIC12F1822
SSP1CON1 = 0b00000001; //SPI modo master FOSC/16 -> (16MHz/16) = 1MHz
SSP1CON1bits.CKP = 0; //Configura el estado idle del clock
SSP1CON1bits.SSPEN = 1; //Activa el modulo MSSP

char SPIRead( void ) //Lectura de un byte
{
SSP1BUF = 0x00; // Inicia el ciclo de lectura
while ( !SSP1STATbits.BF); // Espera que se complete
return ( SSP1BUF ); // Retorna el byte
}

char SPIWrite( char data ) //Envio de un byte
{
SSPBUF = data; //Escribe el byte en el buffer
if ( SSP1CON1bits.WCOL ) // Verifica si hay colision
return ( -1 ); // retorna negativo si hay colision
else
{
while( !SSP1STATbits.BF ); // Espera que se complete el ciclo
}
return ( 0 ); // Retorna 0 si no hay error#
}

Para hacer la lectura y envio se debe activar previamente la salida CS del pic.
Imágenes Adjuntas
Tipo de Archivo: jpg LogicConv.jpg (22,0 KB (Kilobytes), 46 visitas)
07/07/2013 #11

Avatar de fife89

Amigo el pin Cs como funciona? hay que enviarle un nivel alto? un nivel bajo ? yo no estoy conectando ese pin y no me esta funcionando nada
07/07/2013 #12


Se activa con 0V, Si no utilizas el PIN CS, asegúrate que este en 0V. Ya que este señal habilita el dispositivo SPI con el que harás la comunicación.
07/07/2013 #13

Avatar de Daniel Meza

Saludos. La línea CS es una salida (modo SPI maestro) para indicar al esclavo que se enviarán datos, algo así como un WR. O una entrada en modo esclavo (opcional) que le indica al PIC que se están enviando datos hacia él. Para tu caso este pin puede dejarse libre ya que los módulos Rx/Tx no tienen este pin. Recuerdo tener unos códigos para unos emisores RF que trabajan igual bajo el bus SPI, si manejas algo de ASM te los puedo pasar
07/07/2013 #14


Hola Daniel Meza. Yo también la verdad no se físicamente la disposición del este módulo , pero en el manual del CD1101 se ve que si están presentes las cuatro líneas que tene un dispositivo SPI
SI, SCLK, SO, CSn Con el módulo que yo trabaje si era necesario activar esta entrada.
Saludos.
08/07/2013 #15

Avatar de fife89

Hola gracias por responder, la verdad no he intentado de nuevo me estaba dando un aire para no frustrarme jajajaja, mas tarde le doy otra vez.
pues de la variedad de veces que he intentado nunca conecte el pin cs, segun un codigo ejemplo que vi en diferentes paginas nunca mencionaron nada del cs , aqui en el foro en la pagina 11 de el tutorial de pbp hay una simulacion y un codigo de spi entre dos pics con los respectivos hex para montar, hice ese montaje en la tarjeta de desarrollo el master y en una protoboard el slave, tampoco se ve conectado el pin cs y pues la simulacion (pero nunca me fio de las simulaciones) para mi sorpresa no sirvio (ojo tampoco use los modulos de radiofrecuencia solo intente una comunicacion spi cableada para luego hacerlo inalambrico) no conecte el pin cs tampoco me sorprendio que esto no funcionara.
me queda una duda por resolver y es la siguiente. el master lleva un osc externo puede ser de 4mhz cib dos ceramicos de 33pf por decir , el slave tambien se debe configurar como osc externo de 4mhz? y utilizar los 2 ceramicos de 33pf? o configurar el osc como iterno, yo estoy configurando los fuses asi, estoy mal?
master y slave
Código:
@ DEVICE PIC16F877A   ;Seleccion del Microcontrolador PIC16F877A
@ DEVICE xt_OSC       ;Seleccion del Tipo de oscilador XT de Cristal
@ DEVICE WDT_Off      ;Seleccion del Watchdog Timer Apagado
@ DEVICE PWRT_On     ;Seleccion del Power-on Reset Apagado
@ DEVICE BOD_Off      ;Seleccion del Brown-out Reset Apagado
@ DEVICE LVP_OFF      ;Seleccion del Low-Voltage Programming Apagado
@ DEVICE WRT_OFF      ;Seleccion del Flash Program Memory Write Apagado
@ DEVICE DEBUG_OFF    ;Seleccion del In-Circuit Debugger Apagado
@ DEVICE CPD_OFF      ;Seleccion del Data EEPROM Memory Code Protection Apagado
@ DEVICE PROTECT_Off  ;Seleccion del Flash Program Memory Code Protection Apagado
define osc 4
dejo adjunto la simulacion el esquema y los hex




(el rs232 si lo manejo bien) monte tambien este convertidor rs232 a spi y los modulos y tampco me funciono me tiene loco este tema jajaja use un divisor para los 3.3 v y para el sck y un diodo para 3.3 a 5v en el out del 3,3
Saludos
Imágenes Adjuntas
Tipo de Archivo: jpg comunicacion spi.jpg (142,9 KB (Kilobytes), 176 visitas)
Tipo de Archivo: jpg circuit.jpg (52,9 KB (Kilobytes), 175 visitas)
Archivos Adjuntos
Tipo de Archivo: zip spi.zip (75,8 KB (Kilobytes), 26 visitas)
08/07/2013 #16

Avatar de Daniel Meza

En el modo SPI el maestro es el que controla la señal de reloj para enviar y recibir datos por lo tanto ambos micros pueden trabajar a frecuencias distintas.

Te dejo un par de subrutinas, una para leer un byte y otra para recibirlo desde el bus SPI, están hechas en .ASM pero al menos la idea te darán.

Código:
SPI_Lee									;Lee el dato direccionado por SPIADD

	bcf			PIR1,SSPIF				;Borra bandera de interrución del bus SPI
	bcf			SEL						;Selecciona el módulo Tx
	movf		SPIADD,W				;Obtiene dirección de lectura
	movwf		SSPBUF					;Y la envía al bus SPI
	btfss		PIR1,SSPIF				
	goto		$-.1					;Espera a que finalice el envío
	movf		SSPBUF,W
	bcf			PIR1,SSPIF				;Reestablece bandera de interrupción del bus SPI
	clrw
	movwf		SSPBUF
	btfss		PIR1,SSPIF
	goto		$-.1
	movf		SSPBUF,W				;Obtiene byte leido
	movwf		SPIDAT					;y lo respalda almacena en el registro de recepción
	bsf			SEL						;Deselecciona el módulo TX
	return								;Retorno de la subrutina
	
SPI_Esc									;Escribe el dato contenido en "SPIDAT" en la dirección apuntada por "SPIADD"

	bsf			SPIADD,.7				;Bit 7 de la dirección es puesto a 1 (Operación de escritura)
	bcf			PIR1,SSPIF				;Borra bandera de interrución del bus SPI
	bcf			SEL						;Selecciona el módulo Tx
	movf		SPIADD,W				;Obtiene dirección de lectura
	movwf		SSPBUF					;Y la envía al bus SPI
	btfss		PIR1,SSPIF				
	goto		$-.1					;Espera a que finalice el envío
	bcf			PIR1,SSPIF				;Reestablece bandera de interrupción del bus SPI
	movf		SPIDAT,W				;Obtiene dato a escribir
	movwf		SSPBUF					;Y la envía al bus SPI
	btfss		PIR1,SSPIF			
	goto		$-.1					;Espera a que finalice el envío
	bsf			SEL						;Deselecciona el módulo TX
	call		Espera_10ms				;Tiempo de espera
	return								;Retorno de la subrutina
08/07/2013 #17

Avatar de fife89

Daniel Meza dijo: Ver Mensaje
En el modo SPI el maestro es el que controla la señal de reloj para enviar y recibir datos por lo tanto ambos micros pueden trabajar a frecuencias distintas.

Te dejo un par de subrutinas, una para leer un byte y otra para recibirlo desde el bus SPI, están hechas en .ASM pero al menos la idea te darán.

Código:
SPI_Lee									;Lee el dato direccionado por SPIADD

	bcf			PIR1,SSPIF				;Borra bandera de interrución del bus SPI
	bcf			SEL						;Selecciona el módulo Tx
	movf		SPIADD,W				;Obtiene dirección de lectura
	movwf		SSPBUF					;Y la envía al bus SPI
	btfss		PIR1,SSPIF				
	goto		$-.1					;Espera a que finalice el envío
	movf		SSPBUF,W
	bcf			PIR1,SSPIF				;Reestablece bandera de interrupción del bus SPI
	clrw
	movwf		SSPBUF
	btfss		PIR1,SSPIF
	goto		$-.1
	movf		SSPBUF,W				;Obtiene byte leido
	movwf		SPIDAT					;y lo respalda almacena en el registro de recepción
	bsf			SEL						;Deselecciona el módulo TX
	return								;Retorno de la subrutina
	
SPI_Esc									;Escribe el dato contenido en "SPIDAT" en la dirección apuntada por "SPIADD"

	bsf			SPIADD,.7				;Bit 7 de la dirección es puesto a 1 (Operación de escritura)
	bcf			PIR1,SSPIF				;Borra bandera de interrución del bus SPI
	bcf			SEL						;Selecciona el módulo Tx
	movf		SPIADD,W				;Obtiene dirección de lectura
	movwf		SSPBUF					;Y la envía al bus SPI
	btfss		PIR1,SSPIF				
	goto		$-.1					;Espera a que finalice el envío
	bcf			PIR1,SSPIF				;Reestablece bandera de interrupción del bus SPI
	movf		SPIDAT,W				;Obtiene dato a escribir
	movwf		SSPBUF					;Y la envía al bus SPI
	btfss		PIR1,SSPIF			
	goto		$-.1					;Espera a que finalice el envío
	bsf			SEL						;Deselecciona el módulo TX
	call		Espera_10ms				;Tiempo de espera
	return								;Retorno de la subrutina
Muchas gracias, amigo pero tengo un problema y es que no entiendo mucho asm. solos lo basico, podrias ayudarme con un esquema ? y los hex configurados con los fuses si noe s mucha molestia
no he tenido la oportunidad de probar ni si los modulos funcionan correctamente o si tengo que hacer algo mas para que comuniquen quiero probarlos asi sea que el master encienda un led por spi, algo simple para probar, por que si no los logro hacer funcionar los devuelvo y me compro unos mas programables como un xbee o algo asi mas conocido que esos si los he manejado
Muchisimas gracias

---------- Actualizado después de 5 minutos ----------

ah probe nuevamente la comunicacion con el codigo del foro probe enviandole un cero a ss del slave y no funciono, probe enviandole un 1 al ss del slave y nada ah mis dos pics estan funcionando correctamente ya los probe por las dudas probe todo
08/07/2013 #18

Avatar de Daniel Meza

Los fuses en nada afectan la operación del transmisor, un cristal de unos 4MHz será suficiente. Te dejo el diagrama donde probé esas rutinas. Allí se pueden observar los divisores de tensión para la interfaz de 5V-3.3V
Archivos Adjuntos
Tipo de Archivo: pdf Emisor.pdf (49,2 KB (Kilobytes), 45 visitas)
09/07/2013 #19

Avatar de fife89

ya realize una comunicacion spi anoche entre los dos micros solo bastaba con mandar un nivel bajo al ss del salve pero fue mediante cableado, intente utilizando los modulos inalambricos y no funciono hable con el distriuidor y me dijo que tenia que enviar algunos registros para que funcionara dijo que era algo parecido a la comunicacion con un reloj en tiempo real que los registros estaban en la hoja de datos pero estos registros estan es para arduino
ademas agrego que yo programo es en pic basic pro
que puedo hacer
los archivos ya estan adjuntos en la hoja de datos que tiene 95 hojas
09/07/2013 #20

Avatar de Daniel Meza

Temía eso, los módulos que también utilicé tenían una secuencia de inicialización. Lo que puedes hacer es solicitar al distribuidor algunos ejemplos de inicialización para el Tx como para el Rx.
Para los módulos que tengo están unos ejemplos en la red, de igual forma tienen bastantes registros, te dejo los ejemplos para que te orientes (y pruebes, con suerte y funcionan).

http://www.robodacta.mx/images/RF31_receive_DEMO.pdf

http://www.robodacta.mx/images/RF43_transmit_DEMO.pdf
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.