I2C habe ich bisher noch nichts gemacht. Unter Linux ist das ja auch nur ein Devicefile das man mit open öffnet und dann die Daten schreibt. Für den SPI bei einem Gnublin habe ich das mal gemacht.
Code:
// Copyright 2013 HTS-Software Unternehmensberatung
// Alexander Schucha
//
// This file is part of Athena-Api.
//
// Athena-Api is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Athena-Api 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with Athena-Api. If not, see <http://www.gnu.org/licenses/>.
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <atomic>
#include <chrono>
#include <thread>
#include <time.h>
#include <iostream>
#include <fstream>
#include <sys/ioctl.h>
#include <linux/types.h>
#include <linux/spi/spidev.h>
class Spi
{
public:
Spi (const std::string& strChipSelect,
const std::string& strDevFile,
const unsigned int uiBandbreite = 100000,
const unsigned char ucBitAnzahl = 8,
int iDebug = 0) : strIntChipSelect (strChipSelect),
strIntDevFile (strDevFile),
iIntDebug (iDebug)
{
// Debug Messages
if (iIntDebug == 1)
{
std::cout << "Start Spi Konstruktor ... " << std::endl;
std::cout << "strIntChipSelect: " << strIntChipSelect << std::endl;
std::cout << "strIntDevFile: " << strIntDevFile << std::endl;
}
iIntDevFile = open(strDevFile.c_str(), O_RDWR);
if (iIntDevFile < 0)
std::cout << "SPI Device File konnte nicht geöffnent werden (SPI-Kernel Modul geladen? root?)." << std::endl;
// SPI Bandbreite einstellen
if (ioctl (iIntDevFile, SPI_IOC_WR_MAX_SPEED_HZ, &uiBandbreite))
std::cout << "SPI Bandbreite konnte nicht eingestellt werden" << std::endl;
// SPI Anzahl Bits einstellen
if (ioctl (iIntDevFile, SPI_IOC_WR_BITS_PER_WORD, &ucBitAnzahl))
std::cout << "SPI Anzahl Bits konnte nicht eingestellt werden" << std::endl;
}
int operator<< (std::string strDaten)
{
if (iIntDebug == 1)
std::cout << "Daten länge: " << strDaten.size () << std::endl;
int status;
struct spi_ioc_transfer xfer;
xfer.tx_buf = (unsigned long) strDaten.c_str ();
xfer.len = strDaten.size ();
xfer.rx_buf = 0;
xfer.delay_usecs = 0;
xfer.speed_hz = 0;
xfer.bits_per_word = 0;
status = ioctl(iIntDevFile, SPI_IOC_MESSAGE(1), &xfer);
if ((status < 0) && (iIntDebug == 1))
std::cout << "SPI Daten senden fehlgeschlagen." << std::endl;
}
int operator<< (__u8* cDaten)
{
if (iIntDebug == 1)
std::cout << "Daten länge: " << sizeof (__u8) << std::endl;
int status;
struct spi_ioc_transfer xfer;
xfer.tx_buf = (unsigned long) cDaten;
xfer.len = sizeof (__u8);
xfer.rx_buf = 0;
xfer.delay_usecs = 0;
xfer.speed_hz = 0;
xfer.bits_per_word = 0;
status = ioctl(iIntDevFile, SPI_IOC_MESSAGE(1), &xfer);
if ((status < 0) && (iIntDebug == 1))
std::cout << "SPI Daten senden fehlgeschlagen." << std::endl;
}
~Spi (void)
{
if (iIntDebug == 1)
std::cout << "Start Spi Destructor ... " << std::endl;
close(iIntDevFile);
}
private:
std::string strIntChipSelect;
std::string strIntDevFile;
int iIntDevFile;
int iIntDebug;
};
Das sollte relativ leicht zum umbauen sein ist ja beides eine serielle Verbindung. Geräte Datei öffnen und Daten senden/empfangen müsste fast gleich sein nur die Daten für die Abwicklung des Protokolls sind unterschiedlich. Ich kann so was schon schreiben weiß aber noch nicht was ich zum Testen benutzen könnte. Vielleicht habe ich noch ein Arduino Teil herumliegen.
PWM habe ich auch noch nicht gemacht würde es aber auch schon brauchen. Kommt halt darauf an ob Du das in Software oder Hardware machen willst. Unter Linux kann man Software PWM recht Rechenzeit sparsam bauen weil der Kernel in der Wartezeit was anderes tun kann. Hardware PWM geht auch wieder über die Devicefiles.
so etwa:
https://jumpnowtek.com/rpi/Using-the...WM-timers.html
Lesezeichen