Comunicación SPI con PIC16F877A y CC1101

Buenas Gente del foro(y)
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.
cc1101 image (1).JPG
no se como seria la manera correcta de comunicar los modulos ya que puedo quemarlos estaba pensando en algo asi
1141-tutorial-como-conectar-un-dispositivo-33v-a-uno-de-5v.jpg
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
 

Adjuntos

  • CC1101_IcpdfCom_1210329.pdf
    979.7 KB · Visitas: 41
  • Comunicación SPI PIC 16F877A.pdf
    307 KB · Visitas: 48
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
 
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).
 
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
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
 

Adjuntos

  • W-CC1100 manual.pdf
    722 KB · Visitas: 114
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.
 
Última edición:
Gracias amigo y la señal del clock? sclk?

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:
TTL adaptador hc-06.jpg
cierto ahora encontre este otro mas
TTL hc-06.jpg

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
 
Última edición:
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)
 
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.
 
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
 
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.
 

Adjuntos

  • LogicConv.jpg
    LogicConv.jpg
    22 KB · Visitas: 52
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
 
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.
 
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
 
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.
 
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
comunicacion spi.jpg



(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 jajajacircuit.jpg 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
 

Adjuntos

  • spi.zip
    75.8 KB · Visitas: 33
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
 
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



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 :cry:ah mis dos pics estan funcionando correctamente ya los probe por las dudas probe todo
 
Última edición:
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
 

Adjuntos

  • Emisor.pdf
    49.2 KB · Visitas: 51
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
 
Última edición:
Atrás
Arriba