我正在做一个由16个模拟传感器组成的项目,并且我正在通过连接到ADC类型TLC2543M的SPI获取数据,其想法是使用SPI使用SPI获取它们Intel Galileo,也就是说,我正在伽利略的Linux编程,我通过ETH进行交流,就好像它是服务器一样。事实是这是我的代码:但是我只会得到奇怪的数据。我已经阅读了ADC的数据表,无论如何我都会留下。
如何使用MRAA库从Python编程SPI通信???
代码:
#This Python file uses the following encoding: utf-8
import os, sys
#Configure ports of SPI protocol
import mraa
import time
spi=mraa.Spi(0)
#spi.mode(mraa.SPI_MODE3)
spi.mode(0)
spi.frequency(20000000)
spi.lsbmode(False)
ss=mraa.Gpio(9)
ss.dir(mraa.DIR_OUT)
ss.write(1)
sc=mraa.Gpio(8)
sc.dir(mraa.DIR_OUT)
sc.write(1)
def readadc(pinaleer,ss):
#primera configuracion
direccionaleer=0x0c
resp=0x00
segundobyte=0x00
valordigital=0x00
pinaleer=int(hex(pinaleer),16)
direccionaleer = direccionaleer | (pinaleer<<4) #guardo en los primeros 4 bits la direccion a leer
#direccionaleer = (direccionaleer<<8)
#print hex(dieccionaleer)
ss.write(1) #Enciendo la transferencia de datos
resp=spi.write(bytearray(hex(direccionaleer))) #Le digo que pin quiero leer
otra=spi.write(bytearray(0x00))#hex(direccionaleer))) #le mando ceros, ya acabé
ss.write(0) #Apago la transferencia de datos
time.sleep(0.0002) #Espero 20us
ss.write(0)#Enciedo la transferencia de datos
primerbyte=spi.write(bytearray(0x0000)) #Leo el primer byte de respuesta
segundobyte=spi.write(bytearray(0x00)) #Leo el segundo byte, total 2Byte= 16bits de repuesta
ss.write(1)#Apago la transferencia de datos
salida1= (resp[3]<<8)|(resp[2])#<<4)|(resp[1])
salida= (salida1>>4)+1
return salida
d=0
while d<5:
#d+=1
dato1 = readadc(1,ss)
dato2 = readadc(2,ss)
dato3 = readadc(3,ss)
dato4 = readadc(4,ss)
dato5 = readadc(5,ss)
dato6 = readadc(6,ss)
dato7 = readadc(7,ss)
dato8 = readadc(8,ss)
dato9 = readadc(9,ss)
dato10= readadc(10,ss)
dato11= readadc(11,ss)
dato12= readadc(12,ss)
dato13= readadc(13,ss)
#print "Dato recibido:"
print (dato1, dato2, dato3, dato4, dato5, dato6, dato7, dato8, dato9, dato10, dato11, dato12, dato13)
TLV2543数据表
我已经使它起作用了。而不是使用"写入"功能,而是使用" WriteByte"函数,感谢所有内容!
无论如何,我留下了Python的SPI通信的另一个例子,在这种情况下,我使用Intelgalileo Gen1和ADC类型TLC2543M:
# This Python file uses the following encoding: utf-8
import os, sys
import mraa
import time
spi=mraa.Spi(0) #Bus comunication
spi.mode(mraa.SPI_MODE0) #Comunication MODE0
spi.frequency(2000000) #Frequency of 2MHz
spi.lsbmode(False) #Format data MSB
ss=mraa.Gpio(8) #wire CS
ss.dir(mraa.DIR_OUT)
ss.write(1)
def readadc(pinaleer,ss):
dieccionaleer=0x0c #Input c=1100 so Output data length 16bits, MSB first, Unipolar
pinaleer=int(hex(pinaleer),16) #address bits (4)
dieccionaleer = dieccionaleer | (pinaleer<<4) #Put address bit in the 4th bits
#Comunication
ss.write(0) #CS=0 <-- Enables the device
esc=spi.writeByte(dieccionaleer) #First byte with input info
esc2=spi.writeByte(0x00) #Complete the 16bits --> Clock
ss.write(1) #CS=1 <--- Disables the device
time.sleep(0.00020) #Wait more time than 10us= time conversion AD
ss.write(0) #CS=0 <-- Enables the device
primerbyte=spi.writeByte(0x00) #First byte with 8bit of information
segundobyte=spi.writeByte(0x00) #Second byte with 4bit (MSB) information , 8+4=12bits
ss.write(1) #CS=1 <--- Disables the device
salida1=0x0000
salida1=salida1 | (primerbyte << 8)
salida1=salida1 | (segundobyte)
salida = (salida1>>4)+1 #Output 12bits
return salida
d=0
while d<5:
#d+=1
dato1 = readadc(1,ss)
dato2 = readadc(2,ss)
dato3 = readadc(3,ss)
dato4 = readadc(4,ss)
dato5 = readadc(5,ss)
dato6 = readadc(6,ss)
dato7 = readadc(7,ss)
dato8 = readadc(8,ss)
dato9 = readadc(9,ss)
dato10= readadc(10,ss)
dato11= readadc(11,ss) #pin Test (Vref+ - Vref-) /2 =~ 2048
dato12= readadc(12,ss) #pin Test Vref- 0000
dato13= readadc(13,ss) #pin Test Vref+ 4096
print (dato1, dato2, dato3, dato4, dato5, dato6, dato7, dato8, dato9, dato10, dato11, dato12, dato13)