加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入
  • 正文
    • 构建spi参数结构体
    • spi配置
    • spi发送函数
    • spi接收函数
    • 主函数main
    • 简单spi回环测试代码
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

飞凌嵌入式ElfBoard ELF 1板卡-spi编程示例之spi编写程序

11/06 09:23
272
阅读需 7 分钟
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

构建spi参数结构体

spi.h中同样是构建了一个结构体,用来对spi进行配置:

spi部分对于需要的配置同样是构建了一个结构体spi_param,便于对spi的最大速率,极性、相位,四线制还是两线制等参数做详细配置。

spi配置

这部分代码结合前面构建的spi_param结构体,对结构体成员进行了设置,即完成了spi初始化。设置了SPI 工作模式。根据之前讲解,SPI根据相位和极性的不同分为四 种工作模式,在这里四种工作模式为SPI_MODE_x (x = 0、1、2、3)。这里是回环测试,所以设置为任意一种工作模式都可以。需要注意的是我们可以分开设置SPI的读、写工作模式。

设置SPI通信过程中一个字节所占的位数。默认情况下设置为8即可。同样,这里的读、写是分开设置的。设置SPI通信的波特率,这里设置为1M。经过以上的配置,SPI已经可以通信了。

spi发送函数

第一部分:定义并初始化SPI传输结构体。SPI传输结构体的完整定义如下所示:

结合注释很容易理解,简单说明如下:

(一)tx_buf为发送地址;

(二)rx_buf接收缓冲区地址为0,数据类型为“__u64”,兼容64位系统,64位或32位 由系统自动处理,我们不必关心。len,一次传输的数据长度;

(三)speed_hz,指定SPI通信的比特率

(四)delay_usecs,如果不为零则用于设置两次传输之间的时间延迟;

(五)bits_per_word,指定字节长度,既一个字节占用多少比特;

(六)cs_change,取消 选中,如果设置为真,则在下次传输之前会取消选中当前的SPI设备,更新片选;

(七)tx_nbits,指定“写”数据宽度,SPI 支持 1、2、4位宽度,不过我们使用的SPI3只支持1位数据宽度,该值应当设置为1或0(设置为0表示使用默认的宽度既宽度为1)。

(八)pad参数我们没有用到,不用设置;

第二部分:调用ioctl执行发送,参数fd,是SPI设备文件描述符,参数SPI_IOC_MESSAGE(1)用于指定执 行传输次数,我们这里只定义并初始化了一个传输结构体tr,所以传输次数为1。tr 是第一部分设置的传输结构体变量。

spi接收函数

spi接收的函数和发送函数基本相同,唯一区别就是我们不再将接收缓冲区地址设为0。

主函数main

第一部分:tx_buffer是发送缓冲区,rx_buffer是接收缓冲区。

第二部分:在main函数中依次调用函数spi_init初始化SPI、调用函数transfer执行发送。最后分别打印tx_buffer和rx_buffer的内容,正常情况下,程序运行后我们可以在控制终端发现tx_buffer和rx_buffer的内容一致。

简单spi回环测试代码

这段代码是用SPI进行回环测试的程序。让我们分解代码的每个部分:

第一部分:在这部分,包含了一些必要的头文件,并定义了一些全局变量和结构体。具体来说,`struct_spi_param`是一个结构体,用于保存与SPI通信相关的各种参数。

第二部分:这部分包含了`func_set_opt`函数的实现,该函数负责初始化SPI设备。它打开SPI设备文件(`/dev/spidev1.0`)以读写模式,并使用`ioctl`系统调用来设置各种SPI参数。

第三部分:这部分包含了`func_transfer`函数的实现,该函数负责通过SPI总线传输数据。它使用`ioctl`系统调用和`SPI_IOC_MESSAGE`命令来执行SPI数据传输

第四部分:`main`函数是程序的入口点。它将`send_num`变量设置为38,然后调用`func_set_opt`来配置SPI设备。接着,它调用`func_transfer`来发送和接收数据,并使用预定义的`transfer_tx`和`transfer_rx`缓冲区。最后,它打印接收到的数据长度,并关闭SPI设备。

下面是代码的大致执行过程:

(一)定义了`struct_spi_param`结构体,用于保存SPI参数,并用默认值初始化一个实例(`spi_param`)。

(二)定义了两个函数:`func_set_opt`和`func_transfer`。

(1)`func_set_opt`函数初始化SPI设备,它打开设备文件并设置SPI模式、数据位数和速率。

(2)`func_transfer`函数通过SPI总线传输数据,使用`ioctl`系统调用和`SPI_IOC_MESSAGE`命令来执行SPI数据传输。

(3)`main`函数将`send_num`设置为38,并调用`func_set_opt`来配置SPI设备。

(4)`main`函数接着调用`func_transfer`来发送和接收数据,使用预定义的`transfer_tx`和`transfer_rx`缓冲区。

(5)最后,`main`函数打印接收到的数据长度,并关闭SPI设备。

相关推荐

电子产业图谱