2017-03-03 4 views
1

16 개의 아날로그 센서로 구성된 프로젝트를 수행 중이며 ADC 유형 tlc2543m에 연결된 SPI를 통해 데이터를 수집하고 있습니다. 아이디어는 Python을 사용하여 SPI로 획득하는 것입니다 인텔 갈릴레오, 즉 갈릴레오의 리눅스에서 프로그래밍 중이며 마치 서버 인 것처럼 ETH에서 통신합니다. 사실 이것은 내 코드입니다 :하지만 나는 이상한 데이터만을 얻습니다. 이미 ADC의 데이터 시트를 읽었습니다. 어쨌든두고 봅니다.인텔 갈릴레오 및 tlc2543m을 사용하는 SPI on Python

MRAA 라이브러리를 사용하여 파이썬에서 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 Datasheet

답변

0

나는 이미 그것은 작동했다. "write"함수를 사용하는 대신 "writeByte"함수를 사용하십시오. 모든 것에 감사드립니다 !!

# 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) 
: 어쨌든

나는이 경우에 나는 IntelGalileo GEN1 및 ADC 유형 tlc2543m을 사용하여, 파이썬으로 SPI 통신의 또 다른 예를 남겨