# Modo master en comunicacion SPI



## lacth (Ago 22, 2005)

Necesito saber si al micro 16F876 lo utilizo como master en modo SPI, se puede usar el pin RA5 (chip select) como de proposito general (I/O)???.Gracias.- 8)


----------



## Raflex (Ago 27, 2005)

Hola, estube dandole una checada a la hoja de datos y para el modo master no dice nada de ese pin, asi que lo mas probable es que si puedas utilizarlo para otra aplicacion, tendrias que hacer pruebas.


----------



## maunix (Nov 25, 2005)

lacth dijo:
			
		

> Necesito saber si al micro 16F876 lo utilizo como master en modo SPI, se puede usar el pin RA5 (chip select) como de proposito general (I/O)???.Gracias.- 8)



Es un tema viejo pero para dejarlo como 'historial' en el foro.

Si utilizas el modo SPI del MASTER, el pin RA5 pasa a ser de propósito general.  Lo puedes usar como entrada/salida.

Si utilizas el SPI SLAVE mode, entonces,  ese pin hará que tu pic 'reciba/transmita' datos cuando el pin esté en bajo y deje de recibir al ponerse en alto.  

Estando en modo master, si el pin RA5 está como entrada no afectará que esté en BAJO o ALTO, el pic transmitirá de acuerdo a lo que el software le vaya diciendo .


----------



## Gregory (Abr 22, 2009)

hola que tal .. alguien tiene información sobre los distintos protocolos de comunicacion serial ..rs-232 i2c spi rs-485


----------



## Gregory (May 24, 2009)

hola que tal estoy haciendo un programa en assembler donde comunico dos esclavos con un pic master, quien sabe como configurar los bit sspcon<3:0> para cada pic


----------



## Ardogan (May 24, 2009)

¿Que PIC es?


----------



## Gregory (May 26, 2009)

todos son pic 16f877 ya termine el programa pero de un master a un esclavo , ahora quiero enviar información distinta 2 los 2 eclavos no se como configurar el chip/select para seleccinar un esclavo a la vez


----------



## Ardogan (May 26, 2009)

Bien. Para mandar información desde el pic maestro hasta los esclavos lo más sencillo es usar las entradas SS (slave select, selección de esclavo) de los pics esclavos.

Estoy pensando en una conexión física como la que adjunto en la imagen.

El pic maestro puede usar dos salidas cualesquiera para activar (*) las líneas de esclavo.
Entonces para mandar(recibir) un byte a(de) unos de los esclavos se activa la línea de esclavo correspondiente, se carga el dato en SSPBUF y al cargarlo se transmite automáticamente (si el módulo habilitado claro: SSPEN=1).

Por el lado del esclavo, tiene que tener el módulo habilitado y configurado en modo esclavo (con el control por el pin SS habilitado). Uno no tiene que hacer nada en especial para recibir, ni bien el maestro manda el dato automáticamente guarda los datos en SSPBUF a la par que envía al maestro el contenido previamente cargado en ese registro. No está muy  claro, ¿no?.

A ver si lo puedo explicar mejor...
Antes de que el maestro inicie la transmisión el esclavo debe tener escrito en SSPBUF (llamemoslo SSPBUF_e la e por esclavo) el valor a enviar. Por ejemplo supongamos que enviamos un valor 0xF0.
Luego el maestro inicio la transmisión escribiendo en su propio SSPBUF (SSPBUF_m), digamos que escribe 0X1A.
Entonces al final de la transmisión será SSPBUF_e=0x1A y SSPBUF_m = 0xF0.

Luego de la transferencia el maestro debe leer el valor que recibió en SSPBUF y copiarlo a la memoria ram (en una variable cualquiera) para no destruir el valor que recibió.
Idénticamente para el esclavo.

Ambos PIC's pueden darse cuenta de que finalizó la transmisión testeando el bit SSPIF (o se puede hacer automáticamente usando interrupciones).

Bueno, entonces volviendo a tu pregunta, se pueden usar dos salidas cualesquiera del pic maestro para manejar las lineas de esclavo de los dos esclavos.

Saludos.
-----------------------------------------------
(*): con activar me refiero a poner en 0 la salida del maestro. Cuidado!, nunca poner 0 en ambas salidas de selección de esclavo a la vez, sino los dos esclavos van a intentar usar la línea de transmisión hacia el maestro al mismo tiempo y se puede hacer un corto.


----------



## Gregory (May 27, 2009)

ok gracias por responder, lo estoy haciendo de esta manera , estoy testeando un bit donde esta conectado un pulsador cuando hay 1  envio al esclavo 1 y cuando hay o envio al esclavo 2....las subrutinas de envios para cada esclavo comienzan colocando a cero la linea que va conectanda al pin ra5 del esclavo que va a recibir y a uno la otra ...osea es algo asi
bsf ptox,x  y el esclavo que va a recibir es bcf ptox,x pero no me esta funcionando


----------



## Ardogan (May 27, 2009)

Si el esclavo tiene habilitado el control por la línea SS, en el esclavo no es necesario ejecutar ninguna instrucción para empezar a recibir (siempre que el módulo spi esté habilitado y configurado correctamente).
¿Como configuraste los esclavos? (valores de los registros correspondientes)


----------



## Gregory (May 27, 2009)

movlw b'00110100'
movwf  sspcon
movlw  b'00000000'
movwf  sspstat


----------



## Ardogan (May 27, 2009)

Conviene que no enciendas el módulo hasta que lo tengas configurado, es decir, hacer primero

movlw b'00010100'; todavía no enciendo el módulo (SPEN=0)
movwf sspcon
movlw b'00000000'
movwf sspstat 
bsf SSPCON, SPEN; ahora sí que está todo configurado enciendo el módulo

Otro motivo por el cual puede fallar es que no tengas los registros TRIS bien configurados: 

pata SDI como entrada
pata SDO como salida
pata de reloj como entrada si es esclavo, y como salida si es maestro
pata SS como entrada si es esclavo, cuidado también hay que ver los registros del CAD para que este trabajando como pata digital y no analógica
A ver como te va...


----------



## Gregory (May 28, 2009)

ok muchas gracias voy a intentar a ver que pasa


----------



## Gregory (Jun 4, 2009)

que tal ardogan gracias a dios ya me dio la comunicacion spi . tus respuestas fueron de mucha ayuda ,ahora tengo que hacer lo mismo pero via i2c ...tengo algunas dudas de como guardar la direccion de cada esclavo esta tiene que ser de 7bits con que me puedes ayudar sera que tienes algunas subrutinas por ahi


----------



## Ardogan (Jun 4, 2009)

Ja, ahi vas muerto porque nunca trabaje con i2c.
Igualmente, en tu lugar lo primero que haría sería ver que librerías hay disponibles (hay para asm, para C, no deberías tener problemas) y ver algún ejemplo de uso.
Saludos


----------



## Gregory (Jun 4, 2009)

ok gracias tranquilo


----------



## Gregory (Jun 7, 2009)

que tal ardogan, una pregunta con respecto a spi ...necesito hacer un circuito que me permita seleccionar un esclavo a la vez con que me puedes ayudar...gracias


----------



## Ardogan (Jun 7, 2009)

Proponé algo primero de tu parte (como lo harías?) y después lo hablamos


----------



## Gregory (Jun 7, 2009)

estoy pensando colocar un pic 16f84 que envia por un pin el 0 para el esclavo seleccionado  y un 1 para los demas que me dices .. si tienes otra cosa mejor
te lo agradeceria


----------



## Ardogan (Jun 8, 2009)

La selección de esclavos si o sí la debe manejar el maestro spi.

Pueden ser una línea del pic maestro para cada esclavo (sería el esquema que puse arriba). Es lo más fácil, hay que tener cuidado en el programa del PIC de poner a 0 solo una salida de selección de esclavo a la vez.

Con una sola línea de maestro por cada dos esclavos: (si en el circuito hay una compuerta inversora libre) usar una compuerta not, o nand, o nor. Si no hay un chip con compuertas lógicas para ocupar menos espacio se puede usar un transistor y un par de resistencias. Incluso se puede hacer el negador con un operacional en modo comparador con histéresis, o con un comparador analógico.

Con n líneas de maestro para 2^n esclavos: usar un demultiplexor, o un decodificador.

En fin, formas hay las que quieras. Dependerá de cuantos esclavos haya, que patas disponibles tenga el maestro, y que componentes se usan en el resto del circuito (por si quedan recursos sin usar se pueden utilizar para esto).


----------



## Gregory (Jun 9, 2009)

no existe una forma de colocar una sola linea de maestro, para 4 esclavos porq estoy pensndo a futuro y la meta es tener minimo 4 o 5 esclavos conectados  al bus ...gracias por las respuestas


----------



## Ardogan (Jun 9, 2009)

Bueno, esa es una desventaja de SPI, el precisar una línea de selección para cada esclavo.

Ojo eh?, algunos módulos SPI empiezan a venir con detección de dirección; es decir, leen el primer dato del bus SPI como dirección, la comparan con una interna, y de ser así toman la línea MISO = SDO del esclavo = SDI del maestro. Esa característica se puede usar con dispositivos que permitan deshabilitar la línea de salida (dejarla en alta impedancia) pero pueden seguir escuchando lo que viene por MOSI = SDO del maestro = SDI del esclavo.
El dspic30f4011 por ejemplo incorpora un bit de control DISSDO que puede usarse con esa finalidad.

Lo único que se me ocurre para minimizar al máximo las entradas/salidas de los microcontroladores (tanto esclavos como maestros) sin complicar mucho la cosa (sin meter demasiados componentes externos), sería usar un registro de desplazamiento para seleccionar esclavos.
Va a tener la particularidad de que solo 1 de las salidas puede valer 0 en cualquier momento. Así que pensando en esa característica lo que mejor encajaría sería un contador jhonson.

Un integrado que implementa un contador Jhonson es el 74hc4017.

Bueno, creo que usar un contador Jhonson puede ser una buena alternativa. Ahí con una sola salida del maestro podrías manejar hasta 10 líneas de esclavos.

Saludos


----------



## Gregory (Jun 10, 2009)

ok muchas gracias voy analizar lo que me dijistes y ya vere...bastante agradecido


----------

