Moin zusammen,
ich habe ein Waveshare High-Precision AD/DA Board gekauft, um ein Analogsignal (0-2V) zu digitalisieren und zu messen. Auf der Platine ist ein Texas Instruments ADS1256 Chip (Datenblatt) verbaut. Mit dem vom Hersteller zur Verfügung gestellten Beispiel-Programm werden auch Werte ausgegeben. Das Programm ist allerdings in C geschrieben, was ich erstens höchstens radebrechend kann und zweitens brauche ich die Messwerte in Java, d.h. per Pi4J. Trotz sehr viel Herumsuchens und Herumprobierens gelingt es mir einfach nicht, irgendwelche Daten von dem Chip zu bekommen. Immer nur "0".
Kann mir vielleicht einer von euch auf die Sprünge helfen? Es kann eigentlich nur eine Kleinigkeit sein. Ich nehme an, dass irgendwelche Initialisierungs-Werte fehlen oder ein Modus gesetzt werden muss oder so ähnlich. Mit SPI oder auch mit irgendeiner Art der Hardware-Programmierung hatte ich bislang noch nicht zu tun.
Meine Quellen:
- Das Waveshare-Beispiel (s.o.)
- Eine offenbar angefangene Python-Portierung davon (die aber leider auch nicht funktioniert)
- Ein Java-Beispiel, dass sich aber auf den MCP3008 bezieht und den SPI manuell einstellt, gehört zu diesem Tutorial
- Das Pi4J-SPI-Beispiel, dass sich ebenfalls auf den MCP3008 bezieht
- Ein Kommandozeilen-Tool mit dem ich versucht habe, das SPI ganz low level zu nutzen (sudo ./spincl -ib -m1 -c10s1 -p0 -ie 2 0x10 0x00), das aber überhaupt keine Ausgabe macht
Das Minimum, das ich zum Loslegen als funktionierendes Beispiel suche, um zu sehen, dass der Zugriff in Java funktioniert, ist das Auslesen der Chip-ID aus dem STATUS-Register per RREG-Kommando. Es muss "3" rauskommen, das geht in C, aber nicht einmal in der Python-Portierung, dort wird immer nur "0" ausgegeben.
Hier mal der Code:
import com.pi4j.io.spi.SpiChannel;
import com.pi4j.io.spi.SpiDevice;
import com.pi4j.io.spi.SpiFactory;
import com.pi4j.io.spi.SpiMode;
import com.pi4j.util.Console;
import java.io.IOException;
public class SpiExample {
private enum ADS1256_register_addresses
{
REG_STATUS(0),
REG_MUX(1),
REG_ADCON(2),
REG_DRATE(3),
REG_IO(4),
REG_OFC0(5),
REG_OFC1(6),
REG_OFC2(7),
REG_FSC0(8),
REG_FSC1(9),
REG_FSC2(10);
private short reg;
ADS1256_register_addresses(int regNum)
{
this.reg = (short) regNum;
}
public short reg() { return this.reg; }
}
private enum ADS1256_commands
{
CMD_WAKEUP(0x00),
CMD_RDATA (0x01),
CMD_RDATAC(0x03),
CMD_SDATAC(0x0F),
CMD_RREG(0x10),
CMD_WREG(0x50),
CMD_SELFCAL(0xF0),
CMD_SELFOCAL(0xF1),
CMD_SELFGCAL(0xF2),
CMD_SYSOCAL(0xF3),
CMD_SYSGCAL(0xF4),
CMD_SYNC(0xFC),
CMD_STANDBY(0xFD),
CMD_RESET(0xFE);
private short cmd;
ADS1256_commands(int cmdNum)
{
this.cmd = (short) cmdNum;
}
public short cmd() { return this.cmd; }
}
public static SpiDevice spi = null;
protected static final Console console = new Console();
public static byte ADS1256_ReadReg(short register) throws IOException {
byte data[] = new byte[] {
(byte)(ADS1256_commands.CMD_RREG.cmd() | register ),
(byte) 0x01 // number of registers to read
};
byte[] result = spi.write(data);
console.print(" len="+result.length+" ");
console.print("0="+result[0]+" ");
console.print("1="+result[1]+" ");
return result[1];
}
public static int getID() throws IOException {
byte id = ADS1256_ReadReg(ADS1256_register_addresses.REG_STATUS.reg());
return (id >> 4);
// return id;
}
public static void main(String args[]) throws InterruptedException, IOException {
spi = SpiFactory.getInstance(SpiChannel.CS0,
244000,
SpiMode.MODE_1);
while(console.isRunning()) {
console.print(getID());
Thread.sleep(1000);
}
}
}
Alles anzeigen
Mich überrascht sehr, dass ich zu dem Chip und dem Board kaum Threads oder Code im Netz finden konnte, obwohl das eigentlich so praktische Hardware zu sein scheint.
Für jeden Tipp oder Hinweis bin ich sehr dankbar!
Cheers,
Hanno
Noch eine kleine Anmerkung: Die älteren Beispiele scheinen die SPI-Kommunikation manuell aufzubauen (Pins einzeln setzen etc.), ich würde aber gerne die etwas schönere Pi4J SPI-API nutzen.
PS:
Hier mal eine Beispielausgabe von dem C-Programm (auch um zu zeigen, dass SPI an sich geht):