Scooter
Cascarrabias crónico
Pues estoy conectando un conversor AD a la raspi por el puerto SPI y parece ser que no han pensado, no saben o no entienden, que el puerto SPI ES fullduplex.
A lo mejor soy yo que se me escapa algo.
He buscado en las librerías pero todo indica que el funcionamiento es siempre haf duplex, he enchufado el analizador lógico y así es como funciona.
¿Alguien sabe como usarlo o hay que pasar del hardware SPI y hacerlo mediante bitbang. "A mano" sé como hacerlo pero me da cosa. Me parece una cutrería.
El chip el el MCP 3208 de los que tengo varios que me quedaron de un proyecto de hace años.
Tutorial de uso del SPI:
Maunal de la librería de python:
El problema es que la transferencia se realiza en tres bytes.
Durante el primero y el segundo el master hace la petición de que y como quiere leer en el conversor AD; un bis d start, un bit de si es o no diferencial y tres bits que selecionan la entrada. Solo que los dos últimos bits se envían en el segundo byte.
En el segundo y tercer byte responde el conversor.
Así que en el segundo habla el master y habla el slave.
El código no va de ninguna forma; mirando con un analizador lógico si se envían tres bytes se ve que el conversor responde la lectura. Pero es respuesta se pierde. Tras eso si se solicitan uno o dos bytes con spi.readbytes no contesta ya.
Yo pensaba que spi.readbytes sacaba del buffer lo que se había recibido MIENTRAS se envían bytes, pero no, si pides dos bytes no los saca del buffer, los saca del bus en donde no hay nada porque el conversor ya respondió.
A lo mejor soy yo que se me escapa algo.
He buscado en las librerías pero todo indica que el funcionamiento es siempre haf duplex, he enchufado el analizador lógico y así es como funciona.
¿Alguien sabe como usarlo o hay que pasar del hardware SPI y hacerlo mediante bitbang. "A mano" sé como hacerlo pero me da cosa. Me parece una cutrería.
El chip el el MCP 3208 de los que tengo varios que me quedaron de un proyecto de hace años.
Tutorial de uso del SPI:
Maunal de la librería de python:
Python:
# AD_spi.py
#
# Programa para la lectura de un conversor AD SPI mcp3208
# Conectado al CE0
#
import time
import spidev
# Solo tenemos disponible el bus0 en la Pi
bus = 0
#Device es el pin chip select pin. CE0 o CE1
device = 0
# Enable SPI
spi = spidev.SpiDev()
# Open a connection to a specific bus and device (chip select pin)
spi.open(bus, device)
# Set SPI speed and mode
spi.max_speed_hz = 10000
spi.mode = 0
#spi.no_cs = True
# Seleccionar el pin
# Los bints van: xxxxx[Start(1)][SGL/Diff][D2] [D1][D0]xxxxxx
# Seleccionamos la entrada 0
msg0 = 0x06
msg1 = 0x00
msg2 = 0x00
msg = [msg0,msg1,msg2]
#spi.xfer2(msg0)
spi.xfer2(msg)
resultado = spi.readbytes(1)
print(resultado)
#Hay que manejar el CS a mano y escribir y leer dos bytes sin parar CS
El problema es que la transferencia se realiza en tres bytes.
Durante el primero y el segundo el master hace la petición de que y como quiere leer en el conversor AD; un bis d start, un bit de si es o no diferencial y tres bits que selecionan la entrada. Solo que los dos últimos bits se envían en el segundo byte.
En el segundo y tercer byte responde el conversor.
Así que en el segundo habla el master y habla el slave.
El código no va de ninguna forma; mirando con un analizador lógico si se envían tres bytes se ve que el conversor responde la lectura. Pero es respuesta se pierde. Tras eso si se solicitan uno o dos bytes con spi.readbytes no contesta ya.
Yo pensaba que spi.readbytes sacaba del buffer lo que se había recibido MIENTRAS se envían bytes, pero no, si pides dos bytes no los saca del buffer, los saca del bus en donde no hay nada porque el conversor ya respondió.
Adjuntos
Última edición: