gpt4 book ai didi

linux - 树莓派 : SPI not working, spi_bcm2835 未使用 lsmod 显示

转载 作者:行者123 更新时间:2023-12-04 18:31:18 24 4
gpt4 key购买 nike

我试图控制我的WS2801 LED 灯条与我的 Raspberry Pi 4超过 SPI界面。
Pi 正在运行 unUbuntu 20.04内核版本:Linux ubuntu 5.3.0-1030-raspi2 #32-Ubuntu SMP Sun Jul 12 21:20:28 UTC 2020 aarch64 aarch64 aarch64 GNU/LinuxLED灯条的设置和连接应该没问题。我已经在我的 Pi3 上使用测试脚本对其进行了验证,并且它工作正常。在 PI 上运行测试脚本没有错误,但 LED 条上没有任何 react 。
到目前为止,我的理解是,为了通过 SPI 进行通信,我们需要 spidevspi-bcm2835要加载的模块。lsmod | grep spi 的输出:

spidev                 28672  0
IMO,应该有 spi_bcm2835也是。在 /dev/文件夹有 spidev0.0spidev0.1 ,因为它应该是。调用 sudo modprobe spi_bcm2835没有给出错误,但没有解决问题。
我的 /boot/firmware/config.txt :
[pi4]
kernel=uboot_rpi_4.bin
max_framebuffers=2

[pi3]
kernel=uboot_rpi_3.bin

[all]
arm_64bit=1
device_tree_address=0x03000000
start_x=1
gpu_mem=512
dtparam=spi=on
dtparam=sound=on
dtparam=i2c_arm=on
dtparam=i2s=on
dtoverlay=spi-bcm2835
我的 /etc/modules :
i2c-dev
spi-bcm2835
spi-dev
snd-bcm2835
没有关于 spi 的黑名单条目里面 /etc/modeprob.d/文件。 dmesg 中唯一相关的条目是 [ 1.559971] spi-bcm2835 fe204000.spi: could not get clk: -517 .但据我所知 -517意味着模块只是稍后加载,因为它在这个时间步还没有准备好。
有人知道这里可能是什么问题吗?
谢谢!
这是我的测试脚本:
/******************************************************************************/
/* */
/* FILE: ledstrip.cpp */
/* */
/* Displays the contents of a file on a LED strip */
/* ============================================== */
/* */
/* V0.01 18-DEC-2015 Te */
/* */
/******************************************************************************/

#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( &parameters, 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),&parameters) == -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 ;
}

最佳答案

我有一个类似的问题。 This answer帮助了我。
更改usercfg.txt而不是 config.txt .

关于linux - 树莓派 : SPI not working, spi_bcm2835 未使用 lsmod 显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65921924/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com