Код
#include <stdio.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <linux/types.h>
#include <linux/spi/spidev.h>
int main(){
int fd;
int status;
unsigned char u8_ret;
unsigned int u32_ret;
struct spi_ioc_transfer xfer[2];
unsigned char buf[10];
fd = open("/dev/spi1.1",O_RDWR);
if (fd == -1){
printf("error on open device,%d\n",fd);
return -1;
}
status = ioctl(fd,SPI_IOC_RD_MODE,&u8_ret);
printf("RD_MODE(%d) :0x%x,",status,u8_ret);
status = ioctl(fd,SPI_IOC_RD_LSB_FIRST,&u8_ret);
printf("LSB_FIRST(%d) :0x%x,",status,u8_ret);
status = ioctl(fd,SPI_IOC_RD_BITS_PER_WORD,&u8_ret);
printf("BITS_PER_WORD(%d) :0x%x,",status,u8_ret);
status = ioctl(fd,SPI_IOC_RD_MAX_SPEED_HZ,&u32_ret);
printf("MAX_SPEED_HZ(%d) :0x%x\n",status,u32_ret);
u8_ret = 8;
status = ioctl(fd,SPI_IOC_WR_BITS_PER_WORD,&u8_ret);
printf("set BITS_PER_WORD(%d) :0x%x\n",status,u8_ret);
u32_ret = 1000000;
status = ioctl(fd,SPI_IOC_WR_MAX_SPEED_HZ,&u32_ret);
printf("set MAX_SPEED_HZ(%d) :0x%x\n",status,u32_ret);
memset(xfer, 0, sizeof xfer);
memset(buf, 0, sizeof buf);
buf[0] = 0xaa;
xfer[0].tx_buf = (__u64) buf;
xfer[0].len = 1;
xfer[1].rx_buf = (__u64) buf;
xfer[1].len = 4;
status = ioctl(fd, SPI_IOC_MESSAGE(2), xfer);
printf("ioctl return %d\n",status);
printf("buf[0]=%d, buf[1]=%d, buf[2]=%d\n",buf[0],buf[1],buf[2]);
return 0;
}
В board-sam9260ek.c :
Код
.....
static struct spi_board_info ek_spi_devices[] = {
....
{ /* SPI device 1,CS 0*/
.modalias = "spidev",
.chip_select = 0,
.max_speed_hz = 15 * 1000 * 1000,
.bus_num = 1,
},
{ /* SPI device 1, CS 1*/
.modalias = "spidev",
.chip_select = 1,
.max_speed_hz = 15 * 1000 * 1000,
.bus_num = 1,
},
{ /* SPI device 1, CS 2*/
.modalias = "spidev",
.chip_select = 2,
.max_speed_hz = 15 * 1000 * 1000,
.bus_num = 1,
},
{ /* SPI device 1, CS 3*/
.modalias = "spidev",
.chip_select = 3,
.max_speed_hz = 15 * 1000 * 1000,
.bus_num = 1,
},
....
}
Ядро версии 2.6.30
Если работают read и write, то вероятней всего вы забыли сделать memset(xfer, 0, sizeof xfer);