linux(raspberry PI) 上的 SPI 使用 spidev

SPI on linux(raspberry PI) using spidev

我正在尝试在 Raspberry PI 上使用 SPI,使用 spidev 和他的测试代码作为我自己的框架。我对 table 大小有疑问。在将 table 传递给传递函数之前,我的 table 具有不同的大小,即我的 table 有 3 个元素,在函数内部它有 4 个。这是我的代码:

// spi.cpp : Defines the entry point for the console application.
//


#include <stdint.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/types.h>
#include <linux/spi/spidev.h>

#define ARRAY_SIZE(a)  (sizeof(a) / sizeof((a)[0]))

static const char *device = "/dev/spidev0.0";
static uint8_t mode;
static uint8_t bits = 8;
static uint32_t speed = 1000000;
static uint16_t delay;

//this function gives problems with diffrent size of array
static void transfer(int fd, uint8_t tx[])
{
        printf("transfer1");
        printf(" rozmiar tab=%d ", ARRAY_SIZE(tx));
        int ret;
        uint8_t rx[ARRAY_SIZE(tx)] = { 0, };
        struct spi_ioc_transfer tr = {
                .tx_buf = (unsigned long)tx,
                .rx_buf = (unsigned long)rx,
                .len = 3,
                .delay_usecs = delay,
                .speed_hz = speed,
                .bits_per_word = bits,
        };

        ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);

        for (ret = 0; ret < ARRAY_SIZE(tx); ret++) {
                if (!(ret % 6))
                        puts("");

                printf("%d. %.2X ", ret,rx[ret]);

        }
        puts("");
        }

int main(int argc, char *argv[])
{
        int ret = 0;
        int fd;

        fd = open(device, O_RDWR);

        /*
        * spi mode
        */
        ret = ioctl(fd, SPI_IOC_WR_MODE, &mode);

        ret = ioctl(fd, SPI_IOC_RD_MODE, &mode);

        /*
        * bits per word
        */
        ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);

        ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits);

        /*
        * max speed hz
        */
        ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);

        ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed);

        printf("spi mode: %d\n", mode);
        printf("bits per word: %d\n", bits);
        printf("max speed: %d Hz (%d KHz)\n", speed, speed / 1000);

        uint8_t tx1[] = {
                0x0, 0x1b, 0xa5
        };
//here I'm passing table to function
        transfer(fd, tx1);
        uint8_t tx2[] = {
                0x0, 0x33, 0x30, 0x01, 0x02
        };
        printf(" %d. ", ARRAY_SIZE(tx2));
        transfer(fd, tx2);
        uint8_t tx3[] = {
                0x0, 0x52, 0x90
        };
        transfer(fd, tx3);
        uint8_t tx4[] = {
                0x80, 0x60
        };
        printf(" %d. ", ARRAY_SIZE(tx4));
        transfer(fd, tx4);

        close(fd);

        return ret;
}

作为函数参数发送的数组被视为指针。您的 ARRAY_SIZE(a) 大致扩展为 (sizeof(uint8_t*) / sizeof(uint8_t)),在 32 位平台上等于 4。

您应该明确地将数组大小作为第三个参数传递:

void transfer(int fd, const uint8_t *tx, size_t size) { ... }

然后,您可以使用您的宏来正确计算数组大小:

transfer(fd, tx1, ARRAY_SIZE(tx1));

如果tx没有在transfer()内部被修改,那么做成const.

是一个有品位的问题