1,319
社区成员
发帖
与我相关
我的任务
分享
//---------------------------------------------------------------
参考源代码:
///////////////////////////////////////////////////////
#include <stdint.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <getopt.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/types.h>
#include <linux/spi/spidev.h>
static uint8_t mode;
static uint8_t bits = 8;
static uint32_t speed = 2*1000; //32*100*1000; //500000;
static uint16_t delay=0;
#if 0
//read operating
static int transfer_r(int fd,unsigned short addr)
{
int ret;
unsigned char cmd[2];
unsigned char databuffer[4];
unsigned char mydatabuffer[2];
struct spi_ioc_transfer xfer[2];
cmd[0] = addr & 0x00ff;
cmd[1] = 0x80 | (addr >> 8);
memset(xfer,0,2*sizeof(struct spi_ioc_transfer));
memset(databuffer,0x00,2);
xfer[0].tx_buf = (unsigned long)cmd;
xfer[0].rx_buf = NULL;
xfer[0].len = 2;
xfer[0].delay_usecs = delay;
xfer[0].bits_per_word = bits;
xfer[0].speed_hz = speed;
xfer[1].rx_buf = (unsigned long)databuffer;
xfer[1].tx_buf = NULL;
xfer[1].len = 4;
xfer[1].delay_usecs = delay;
xfer[1].bits_per_word = bits;
xfer[1].speed_hz = speed;
ret = ioctl(fd, SPI_IOC_MESSAGE(2), &xfer);
if (ret == -1 )
printf("can't transfer");
printf("databuffer[0]=0x%x\n",databuffer[0]);
printf("databuffer[1]=0x%x\n",databuffer[1]);
printf("databuffer[2]=0x%x\n",databuffer[2]);
printf("databuffer[3]=0x%x\n",databuffer[3]);
return ((databuffer[1] << 8) + databuffer[0]);
}
#else
static int transfer_r(int fd,unsigned short addr)
{
int ret;
unsigned char cmd[2];
unsigned char databuffer[4];
unsigned char mydatabuffer[2];
struct spi_ioc_transfer xfer[2];
cmd[0] = addr & 0x00ff;
cmd[1] = 0x80 | (addr >> 8);
memset(xfer,0,2*sizeof(struct spi_ioc_transfer));
memset(databuffer,0x00,2);
xfer[0].tx_buf = (unsigned long)cmd;
xfer[0].rx_buf = (unsigned long)databuffer;
xfer[0].len = 2;
xfer[0].delay_usecs = delay;
xfer[0].bits_per_word = bits;
xfer[0].speed_hz = speed;
ret = ioctl(fd, SPI_IOC_MESSAGE(1), &xfer);
if (ret == -1 )
printf("can't transfer");
printf("databuffer[0]=0x%x\n",databuffer[0]);
printf("databuffer[1]=0x%x\n",databuffer[1]);
printf("databuffer[2]=0x%x\n",databuffer[2]);
printf("databuffer[3]=0x%x\n",databuffer[3]);
return ((databuffer[1] << 8) + databuffer[0]);
}
#endif
int gv7601_read(unsigned char chip_id,unsigned short addr)
{
int fd;
int ret ;
char device[1024];
memset(device,0x00,1024);
sprintf(device,"/dev/spidev1.%d",chip_id);
fd = open(device,O_RDWR);
if (fd < 0)
printf("can't open device");
/*
* spi mode
*/
ret = ioctl(fd, SPI_IOC_WR_MODE, &mode);
if (ret == -1)
printf("can't set spi mode");
ret = ioctl(fd, SPI_IOC_RD_MODE, &mode);
if (ret == -1)
printf("can't get spi mode");
/*
* bits per word
*/
ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);
if (ret == -1)
printf("can't set bits per word");
ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits);
if (ret == -1)
printf("can't get bits per word");
/*
* max speed hz
*/
ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
if (ret == -1)
printf("can't set max speed hz");
ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed);
if (ret == -1)
printf("can't get max speed hz");
printf("spi mode: %d\n", mode);
printf("bits per word: %d\n", bits);
printf("max speed: %d Hz (%d KHz)\n", speed, speed/1000);
ret = transfer_r(fd,addr);
close(fd);
return ret;
}
int main(int argc, char *argv[])
{
int tmp;
while(1)
{
tmp = gv7601_read(3,0x06);
printf("gv7601_read(1,0x06)=0x%x\n",tmp);
sleep(1);
}
return 0;
}
问5:在spi应用中SPI_IOC_MESSAGE(1)和SPI_IOC_MESSAGE(2),其中通过SPI_IOC_MESSAGE(2)为什么接收不到数据?
//声明并初始化spi_ioc_transfer结构体
struct spi_ioc_transfer tr = {
.tx_buf = (unsigned long)tx,
.rx_buf = (unsigned long)rx,
.len = ARRAY_SIZE(tx),
.delay_usecs = delay,
.speed_hz = speed,
.bits_per_word = bits,
};
//SPI_IOC_MESSAGE(1)的1表示spi_ioc_transfer的数量
ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr); //ioctl默认操作,传输数据
/////////////////////////////////////////////////////////////////////////////////////
xfer[0].tx_buf = (unsigned long)cmd;
xfer[0].rx_buf = NULL;
xfer[0].len = 2;
xfer[0].delay_usecs = delay;
xfer[0].bits_per_word = bits;
xfer[0].speed_hz = speed;
xfer[1].rx_buf = (unsigned long)databuffer;
xfer[1].tx_buf = NULL;
xfer[1].len = 2;
xfer[1].delay_usecs = delay;
xfer[1].bits_per_word = bits;
xfer[1].speed_hz = speed;
ret = ioctl(fd, SPI_IOC_MESSAGE(2), &xfer);
为什么databuffer接收的数据全是0x00,用示波器测试接收脚有数据,如果通过ioctl(fd, SPI_IOC_MESSAGE(1)可以打印接收到数据