1、打开 spi 设备
/*
int open(const char *__file,int __oflag)
*/
int fd = open(device,O_RDWR);
if(fd <0){
printf("open failed!");
}
2、配置 spi
/*配置 spi 模式*/
void SetSpiMode(int fd, unsigned short mode)
{
int ret;
ret = ioctl(fd, SPI_IOC_WR_MODE, &mode);
if (ret == -1){
printf("set spi wr mode err!");
}
ret = ioctl(fd, SPI_IOC_RD_MODE, &MODE);
if(ret == -1){
printf("set spi rd mode err!");
}
}
/*配置 spi bits per word*/
void SetSpiBitsPerWord(int fd, unsigned short bits)
{
int ret;
ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);
if(ret == -1){
printf("set spi wr bitsperword err!");
}
ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits);
if(ret == -1){
printf("set spi rd bitsperword err!");
}
printf("set spi bits per word ok!");
}
/*配置 spi 最大传输速度*/
void SetSpiMaxTransferSpeed(int fd, unsigned int speed)
{
int ret;
ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
if(ret == -1){
printf("set spi wr max speed err!");
}
ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed);
if(ret == -1){
printf("set spi rd max speed err!");
}
printf("set spi max speed ok!");
}
3、SPI 传输
3.1 spi_ioc_transfer 结构体
spi的读写操作使用到 spi_ioc_transfer 结构体,结构体定义如下(spidev.h)
/*
*@tx_buf:写数据缓冲区的指针 或为null
*@rx_buf:接收数据缓冲区指针,或为null
*@len:读或写缓冲区长度
*@speed_hz:通信设备比特率
*@bits_per_word:设备的字长
*@delay_usecs:如果非零,本次传输最后一位完成,下次传输前取消设备的延时。
*@cs_change:确认在下次传输之前取消设备(spi 片选)
*/
struct spi_ioc_transfer{
__u64 tx_buf;
__u64 rx_buf;
__u32 len;
__u32 speed_hz;
__u16 delay_usecs;
__u8 bits_per_word;
__u8 cs_change;
__u32 pad;
};
3.2 spi 读写操作
/*
*spi 传输
*如何判断spi读写:判断tx_buf与rx_buf是否为空
*全双工操作:同时赋值rx_buf与tx_buf
*/
void SpiMessageTransfer(unsigned char *sendBuf, unsigned char *recvBuf,int len)
{
int ret;
struct spi_ioc_transfer sitfer[2];
memset(sitfer,0x0,sizeof(sitfer));
sitfer[0].tx_buf = (__u64)sendBuf;
sitfer[0].len = len;
sitfer[1].rx_buf = (__u64)recvBUF;
sitfer[1].len = len;
ret = ioctl(fd,SPI_IOC_MESSAGE(2),sitfer);
if(ret < 0){
printf("spi message transfer err!");
}
}