UART、IIC、SPI实战总结

目录

UART、IIC、SPI实战总结

一、UART

①、uart字符文件

②、stty设置串口通信参数

③、数据的读写

二、IIC

①、iic接口

②、读取iic接口上的设备地址

③、读取设备的寄存器上的所有值

④、读iic设备的其中一个寄存器的值

⑤、先iic设备的寄存器中写数据

三、SPI

①发送数据后使用逻辑分析仪采集分析

总结:到这里嵌入式中最常用的UART、IIC、SPI通信协议已经说完了,我们使用的是烧录了Linux系统的接口,来进行这三种协议的验证,如果您还对uart、iic、spi的理论部分有疑惑,可以看看我们写的另一篇文章:https://blog.csdn.net/2403_82436914/article/details/147326163?spm=1001.2014.3001.5502

最后希望您也尝试使用逻辑分析仪来采集这些波形,分析底层的传输时序。


我们这次将使用逻辑分析仪采集已烧录linux系统的rv1103核心板和h618单板机上的UART、IIC、SPI数据时序,并对采集到的数据进行分析和总结。

这里如果您还对UART、IIC、SPI的理论有疑惑,希望您可以看看我们的文章:https://blog.csdn.net/2403_82436914/article/details/147326163?spm=1001.2014.3001.5502          这篇文章对uart、iic、spi的理论进行了总结和归纳。

OK、下面我们对嵌入式中使用的最多的UART、IIC、SPI进行实战操作。

一、UART

①、uart字符文件

我们在应用层控制UART接口时,一般在/dev目录下面有一个ttyS或ttyAS的文件夹,有的时候是ttyLP文件夹,这个还要根据参考官方提供的资料

②、stty设置串口通信参数

然后我们只需要对这个字符设别进行控制即可,一般来说都会有一个stty工具去控制串口的操作。

OK,我们知道UART是一个异步通信的协议,所以UART通信双方都约定了一个通信数度叫波特率bps(位/秒),这就意味着UART发送数据的时候不能像iic和spi这种同步通信的协议一样连续发送。UART通信时有一位起始位和1/1.5/2位停止位,数据位有5~8位(先发低位,后发高位),一个可有可无的奇偶校验位。

其实最主要的我们要配置好串口的波特率、数据位个数,停止位个数,有无奇偶校验位。下面配置了串口3的一系列参数。

其中波特率配置可以直接写一个数字115200就行。cs8表示8位数据位,如果是cs5就表示5位数据位。-cstopb表示1位停止位,cstopb表示2停止位。-parenb表示无校验位,如果是parenb parodd表示有校验而且是奇校验,parenb -parodd表示偶校验。

OK,配置好了串口3,我们就使用逻辑分析仪和串口检测来检验串口3的数据输入和输出。这里我们使用stty -F /dev/ttyS3 echo表示打开回显。

③、数据的读写

下面这个是我们的板子向PC电脑发送字符串hello的示例

逻辑分析仪是最能够展示这个串口的数据是怎么发的。

下面这个是我们的数据从PC电脑向开发板发送的world的示例

通道2表示表示电脑向开发板发送数据,通道3表示开发板得到发来的数据然后向电脑COM终端回显数据。我们发送是要换行,也就是要加一个\r\n才能够发送到开发板。

我们需要注意这个调试的UART好像是不能使用echo往外面发送,只能通过RXD接收字符串。

OK,到这里,我们就演示完了一个Linux开发板上的串口引脚怎么使用,并使用逻辑分析仪就行数据的分析。其实最主要的要是要使用stty配置好串口的波特率、数据位、奇偶校验位、停止位。配好了就可以使用UART让不同的板子进行数据收发了。

二、IIC

①、iic接口

要这道有哪些iic设别,在/sys/bus/i2c/devices 目录中,每个 I2C 设备都有自己的文件夹。也可以通过命令:i2cdetect -l 来查看iic设别。

我们要测试iic设备,可以和iio子系统一样通过一系列的iic工具来测试iic设备。

②、读取iic接口上的设备地址

#查看i2c接口上的设备, 这里是查看iic3接口上的设备地址。
i2cdetect -a -y 3

这里我们的iic接口3上连了一个mpu6050的传感器,如下它的设别地址为0x68

③、读取设备的寄存器上的所有值

知道了设别地址,就可以读取设备的寄存器上的所有值

#读取指定设备的全部寄存器的值,这里是读取设备地址为0x68的所有寄存器的值
i2cdump  -f -y 3 0x68

下面这个是寄存器上值的数值信息。

下面我们使用逻辑分析仪采集读到的数值。

下面这是第一个数据值0x87

下面这是第二个数据值0x7B

后面的都是一样的,如下

④、读iic设备的其中一个寄存器的值

也可以看到,这么多的数据,我不可能都看对吧,我可能只读一个其中一个寄存器的数值就行了,所以我们下面来采集其中一个寄存器的数值

#读取指定IIC设备的某个寄存器的值,如下读取地址为0x68器件中的0x89寄存器值
i2cget -f -y 3 0x68 0x89

如下读到了0x89寄存器位置的数值是0xE7

下面我们使用逻辑分析仪来详细的分析每一个位是怎么传的,可以先参考这个iic数据传输的时序图来分析逻辑分析仪采集到的时序图。

这是逻辑分析采集到的总的时序图。

我们对采集到的iic传输数据进行了如下的划分研究,也是iic传输的核心,如果您有兴趣,可以仔细研究下面采集到的数据后,您对iic数据传输又会有一个全新的认识

总的来说,还是遵从下面这个时序图

⑤、先iic设备的寄存器中写数据

上面我们对从设备进行读数据,OK,现在我们要向从设备中一个寄存器写数据

#写入指定IIC设备的某个寄存器的值,如下设置地址为0x68器件中的0x01寄存器值为0x6f
i2cset -f -y 3 0x68 0x01 0x6f

然后我们使用逻辑分析对采集到数据位进行分析,这个向从设别中写其实还是遵循下面这个时序图。

我们对采集到时序,进行划分研究分析。

这个比向从机读还简单哈,整体还是遵循下面这个时序图

OK,iic的总体的使用和使用逻辑分析仪验证就是这些,其实就是按照这些时序图来传数据的。iic子系统在应用层我们会使用那几个命令来调iic就行了,如果写代码来使用iic又是另一个规则了哈。

三、SPI

这里我们只使用官方提供的spidev_test工具对SPI进行回环测试,并使用逻辑分析仪进行采集分析。

①发送数据后使用逻辑分析仪采集分析

下面我们使用命令发送一个字符h

spidev_test -D /dev/spidev1.0 -C -v -L -p "h"

终端打印

采集到的波形如下

上面这个波形,可以参考下面Mode0的时序图进行分析

下面这是我们对SPI数据的时序进行的分析。

OK,到这里我们大概知道SPI怎么传数据了,后续与芯片进行通信我们还在研究中。

总结:到这里嵌入式中最常用的UART、IIC、SPI通信协议已经说完了,我们使用的是烧录了Linux系统的接口,来进行这三种协议的验证,如果您还对uart、iic、spi的理论部分有疑惑,可以看看我们写的另一篇文章:https://blog.csdn.net/2403_82436914/article/details/147326163?spm=1001.2014.3001.5502

最后希望您也尝试使用逻辑分析仪来采集这些波形,分析底层的传输时序。

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐