当前位置: 首页 > article >正文

树莓派5 spi控制

树莓派5 spi控制



#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/spi/spidev.h>
#include <sys/ioctl.h>
#include <string.h>

#define SPI_DEVICE_PATH "/dev/spidev0.0"
uint8_t tx_bf[200];



typedef struct spi_args_struct
{
    int fd;
    uint8_t tx_buffer[1000];
    uint8_t rx_buffer[1000];
    struct spi_ioc_transfer transfer;

}spi_args_s;

int api_spi_init(char * dev)
{
    int fd = 0;
    if ((fd = open(dev, O_RDWR)) < 0)
    {
        perror("Failed to open SPI device");
        return -1;
    }
    return fd;
}

int api_spi_cfg(struct spi_args_struct *spi_args_obj)
{
    /* 配置收发缓存 */
    spi_args_obj->transfer.tx_buf = (unsigned long) spi_args_obj->tx_buffer;
    spi_args_obj->transfer.rx_buf = (unsigned long) spi_args_obj->rx_buffer;

    /* Configure SPI mode and bits per word */
    uint8_t mode = SPI_MODE_0;
    uint8_t bits = 8;
    if (ioctl(spi_args_obj->fd, SPI_IOC_WR_MODE, &mode) < 0)
    {
        perror("Failed to set SPI mode");
        close(spi_args_obj->fd);
        return -1;
    }
    if (ioctl(spi_args_obj->fd, SPI_IOC_WR_BITS_PER_WORD, &bits) < 0)
    {
        perror("Failed to set SPI bits per word");
        close(spi_args_obj->fd);
        return -1;
    }
}

void api_spi_send(struct spi_args_struct *spi_args_obj, uint8_t *data, uint16_t size)
{

    spi_args_obj->transfer.len = size;
    memcpy((spi_args_obj->tx_buffer), data, spi_args_obj->transfer.len);
    printf("Send %d bytes of data  max speed: %d Hz.\n", spi_args_obj->transfer.len, spi_args_obj->transfer.speed_hz);
}


spi_args_s spi_args_obj = 
{
    .transfer = 
    {
        .len = 10,
        .delay_usecs = 0,
        .speed_hz = 31200000, // SPI speed in Hz
        .bits_per_word = 8,
    },
};
#if 0 //测试代码
int main()
{

    /* Open the SPI device */
    spi_args_obj.fd = api_spi_init(SPI_DEVICE_PATH);

    /* Configure SPI mode and bits per word */
    api_spi_cfg(&spi_args_obj);

    /* Send Data */

    for (int i = 0; i < 200; i++)
    {
        tx_bf[i] = i;
    }

    while (1)
    {

        api_spi_send(&spi_args_obj, tx_bf, 10);
        printf("\r\n");
        if (ioctl(spi_args_obj.fd, SPI_IOC_MESSAGE(1), &(spi_args_obj.transfer) ) < 0)
        {
            perror("Failed to perform SPI transfer");
            close(spi_args_obj.fd);
            return -1;
        }
        sleep(2);
        printf("sleep out\n");
    }

    /* Close the SPI device */
    close(spi_args_obj.fd);

    return 0;
}

#endif


int spi_set_mode(int fd, int mode)
{
    return ioctl(fd, SPI_IOC_WR_MODE, &mode);
}

int spi_read_mode(int fd, int mode)
{
    return ioctl(fd, SPI_IOC_RD_MODE, &mode);
}

int spi_set_bit_order(int fd, int bit_order)
{
    return ioctl(fd, SPI_IOC_WR_LSB_FIRST, bit_order);
}

int spi_read_bit_order(int fd, int bit_order)
{
    return ioctl(fd, SPI_IOC_RD_LSB_FIRST, &bit_order);
}

int spi_set_bits_per_word(int fd, int bits_per_word)
{
    return ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits_per_word);
}

int spi_read_bits_per_word(int fd, int bits_per_word)
{
    return ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits_per_word);
}

int spi_set_max_speed(int fd, int max_speed)
{
    ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &max_speed);
}

int spi_read_max_speed(int fd, int max_speed)
{
    ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &max_speed);
}







http://www.kler.cn/a/350333.html

相关文章:

  • vif-方差膨胀因子计算
  • WebSocket 和 Socket 的区别
  • 【Pandas】pandas Series groupby
  • 鸿蒙Harmony json转对象(1)
  • 数据分析 基础定义
  • Java - WebSocket
  • 如何用好 CloudFlare 的速率限制防御攻击
  • 藏式建筑彩绘知识图谱展示及问答
  • 【Next.js 项目实战系列】02-创建 Issue
  • 010集——关于图层( 新建图层、获取图层名)(CAD—C#二次开发入门)
  • 中国是全球最大的硫酸锰生产和消费地区
  • 实现vlan间的通信
  • C/C++复习(三)
  • Web自动化Demo-PHP+Selenium
  • 一个Idea:爆改 T480
  • 51单片机的土壤湿度检测控制系统【proteus仿真+程序+报告+原理图+演示视频】
  • Java 日志打印
  • 【网络安全】注册流程:电子邮件验证绕过
  • 2024/10/12 力扣 15.三数之和
  • PHP系统中502 的原因及解决方法
  • HC32F460KETA PETB JATA 工业 自动化 电机
  • Redis集群和哨兵环境下节点故障排查命令
  • 针对考研的C语言学习(循环队列-链表版本以及2019循环队列大题)
  • Mybatis全局配置介绍
  • Java 条件语法指南:高效编写逻辑控制代码
  • 鸿蒙OS启动流程