Linux 应用开发 之 SPI

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!");
    }
    
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值