Hallo zusammen,
erst einmal möchte ich mich entschuldigen für mein Vorgehen, Ich bin relativ unerfahren was den Umgang mit dem Pi angeht und hatte von der Arbeit den Druck, dass Projekt möglichst schnell zum Laufen zu bekommen.
Danke für eure vielen Antworten Bernd666 STF
1. Ich habe alle vorgenommenen Änderungen in der config.txt und /etc/modules rückgängig gemacht
2. ls -l /dev/spi* ergibt
crwxrwxrwx 1 root root 153, 0 April 11 2019 /dev/spidev0.0
crw------- 1 root root 153, 1 April 11 2019 /dev/spidev0.1
3. Aus folgendem Grund habe ich versucht mit den manuellen Einträgen (welche ja falsch waren), das Problem zu beheben: Ich auf mehreren Seiten gelesen, dass für eine Kommunikation über SPI, lsmod das Modul spi_bcm2835 ausgeben sollte, was bei mir nicht der Fall ist. Ich habe gerade noch einmal nachgeschaut und ebenfalls festgestellt, dass diese Informationen sich auf ältere Modelle und andere OS bezogen haben. Also eventuell ist dies auch nicht mehr notwendig?
4. Wie stelle ich fest das etwas nicht funktioniert?
Ich habe mein LED-Band folgendermaßen mit dem PI verbunden:

Ich brauche in diesem Fall ja den MISO Pin nicht, da das Gerät ja nur Input vom Master braucht, aber selbst nicht mit dem Master interagieren muss (soweit mein Verständnis von MOSI und MISO, korrigiert mich gerne wenn ich falsch liege).
Also Testskript für das Ansteuern und Abspielen der LEDs verwende ich folgendes Skript von hier:
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdint.h>
#include <string.h>
#include <time.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/spi/spidev.h>
static const char *device = "/dev/spidev0.0" ;
static uint32_t speed = 500000 ;
static uint8_t mode = SPI_MODE_0 ;
static uint8_t bits = 8 ;
static unsigned char tx[75] ;
static unsigned char rx[75] ;
static struct spi_ioc_transfer parameters[1];
static int offset = 0 ;
static int spi ;
/*************/
int OpenSPI()
/*************/
{
spi = open( device, O_RDWR ) ;
if( spi < 0 )
{
fprintf( stderr, "can't open device\n" ) ;
return 1 ;
}
int ret = ioctl( spi, SPI_IOC_WR_MODE, &mode ) ;
if( ret == -1 )
{
close( spi ) ;
fprintf( stderr, "can't set mode\n" ) ;
return 2 ;
}
ret = ioctl( spi, SPI_IOC_WR_BITS_PER_WORD, &bits ) ;
if( ret == -1 )
{
close( spi ) ;
fprintf( stderr, "can't set bits\n" ) ;
return 3 ;
}
ret = ioctl( spi, SPI_IOC_WR_MAX_SPEED_HZ, &speed ) ;
if( ret == -1 )
{
close( spi ) ;
fprintf( stderr, "can't set speed\n" ) ;
return 4 ;
}
memset( ¶meters, 0, sizeof(spi) ) ;
parameters[0].tx_buf = (unsigned long)tx ;
parameters[0].rx_buf = (unsigned long)rx ;
parameters[0].len = 75 ;
parameters[0].delay_usecs = 0 ;
parameters[0].speed_hz = speed ;
parameters[0].bits_per_word = bits ;
parameters[0].cs_change = 0 ;
return 0 ;
}
/***************/
void CloseSPI()
/***************/
{
close( spi ) ;
}
/*****************/
void ResetState()
/*****************/
{
memset( tx, 0, sizeof(tx) ) ;
}
/****************/
void ShowState()
/****************/
{
if( ioctl(spi,SPI_IOC_MESSAGE(1),¶meters) == -1 )
fprintf( stderr, "can't transfer data\n" ) ;
}
/*******************************/
void Token( const char *token )
/*******************************/
{
if( isdigit(*token) )
{
int value = atoi( token ) - 1 ;
if( (value >= 0) && (value <= 24) )
tx[value*3+offset] = 255 ;
}
else
{
switch( tolower(*token) )
{
case 'r' : offset = 0 ;
break ;
case 'g' : offset = 1 ;
break ;
case 'b' : offset = 2 ;
break ;
}
}
}
/***************************/
void Line( const char *ps )
/***************************/
{
ResetState() ;
char token[25] ;
size_t i = 0 ;
while( *ps != '\0' )
{
if( isspace(*ps) )
{
if( i > 0 )
{
token[i] = '\0' ;
Token( token ) ;
}
i = 0 ;
}
else
{
if( i < sizeof(token) - 1 )
token[i++] = *ps ;
}
++ps ;
}
ShowState() ;
}
/***************************/
void ReadFile( FILE *file )
/***************************/
{
char line[1024] ;
struct timespec in ;
struct timespec out ;
while( fgets(line,sizeof(line),file) != NULL )
{
Line( line ) ;
in.tv_sec = 0 ;
in.tv_nsec = 125000000 ;
nanosleep( &in, &out ) ;
}
}
/*********************************/
void File( const char *filename )
/*********************************/
{
FILE *file = fopen( filename, "r" ) ;
if( file != NULL )
{
ReadFile( file ) ;
fclose( file ) ;
}
}
/**********************************/
int main( int argc, char *argv[] )
/**********************************/
{
if( OpenSPI() != 0 )
return 1 ;
if( argc == 1 )
ReadFile( stdin ) ;
else
{
for( int i = 1; i < argc; i++ )
File( argv[i] ) ;
}
CloseSPI() ;
return 0 ;
}
Display More
Gestartet wird das Ganze dann mit sudo ./ledstrip test, wobei die test Datei so aussieht:
r 1
r 2
r 3
r 4
r 5
r 6
r 7
r 8
r 9
r 10
r 11
r 12
r 13
r 13 b 25
r 13 b 24
r 13 b 23
r 13 b 22
r 13 b 21
r 13 b 20
r 13 b 19
r 13 b 18
r 13 b 17
r 13 b 16
r 13 b 15
r 13 b 14
r 13 b 13
r 13 b 13 g 1 25
r 13 b 13 g 2 24
r 13 b 13 g 3 23
r 13 b 13 g 4 22
r 13 b 13 g 5 21
r 13 b 13 g 6 20
r 13 b 13 g 7 19
r 13 b 13 g 8 18
r 13 b 13 g 9 17
r 13 b 13 g 10 16
r 13 b 13 g 11 15
r 13 b 13 g 12 14
r 13 b 13 g 13
Display More
Starte ich das Skript erfolgt zwar keine Fehlermeldung, aber es tut sich auch nichts auf dem LED Band. Aus diesem Grund habe ich daraus geschlossen, dass irgendetwas noch nicht richtig funktioniert.
Ich habe als Validierung der Hardware, Verbindung und des Codes auf meinem alten Pi3 (hier läuft Ubuntu 18.04) über raspi-config SPI aktiviert. Hier zeigt das LED Band wie gewollt das Muster. Außerdem zeigt lsmod auch spi_bcm2835 an (deshalb auch meine Bemühungen, über die manuellen Einträge spi_bcm2835 irgendwie zu aktivieren)
5. Ein Jumper-Kabel zwischen MOSI und MISO und das Ausführen des Test-Skripts, zu finden HIER ganz unten, liefert:
spi mode: 0
bits per word: 8
max speed: 500000 Hz (500 KHz)
FF FF FF FF FF FF
40 00 00 00 00 95
FF FF FF FF FF FF
FF FF FF FF FF FF
FF FF FF FF FF FF
DE AD BE EF BA AD
F0 0D
Display More
Ich hoffe Vorgehen und das Problem ist nun etwas deutlicher. Der letzte Test zeigt ja eigentlich, dass die Kommunikation zwischen Master und Slave funktioniert, richtig?
Vielen Dank für die Hilfe!