在spi应用中SPI_IOC_MESSAGE(1)和SPI_IOC_MESSAGE(2),其中SPI_IOC_MESSAGE(2)为什么接收不到数据

蜗牛哦 2016-09-13 09:49:39
//---------------------------------------------------------------
参考源代码:
///////////////////////////////////////////////////////
#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)可以打印接收到数据
...全文
7464 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
蜗牛哦 2016-09-19
  • 打赏
  • 举报
回复
因为一个是全双工和半双工的问题

1,324

社区成员

发帖
与我相关
我的任务
社区描述
主要是开发驱动技术
社区管理员
  • 驱动程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧