Hallo zusammen,
vor ein paar Tagen habe ich mich mit ein paar lustigen ICs beschäftigt. Einer davon ist der MCP 3208-CI/P. Es handelt sich dabei um einen 12-Bit-A/D-Wandler mit SPI, 8 Kanälen in einem formschönen DIL-16-Gehäuse.
Mit folgendem Programm, das ich in den nächsten Tagen in meine GPIO-Library integrieren werde, kann der A/D-Wandler ausgelesen werden.
#include GPIO
$define Kanal 0 # Welcher der 8 Pins des MCP 3208-CI/P soll angesteuert werden? Möglich: 0 bis 7 (Pin 1 bis 8 des MCP 3208)
$define SCLK 11 # GPIO 11 auf dem Raspberry Pi (P1-23) für Serial Clock
$define MOSI 10 # GPIO 10 auf dem Raspberry Pi (P1-19) für MOSI (Master Out Slave In)
$define MISO 9 # GPIO 9 auf dem Raspberry Pi (P1-21) für MISO (Master In Slave Out)
$define CS 8 # GPIO 8 auf dem Raspberry Pi (P1-24) für CS Chip Select = Chip Enable)
$define BITS 12 # Anzahl der auszulesenden Bits
$define warten 500 # Verzögerung zwischen zwei Durchläufen
procedure readAnalogSPI(kanal, sclk, mosi, miso, cs, bits)
GPIO(cs, 1) # fallende Flanke
GPIO(cs, 0)
GPIO(sclk, 0)
kommando := kanal | 2r00011000 # Bit 3 und 4 setzen
every i := 0 to 5 do
{ if kommando & 2r00010000 then GPIO(mosi, 1) # Bit 4 prüfen
else GPIO(mosi, 0)
GPIO(sclk, 1)
GPIO(sclk, 0)
kommando <<:= 1 # Bitfolge um 1 Position nach links schieben
}
wert := 0
every i := 0 to bits - 1 do
{ GPIO(sclk, 1)
GPIO(sclk, 0)
wert <<:= 1 # Bitfolge um 1 Position nach links schieben
if GPIO(miso) = 1 then wert |:= 2r00000001 # Bit 0 setzen
}
return wert
end
proedure main()
repeat
{ write(readAnalogSPI(Kanal, SLCK, MOSI, MISO, BITS))
}
end
Alles anzeigen
Das Interessante ist, dass die SPI-Funktionalität mit jeder beliebigen Kombination für die Zuweisung von GPIO-Pins zu MISO, MOSI, SCLK und CS erreicht wird. Es ist also nicht erforderlich, die im üblichen GPIO-Pin-Layout für die SPI-Schnittstelle angegebenen GPIO-Pins für SCLK, MOSI, MISO und CS bzw. CE zu verwenden. Dies bestätigt mich darin, dass die GPIO-Pins standardmäßig alle eine identische Funktionalität aufweisen. Lediglich die Software inkl. Bibliotheken sorgen für spezielle Funktionalität, die letztlich immer darauf basiert, dass GPIO-Pins als Eingang gesetzt oder als Ausgang mit HIGH oder LOW belegt werden.
Somit kann ein Entwickler "seine" bevorzugten oder für das Auslesen dieses oder eines anderen SPI-fähigen Bausteins freien GPIO-Pins selber festlegen.
Das Programm funktioniert auch für MCP 3204-CI/P, wenn man im Programm berücksichtigt, dass dieser Baustein nur 4 Kanäle besitzt.
Beste Grüße und viel Spaß damit!
Andreas