这两天在弄SPI,主要是用ARM下的SPI与外部设备通信。SPI驱动移植就不说了,网上很多例子。
SPI的操作主要设置的是CPOL,CPHA, CS ,SCLK,在Linux下,主要是通过 IOCTL 和 struct spi_ioc_transfer 这个结构体来设置的。OPEN SPI设备后,通过 IOCTL 设置 相关属性
/*
* spi mode
*/
ret = ioctl(fd, SPI_IOC_WR_MODE, &mode);
if (ret == -1)
pabort("can't set spi mode");
ret = ioctl(fd, SPI_IOC_RD_MODE, &mode);
if (ret == -1)
pabort("can't get spi mode");
/*
* bits per word
*/
ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);
if (ret == -1)
pabort("can't set bits per word");
ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits);
if (ret == -1)
pabort("can't get bits per word");
/*
* max speed hz
*/
ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
if (ret == -1)
pabort("can't set max speed hz");
ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed);
if (ret == -1)
pabort("can't get max speed hz");
这里的mode参数,主要用来设置 CPOL 和 CPHA 相关定义在INCLUDE/LINUX/SPI/SPI.H文件里面
#define SPI_CPHA 0x01 /* clock phase */
#define SPI_CPOL 0x02 /* clock polarity */
#define SPI_MODE_0 (0|0) /* (original MicroWire) */
#define SPI_MODE_1 (0|SPI_CPHA)
#define SPI_MODE_2 (SPI_CPOL|0)
#define SPI_MODE_3 (SPI_CPOL|SPI_CPHA)
#define SPI_CS_HIGH 0x04 /* chipselect active high? */
#define SPI_LSB_FIRST 0x08 /* per-word bits-on-wire */
#define SPI_3WIRE 0x10 /* SI/SO signals shared */
#define SPI_LOOP 0x20 /* loopback mode */
#define SPI_NO_CS 0x40 /* 1 dev/bus, no chipselect */
#define SPI_READY 0x80 /* slave pulls low to pause */
默认的MODE是 所有的配置都是0 , 如果你的SPI从外设是高电平有效,CPOL=1,CPHA=0,那么你的MODE就是 CPOL | SPI_CS_HIGH。设置好MODE后,发送数据时,需要使能CS,这里就用到 struct spi_ioc_transfer 里的cs_change位,在 填充这个结构体时,将CS_CHANGE置0即可。
阅读(13533) | 评论(1) | 转发(0) |