第十六期 | SPI
文章平均质量分 92
北京迅为
让学习更简单,让开发更容易
展开
-
RK3568驱动指南|第十六篇 SPI-第184章 初步认识SPI
根据表格可以得到数据传输实际上就是主设备和从设备之间进行的数据交换,在一个SPI时钟周期内,收发是同时进行的,主机通过MOSI线发送1bit数据,从机通过该线读取这1bit数据;SPI有多种连接模式,主要分为常规模式和菊花链模式,在常规模式下,每个从设备(Slave)都有独立的片选(Chip Select, CS)信号线。如果主设备要给从设备传输数据,主设备只需要忽略掉从设备接收到的数据即可。如果主设备要从从设备接收数据,主设备向从设备随机发送数据,从设备忽略掉从主设备接收的数据即可。原创 2024-07-03 11:26:33 · 1289 阅读 · 0 评论 -
RK3568驱动指南|第十六篇 SPI-第185章 SPI子系统框架
至此,对于SPI子系统框架相关的内容就讲解完成了,其中SPI核心层和SPI适配器驱动层Linux内核以及SOC芯片原厂已经编写完成了,留给我们驱动工程师的部分只剩下SPI设备驱动层相关的部分,在后面的章节中将会以编写MCP2515 SPI转CAN的驱动程序为例,逐步完善SPI外设驱动框架。SPI 核心层位于 SPI 设备驱动层和 SPI 适配器驱动层之间,起到了承上启下的作用,负责 SPI设备驱动层和SPI适配器驱动层之间的数据传递。·通过硬件 SPI 模块自动完成时钟信号的生成和数据收发,提高通信效率。原创 2024-07-03 13:09:49 · 639 阅读 · 0 评论 -
RK3568驱动指南|第十六篇 SPI-第186章 通用SPI外设代码框架编写
如果设备树不存在reg和spi-max-frequency 两个属性则会返回rc,这就导致上一级函数of_register_spi_device会返回错误,从而无法成功注册SPI设备、不能成功解析设备树节点,最终导致编写的SPI设备驱动无法正常匹配,进入probe函数。该函数的主要作用是注册一个SPI驱动。可以看到spi_register_driver是一个宏定义,这个宏定义的作用是为了简化注册SPI设备驱动程序的过程,实际注册SPI设备的函数为__spi_register_driver,该函数定义在“原创 2024-07-03 13:26:35 · 1387 阅读 · 0 评论 -
RK3568驱动指南|第十六篇 SPI-第187章 mcp2515驱动编写:注册字符设备
在上个章节中初步完善了SPI设备驱动的device部分和driver部分的程序框架,而根据SPI子系统框架图可知,应用程序需要通过设备节点以及相应的外设接口函数才能驱动对应的SPI外设,所以本章节将继续完善mcp2515的驱动程序,注册字符设备,实现文件操作集中的read,write函数。由于没有在remove卸载函数中添加打印相关内容,所以使用rmmod命令卸载驱动之后,没有任何打印,至此,添加字符设备相关内容的SPI驱动实验就完成了。【粉丝群】258811263(加群获取驱动文档+例程)原创 2024-07-03 13:32:18 · 1018 阅读 · 0 评论 -
RK3568驱动指南|第十六篇 SPI-第188章 mcp2515驱动编写:复位函数
该函数首先会对要传输的数据以及传输的数据大小进行封装,然后调用spi_sync_transfer函数进行输入传输,spi_write函数传入的第一个参数为spi_device类型的结构体变量,struct spi_device是Linux内核中用于描述SPI从设备的结构体。因此,ctlr->transfer_one_message(ctlr, ctlr->cur_msg)这一行代码的作用是将当前的SPI消息传递给SPI控制器中的传输函数进行处理,以完成消息的传输操作。原创 2024-07-03 13:47:27 · 901 阅读 · 0 评论 -
RK3568驱动指南|第十六篇 SPI-第189章 mcp2515驱动编写:读寄存器函数
在上个章节中编写了mcp2515的复位函数,但并不能判定mcp2515进入了复位状态,而在本章节将编写mcp2515的读寄存器函数,通过读取mcp2515 CAN状态寄存器的值,来确定当前SPI转CAN模块所处的工作模式。本实验将以187章编写完成的驱动程序为基础,添加了188章完善的复位函数以及上一小节填充的读寄存器函数,并在probe函数中对两个函数进行调用,从而验证两个函数编写的正确性。在进行实验之前,首先要确保开发板烧写的是我们在186.1小节中编译出来的boot.img。原创 2024-07-04 10:55:05 · 1165 阅读 · 0 评论 -
RK3568驱动指南|第十六篇 SPI-第190章 配置模式下寄存器的配置
CAN总线上的所有器件都必须使用相同的比特率,而CNF1、CNF2和CNF3三个寄存器就是用来配置CAN总线波特率的,更具体的说明为CNF1、CNF2和CNF3三个寄存器通过对位时间各个段的配置,进而设置CAN总线的波特率。至此,对于位修改的讲解就完成了,由于本章节只是对寄存器进行的讲解和配置,并不能得到具体的实验结果,所以本章不再进行实验,接下来的章节将继续对mcp2505驱动程序进行完善。至此,关于配置模式中寄存器的配置就完成了,在下个小节中将会讲解一种常用的寄存器值修改方法位修改指令和屏蔽字节。原创 2024-07-04 13:25:28 · 1152 阅读 · 0 评论 -
RK3568驱动指南|第十六篇 SPI-第191章 mcp2515驱动编写:修改工作模式
上一章节中在mcp2515的配置模式下配置了一些必要寄存器,而mcp2515有着五种工作模式,分别为配置模式、正常模式、休眠模式、仅监听模式和环回模式,接下来可以将mcp2515的设置为正常模式,从而让他真正的运行起来,而为了让大家更容易的进行驱动测试,本章节将会设置为环回模式,有一个SPI转CAN外设即可进行测试。本实验将以188章编写完成的驱动程序为基础,添加了190章配置模式下寄存器相关的配置代码,以及本章中讲解的工作模式修改相关的内容。【粉丝群】258811263(加群获取驱动文档+例程)原创 2024-07-04 14:08:42 · 750 阅读 · 0 评论 -
RK3568驱动指南|第十六篇 SPI-第192章 mcp2515驱动编写:完善write和read函数
上述测试app代码中第13行表示要发送给mcp2515的13个字节的数据,其中前5个字节用来装载标准和扩展标识符以及其他报文仲裁信息,最后的8个字节用于装载等待发送报文的8个可能的数据字节,第一个字节发送缓冲器标准标识符高位、第三个字节发送缓冲器扩展标识符高位、第四个字节发送缓冲器扩展标识符低位可以随意设置,这里设置的是0x66、0x22、0x33。发送缓冲器控制寄存器TXBnCTRL为发送缓冲器的第一个字节,接下来的5个字节用来装载标准和扩展标识符以及其他报文仲裁信息。原创 2024-07-04 14:43:58 · 782 阅读 · 0 评论 -
RK3568驱动指南|第十六篇 SPI-第193章 Linux中通用SPI设备驱动
在前面的章节中我们从0开始编写了一个mcp2515的驱动程序,而跟I2C设备类似,在Linux内核中也有着通用SPI设备驱动,在本章节将会讲解通用SPI设备驱动的使用,并讲解如何在应用程序中通过ioctl对SPI进行配置和使用。在第一个小节中使能了内核中的通用SPI,而在第二小节讲解了spidev_test工具的使用,在本小节将根据spidev_test工具的源码,编写mcp2515通用SPI驱动程序的应用程序。/dev/spidev0.0 表示一个 SPI 总线上的具体设备。原创 2024-07-04 15:06:40 · 1830 阅读 · 0 评论 -
RK3568驱动指南|第十六篇 SPI-第194章 如何在Linux中使用模拟SPI
在讲解SPI基础的时候提到过SPI可以分为硬件SPI和软件SPI,在前面的章节中使用的都是硬件SPI,当硬件SPI不够用时,可以使用GPIO来模拟SPI,在本节课将对软件SPI进行讲解。iTOP-3568开发板\03_【iTOP-RK3568开发板】指南教程\02_Linux驱动配套资料\04_Linux驱动程序\120_soft_spi\01_修改好的内核。修改完成之后保存,然后重新编译内核镜像,编译完成的内核镜像存放路径为“修改完成之后保存,然后重新编译内核镜像,编译完成的内核镜像存放路径为“原创 2024-07-04 15:29:22 · 1000 阅读 · 0 评论 -
RK3568驱动指南|第十六篇 SPI-第195章 实践:移植官方mcp2515驱动
Linux内核源码中默认已经有了MCP2515的驱动程序,驱动具体路径为“linux_sdk/kernel/drivers/net/can/spi/mcp251x.c”,所以只需要在make menuconfig图形化配置界面选中即可。在前面的章节中从零编写了一个mcp2515的驱动程序,旨在对SPI驱动相关的知识进行学习,但实际上mcp2515的驱动程序在内核中已经提供了,在本章节将会讲解如何移植官方mcp2515驱动。保存修改配置,然后重新编译内核镜像,修改好的设备树以及编译好的内核镜像存放路径为“原创 2024-07-04 15:45:23 · 798 阅读 · 0 评论