Autor Tema: Lectura SPI Hardware  (Leído 2517 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Pinolillo16

  • PIC18
  • ****
  • Mensajes: 324
Lectura SPI Hardware
« en: 29 de Diciembre de 2017, 04:19:41 »
Que tal colegas, espero me puedan orientar. Estoy trabajando con un PIC16F el MSSP con SPI como maestro. La transmisión de datos no le veo problema ya que lo he configurado y solo cargo el dato al SSPBUF espero a que complete la transmisión y listo.

El problema con el que me he encontrado radica en como leer un dato usando el puerto, he logrado tener lecturas usando SPI por software pero no es mi intención hacerlo así. Lei en el datasheet que solo tienes que testear BF del SSPSTAT y listo, pero no me anda. Estuve revisando algunos codigos ejemplo, y me confundi un poco mas ya que encontre uno donde para leer lo configuran como esclavo.

Entonces quiero saber si alguien me puede hechar una mano con algun ejemplo de como hacerlo?

Gracias

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Lectura SPI Hardware
« Respuesta #1 en: 29 de Diciembre de 2017, 12:41:31 »
Si el SPI es maestro entonces vos dictas el reloj de todo lo que este conectado, por ende para leer algo ( para que salga del receptor) debes enviar algo.

Para entenderle mejor no hay como una imagen:



Entonces vamos a suponer por ejemplo un ADC en SPI ( ADS7843 )
http://www.ti.com/lit/ds/symlink/ads7843.pdf (Pag 8 tenes el diagrama de tiempo de la comunicacion)

El formato de envio es 1 byte indicando inicio de conversion y cual a convertir, y luego tenes que recibir 2 bytes ( son 12bits repartido en 2 bytes).

Entonces desde el punto del SPI maestro deberia hacer lo siguiente:

- Enviar el byte para iniciar conversion.
- Finalizado el envio no darle importancia a lo que llego en SSPBUF
- Enviar "nada" ( 0x00 )
- Finalizado el envio, leer el SSPBUF que es donde voy a tener mi primer dato que me envia mi esclavo
- Enviar 0x00 de nuevo
- Finalizado el envio, leer la segunda parte que esta en SSPBUF

Lo que quiero decirte es que como MAESTRO sos quien controla cuando leer y cuando escribir, vos tenes control del reloj, y por ende si queres que el esclavo envie algo vos debes hacer correr ese reloj. Entonces tu indicador de cuando recibis algo es cuando terminaste de enviar tu dato.

Si tu PIC esta como ESCLAVO, vos no controlas el reloj entonces recien cuando el maestro envie los 8 pulsos de reloj se va a activar un bit para indicarte que ya tenes tu dato en el SPI.
Vuelvo a repetirlo y espero que en otra forma, en este caso, al no tener control de reloj, vos no sabes cuando es que recibiste algo, por ende necesitas que el modulo te avise cuando ocurrio.

Espero haber sido claro.. Y que ahora entiendas el SPI.
« Última modificación: 29 de Diciembre de 2017, 13:43:12 por KILLERJC »

Desconectado Pinolillo16

  • PIC18
  • ****
  • Mensajes: 324
Re:Lectura SPI Hardware
« Respuesta #2 en: 31 de Diciembre de 2017, 05:49:25 »
Gracia KillerJC. Si me quedo claro, la intención es implementar un SPI por hardware sin interrupciones. Estuve tratando de varias maneras y no logro conseguir nada. Este es mi código de transmisión:

Código: ASM
  1. TX_SPI
  2.     BANKSEL SSP1CON1
  3.     MOVWF   SSP1BUF
  4.     BCF     SSP1CON1,BF
  5.     NOP
  6.     BANKSEL PIR1
  7.     BTFSS   PIR1,SSP1IF
  8.     ;BTFSS   SSP1CON1,BF
  9.     GOTO    $-1
  10.     BCF     PIR1,SSP1IF
  11.     BANKSEL SSP1BUF
  12.     MOVF    SSP1BUF,W
  13.     BANKSEL PORTA
  14.     RETURN

Lei la hoja de especificaciones ya en repetidas ocasiones pero no logro poder leer el dato de entrada. Esta ultima rutina la saque de un ejemplo en C que hice para el mismo micro mediante la herramienta MCC. El ejemplo hecho es:

Código: C
  1. uint8_t SPI_Exchange8bit(uint8_t data)
  2. {
  3.     // Clear the Write Collision flag, to allow writing
  4.     SSP1CON1bits.WCOL = 0;
  5.  
  6.     SSP1BUF = data;
  7.  
  8.     while(SSP1STATbits.BF == SPI_RX_IN_PROGRESS)
  9.     {
  10.     }
  11.  
  12.     return (SSP1BUF);
  13. }

Mi objetivo es poder escribir una Micro SD. Pero por ahora no lo quiero hacer con FAT, solo el hex. Después de que comprenda trataré de hacerlo. Mientras tanto en la simulación si me da respuesta la micro SD pero me ha sido imposible poder leer el byte de regreso.

En una parte de la hoja de especificaciones dice que debo leer el SSP1BUF antes de escrbirlo, lo intente y tampoco me funciona. De que manera lo puedo hacer?

Si lo manejo mediante software si me queda claro pero deseo hacerlo con Hardware.

Espero que vos me puedan ayudar. El  micro usado es un PIC16F1707

Saludos

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Lectura SPI Hardware
« Respuesta #3 en: 31 de Diciembre de 2017, 11:45:30 »
Yo no veo "demasiado problema" al ver tu codigo, pero siguiendo los lineamientos del datasheet quedaria asi:

Código: ASM
  1. TX_SPI
  2.     BANKSEL SSP1CON1         ;Al banco 4, donde estan todos los del SPI
  3.     BCF     SSP1CON1, WCOL  ; Limpio cualquier colision que pueda haber ocurrido
  4.     MOVWF   SSP1BUF            ; Envio el dato
  5.     BTFSS   SSP1STAT,BF       ; Verifico el estado del BF y espero hasta que llegue el dato
  6.     GOTO    $-1
  7.     MOVF    SSP1BUF,W          ; Leo el valor SSP1BUF y lo pongo en W
  8.     BANKSEL PORTA               ; Nuevamente al banco 0
  9.     RETURN

Un par de cosas cambie.
- Agregue la limpieza de WCOL ( colision de escritura )
- Quite todo lo de las interrupciones, ya que si no lo usas estan desactivadas y por ende no importa si estan en 1 o en 0.
- el bit BF esta ene SSP1STAT y no en SSP1CON1, ademas es de solo lectura, por lo tanto no tiene sentido escribirlo.

Para cambiar si lo deseas.
- Podes tener un registro "BSR_TEMP" el cual puedas copiar el BSR y luego restablecerlo al final del codigo. De esta forma no importa en el banco que estuvieras vas a seguir estando en ese cuando salgas.

Citar
En una parte de la hoja de especificaciones dice que debo leer el SSP1BUF antes de escrbirlo, lo intente y tampoco me funciona. De que manera lo puedo hacer?

Lo lees cuando haces el SSP1BUF, W de alli en adelante solo queda como "leido"

Desconectado Pinolillo16

  • PIC18
  • ****
  • Mensajes: 324
Re:Lectura SPI Hardware
« Respuesta #4 en: 31 de Diciembre de 2017, 17:21:24 »
Nuevamente gracias KillerJC. Probe el codigo que me has compartido, y sigue haciendo lo mismo:

Código: ASM
  1. MOVLW    0XFF
  2.    CALL     TX_SPI
  3.    ;MOVF     DATA_IN,W
  4.    SUBLW    0X01
  5.    BTFSC    STATUS,Z
  6.    GOTO     CMDX1

Cuando transmito, la rutina TX_SPI regresa con el valor SSP1BUF en W. La micro SD me responde con 0x01. Que es lo que trato de comparar, pero no puedo lograr la lectura. Que estara pasando?

Gracias

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Lectura SPI Hardware
« Respuesta #5 en: 31 de Diciembre de 2017, 17:41:10 »
Mientras tanto en la simulación si me da respuesta la micro SD pero me ha sido imposible poder leer el byte de regreso.

La pregunta que tengo yo es... en la simulacion el dato va correctamente y es el PIC quien no lo recibe? o tampoco la SD envia correctamente el dato?

---------------------

Por otro lado estas enviando 0xFF.... No pertenece a ningun comando, y parece que estas en la parte de inicializacion de la SD ( luego del primer Reset -CMD0- y su argumento, esperando el 0x01 )
« Última modificación: 31 de Diciembre de 2017, 18:39:40 por KILLERJC »