RPI SPI8
Jump to navigation
Jump to search
Contents
8-Channel SPI Bus Multiplexer for the Raspberry Pi
- 8 SPI channels
- Connects to the SPI pins on the Raspberry Pi
- Supports SPI star or daisy-chain topologies - or a mix of both
- Daisy chain often used to get around the single Chip Select limitation (which this card addresses)
- 3.3V
- 50 mA limit from Raspberry Pi
- Card max current = 0.16 mA
SPI Star Topology
- MISO from all slaves are wired together
- MOSI, SCLK is sent out to all ports
- SS (Slave Select) is separate for each of the 7 ports
- A0-A2 lines from Raspberry Pi control the port number
From Practical EE: SPI Bus page:
In Star topology all the signals are split and routed to each slave in parallel, except chip select. Multiple chip select are used to select individual slave devices. More devices support this mode than daisy-chain.
An example of a part (MCP4231 Digital Pot) which supports this mode (p 31):
SPI Daisy-Chain Topology
Daisy-chain mode could also be used via external wiring.
- MOSI / MISO from all slaves are connected in series
- SCLK is sent out to all ports
- Individual (Slave Select) is separate for each daisy-chain
- A0-A2 lines from Raspberry Pi control the port number
Connectors
SPI Connectors
- Four of 2x6 right angle headers
- J3 = Ports 0,1
- J1 = Ports 4,5
- J4 = Ports 2,3
- J2 = Ports 0,1
- Pinouts (silkscreen marking)
- SPICE0 Channels[0-7] (marked )
- SPIMOSI (marked MO)
- SPIMISO (marked MI)
- SPISCK (marked CK)
- VCC (3.3V from Raspberry Pi) (marked +V)
- GND (marked GND)
40-Pin Raspberry Pi Connector
- Standard Raspberry Pi 40-pin connector
- SPI connections
- SPIMISO - GPIO IO_9 - Pin 21
- SPIMOSI - GPIO IO_10 - Pin 19
- SPISCK - GPIO IO_11 - Pin 23
- SPICE0 - GPIO IO_8 - Pin 24
- Three GPIO pins select SPI channel
- A0 - GPIO IO_22 - Pin 15
- A1 - GPIO IO_27 - Pin 13
- A2 - GPIO IO_17 - Pin 11
- BCM pin numbers
Schematics
- RPI_SPI8 Rev 2 Schematic
- RPI_SPI8 Rev 3 Schematic
- Rev 3 is same as Rev 2 (board has additional silkscreen minor updates)
Programming
Set the RPI_SPI8 mux channel number
- A0 - GPIO IO_22 - Pin 15
- A1 - GPIO IO_27 - Pin 13
- A2 - GPIO IO_17 - Pin 11
import RPi.GPIO as GPIO USING_RPI_SPI8_CARD = True if USING_RPI_SPI8_CARD: A0Pin = 15 A1Pin = 13 A2Pin = 11 GPIO.setmode(GPIO.BOARD) # Set the board mode to numbers pins by physical location GPIO.setup(A0Pin, GPIO.OUT) # A0 GPIO.setup(A1Pin, GPIO.OUT) # A1 GPIO.setup(A2Pin, GPIO.OUT) # A2 def set_RPI_SPI8_MuxPort(muxPort): if USING_RPI_SPI8_CARD: muxPort &= 0x7 if (muxPort & 1) == 1: GPIO.output(A0Pin, GPIO.HIGH) else: GPIO.output(A0Pin, GPIO.LOW) if (muxPort & 2) == 2: GPIO.output(A1Pin, GPIO.HIGH) else: GPIO.output(A1Pin, GPIO.LOW) if (muxPort & 4) == 4: GPIO.output(A2Pin, GPIO.HIGH) else: GPIO.output(A2Pin, GPIO.LOW) return
Do SPI transfer using spidev library
import spidev spi = spidev.SpiDev() spi.open(0, 0) # bus,device spi.max_speed_hz = 976000 # speed # write_pot(potNum,input) # potNum - 0,1 - the two pots on the SPI-POTX2 card # potVal = 0-127 - 7-bit pot value def write_pot(potNum,potVal): msb = (potNum & 1) << 4 lsb = potVal & 0x7F spi.xfer([msb, lsb])
Raspberry Pi Example Code
- Test SPI-POTX2 Dual pot card on the Raspberry Pi using RPI_SPI8 SPI mux card
- Makes triangle waves on the pot wiper pins
SPI Cables
RPI_SPI8 (Marking) | RPI_SPI8 Pin | SPI-POTX2 Pin | SPI-POTX2 Marking |
---|---|---|---|
Chip En (CE) | 1 | 5 | SS |
MOSI (MO) | 2 | 4 | MOSI |
MISO (MI) | 3 | 1 | MISO |
SPICK (CK) | 4 | 3 | SCK |
Vcc (+V) | 5 | 2 | +V |
GND | 6 | 6 | GND |
Combined Example Code
- MCP4231_SPI_Test.py - Our GitHub repo
- Based on
- Setup SPI on the Raspberry Pi
- MCP4151 Example Code
- MCP4151 example code - Stored in Github
- Modified as below for MCP4351 Digital Pot
#!/usr/bin/python # # MCP4231_SPI_Test.py # Test SPI-POTX2 card on the Raspberry Pi using RPI_SPI8 SPI mux card # Makes triangle waves # # Hardware # RPI_SPI8 SPI mux card Wiki page: # http://land-boards.com/blwiki/index.php?title=RPI_SPI8 # SPI-POTX2 Dual Digital Pot Wiki page: # http://land-boards.com/blwiki/index.php?title=SPI-POTX2 # # Software # Original mcp4151 (digital pot) code at # https://www.takaitra.com/mcp4151-digital-potentiometer-raspberry-pi/ # Setup SPI at # https://www.takaitra.com/spi-device-raspberry-pi/ # # Run with - # chmod +x MCP4231_SPI_Test.py # sudo ./MCP4231_SPI_Test.py import spidev import time import RPi.GPIO as GPIO # Set the next line to False if directly connecting to Raspberry Pi SPI bus USING_RPI_SPI8_CARD = True spi = spidev.SpiDev() spi.open(0, 0) # bus,device spi.max_speed_hz = 976000 # speed if USING_RPI_SPI8_CARD: A0Pin = 15 A1Pin = 13 A2Pin = 11 GPIO.setmode(GPIO.BOARD) # Set the board mode to numbers pins by physical location GPIO.setup(A0Pin, GPIO.OUT) # A0 GPIO.setup(A1Pin, GPIO.OUT) # A1 GPIO.setup(A2Pin, GPIO.OUT) # A2 def set_RPI_SPI8_MuxPort(muxPort): if USING_RPI_SPI8_CARD: muxPort &= 0x7 if (muxPort & 1) == 1: GPIO.output(A0Pin, GPIO.HIGH) else: GPIO.output(A0Pin, GPIO.LOW) if (muxPort & 2) == 2: GPIO.output(A1Pin, GPIO.HIGH) else: GPIO.output(A1Pin, GPIO.LOW) if (muxPort & 4) == 4: GPIO.output(A2Pin, GPIO.HIGH) else: GPIO.output(A2Pin, GPIO.LOW) return # write_pot(potNum,input) # potNum - 0,1 - the two pots on the SPI-POTX2 card # potVal = 0-127 - 7-bit pot value def write_pot(potNum,potVal): msb = (potNum & 1) << 4 lsb = potVal & 0x7F spi.xfer([msb, lsb]) # Test loop follows while True: for channelNum in range(0,8): set_RPI_SPI8_MuxPort(channelNum) for potNum in range(0,2): for i in range(0x00, 0x7F, 1): write_pot(potNum,i) # time.sleep(.001) for i in range(0x7F, 0x00, -1): write_pot(potNum,i) # time.sleep(.001)
Reference Docs
- Controlling an SPI device with the Raspberry Pi - Takaitra.com
- Controlling the MCP4151 Digital Potentiometer with the Raspberry Pi - Takaitra.com
- SPI on the Raspberry Pi
- Python pypi spidev
- Land Boards SPI Reference
Factory Test Procedure
- Use RPI_PSOC5 card to test UUT
- Simpler to use than Raspberry Pi
- Very short boot time
- Serial connection and menu driven test
- Verifies continuity/No shorts or opens
Hardware Setup
- RPI_PSOC5
- Raspberry Pi CPU Clone
- LED-TEST-2
- Uses 11 LEDs
- POWER-49MM
- Distribute grounds to LEDs
- Cable set
- 2x6 header plugs into pair of SPI ports
- 4 of 2x4 connectors attach to LED-TEST-2 card
- (8) CE (SS)
- MOSI
- MISO
- SCK
Run Tests
- Run puTTY
- Find COM Port in Device Manager
- 115,200 baud
- RTS/CTS flow control
- Hit ENTER to see menu
Land Boards, LLC - RPi Card Test Station 1 - Select RPP-UIO-16 Card 2 - Select RPPSOC Card 3 - Select RASPI-PLUS-GVS-CFG Card 4 - Select RASPI-GVS Card 5 - Select RASPI-PLUS-GVS Card 6 - Select RPI-I2C-HUB Card 7 - Select RPI_SPI8 Card R - Read EEPROM W - Write EEPROM B - Bounce LED across Card GPIOs T - Test Card D - Debug Card ? - Print this menu
- Select RPI_SPI8 Card by entering 7[ENTER]
7 Selected RPI_SPI8 card
Blink LEDs
- Enter B[ENTER]
B Blinking the RPI_SPI8 Card LEDs, please wait
- Bounces LEDs off across the LEDs
- 8 CE signals go low one at a time
- MOSI, MISO, SCK cycles one on at time
Test Software
- Runs on RPI_PSOC5
- GitHub repo
- Test_RPI_SPI8.c - Bounce LED across LED-TEST-2 card
RPI_PSOC5
The RPI_SPI8 can be used with the RPI_PSOC5 card
SPI Schematic
SPI Configuration
- 16-bit data
- MSB first
- Mode = 1,1
- 1 MHz
PSOC5 to BCM mapping
RPI-PSOC5 Test Station Software
- PSOC5 Software - GitHub repo
RPI_PSOC5 Test Timing
- Card Tester
- RPI_PSOC5 Tester
- PSOC5 C code
- Yellow = center tap if POT0 (GND/VCC shunts installed
- Cyan = Slave Select/Chip Select
Issues
Documents the revision history of the card
Rev 3
- Test Block changed marking on rear of card to "TEST"
- Added "REV 3" to rear silkscreen
- Expand SPI pin names on silkscreen
Rev 2
- Tested/working
- Fixed wiring issue from Rev 2
- Test Block marked as "TEST1"
Rev 1
- Cut etch between IC pins 5 and 6
- Add wire between IC pins 4 and 5