odroid.c1.SpiExample Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of pi4j-example Show documentation
Show all versions of pi4j-example Show documentation
Pi4J Java Examples using the Pi4J Library
package odroid.c1;
/*
* #%L
* **********************************************************************
* ORGANIZATION : Pi4J
* PROJECT : Pi4J :: Java Examples
* FILENAME : SpiExample.java
*
* This file is part of the Pi4J project. More information about
* this project can be found here: http://www.pi4j.com/
* **********************************************************************
* %%
* Copyright (C) 2012 - 2016 Pi4J
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Lesser Public License for more details.
*
* You should have received a copy of the GNU General Lesser Public
* License along with this program. If not, see
* .
* #L%
*/
import com.pi4j.io.spi.SpiChannel;
import com.pi4j.io.spi.SpiDevice;
import com.pi4j.io.spi.SpiFactory;
import com.pi4j.platform.Platform;
import com.pi4j.platform.PlatformAlreadyAssignedException;
import com.pi4j.platform.PlatformManager;
import com.pi4j.util.Console;
import java.io.IOException;
/**
* This example code demonstrates how to perform basic SPI communications using the Odroid C1/C1+.
* Only CS0 (chip-select) is supported for SPI0 out of the box.
*
* Don't forget to load the SPI kernel modules to provide access to device "/dev/spidev0.0"
* > sudo modprobe spicc
* > sudo modprobe spidev
*
* @author Robert Savage
*/
public class SpiExample {
// SPI device
public static SpiDevice spi = null;
// ADC channel count
public static short ADC_CHANNEL_COUNT = 8; // MCP3004=4, MCP3008=8
// create Pi4J console wrapper/helper
// (This is a utility class to abstract some of the boilerplate code)
protected static final Console console = new Console();
public static void main(String args[]) throws InterruptedException, IOException, PlatformAlreadyAssignedException {
// ####################################################################
//
// since we are not using the default Raspberry Pi platform, we should
// explicitly assign the platform as the Odroid platform.
//
// ####################################################################
PlatformManager.setPlatform(Platform.ODROID);
// print program title/header
console.title("<-- The Pi4J Project -->", "SPI test program using MCP3004/MCP3008 AtoD Chip");
// allow for user to exit program using CTRL-C
console.promptForExit();
// This SPI example is using the Pi4J SPI interface to communicate with
// the SPI hardware interface connected to a MCP3004/MCP3008 AtoD Chip.
//
// Please note the following command are required to enable the SPI driver on
// your Odroid C1/C1+:
// > sudo modprobe spicc
// > sudo modprobe spidev
//
// see this blog post for additional details on SPI and WiringPi
// http://wiringpi.com/reference/spi-library/
//
// see the link below for the data sheet on the MCP3004/MCP3008 chip:
// http://ww1.microchip.com/downloads/en/DeviceDoc/21294E.pdf
// create SPI object instance for SPI for communication
spi = SpiFactory.getInstance(SpiChannel.CS0,
SpiDevice.DEFAULT_SPI_SPEED, // default spi speed 1 MHz
SpiDevice.DEFAULT_SPI_MODE); // default spi mode 0
// !! ATTENTION !! The Odroid implementation of WiringPi does not currently support
// SPI modes other than 0 (zero).
// continue running program until user exits using CTRL-C
while(console.isRunning()) {
read();
Thread.sleep(1000);
}
console.emptyLine();
}
/**
* Read data via SPI bus from MCP3002 chip.
* @throws IOException
*/
public static void read() throws IOException, InterruptedException {
for(short channel = 0; channel < ADC_CHANNEL_COUNT; channel++){
int conversion_value = getConversionValue(channel);
console.print(String.format(" | %04d", conversion_value)); // print 4 digits with leading zeros
}
console.print(" |\r");
Thread.sleep(250);
}
/**
* Communicate to the ADC chip via SPI to get single-ended conversion value for a specified channel.
* @param channel analog input channel on ADC chip
* @return conversion value for specified analog input channel
* @throws IOException
*/
public static int getConversionValue(short channel) throws IOException {
// create a data buffer and initialize a conversion request payload
byte data[] = new byte[] {
(byte) 0b00000001, // first byte, start bit
(byte)(0b10000000 |( ((channel & 7) << 4))), // second byte transmitted -> (SGL/DIF = 1, D2=D1=D0=0)
(byte) 0b00000000 // third byte transmitted....don't care
};
// send conversion request to ADC chip via SPI channel
byte[] result = spi.write(data);
// calculate and return conversion value from result bytes
int value = (result[1]<< 8) & 0b1100000000; //merge data[1] & data[2] to get 10-bit result
value |= (result[2] & 0xff);
return value;
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy