2015-01-17 1026 views
0

我正在尝试在使用spidev和他的测试代码作为我自己的骨架的Raspberry PI上使用SPI。我有一个桌子大小的问题。我的表具有不同的大小之前,我通过它来传输函数即我的表有3个元素,内部功能它具有4.这是我的代码:在Linux上使用spidev进行SPI(树莓派)SPI使用spidev

// 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; 
} 

回答

0

作为参数发送给一个函数的阵列将被视为一个指针。您的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

+0

感谢您的帮助,在做完您告诉我的内容之后,我必须解决动态内存分配问题,但是我自己完成。你也可以指点我一些资源,解释为什么会发生这种事情? – Eggboard