[评测分享]
【ELF 2学习板】13.SPI通讯测试(1)
#板卡评测
 
1229 人阅读
|
0 人回复
|
2025-02-06 
 
 
 
 
TA的每日心情  | 慵懒 2025-8-6 21:07 | 
|---|
 
  签到天数: 313 天 连续签到: 1 天 [LV.8]以坛为家I 
状元 
 
 
	- 积分
 - 5300
 
 
 
 
 | 
 
 
拜年任务结束,年也过完了,继续试用ELF2-RK3588开发板。这次测试一下板载的SPI外设接口。SPI(Serial Peripheral Interface,串行外设接口)是一种同步串行通信协议,广泛应用于微控制器和外围设备之间的通信。SPI接口通常由四根线组成:MOSI(主输出从输入)、MISO(主输入从输出)、SCLK(串行时钟)和SS/CS(从选择/片选)。这种接口允许全双工通信,即在同一个时钟周期内,数据可以在两个方向上同时传输。 
SPI的主要特点包括: 
高速通信:SPI接口可以实现高速的数据传输,适用于需要快速数据交换的应用场景。 
简单接口:SPI的硬件接口相对简单,易于实现。 
支持多设备:通过使用不同的片选线(SS/CS),SPI接口可以连接多个外设。 
全双工通信:可以在一个时钟周期内同时进行数据的发送和接收,提高了数据传输的效率。 
SPI协议常用于连接各种外设,例如存储器、ADC/DAC转换器、传感器等。在实际应用中,SPI协议的时钟频率、数据格式和传输模式可以根据具体需求进行配置。 
 
SPI协议根据时钟极性(CPOL) 和相位(CPHA) 共同决定读取数据的方式,因此一共有4钟模式。 
 
本次首先通过系统工具进行SPI的测试。 
 
spidev是 Linux 内核中用于 SPI(串行外设接口)通信的一个驱动程序,它提供了一个用户空间接口,使得用户可以通过简单的文件操作来进行 SPI 设备的读写操作。spidev主要用于嵌入式系统和开发板中,如 Raspberry Pi、BeagleBone 等,方便开发者在不编写复杂驱动程序的情况下使用 SPI 设备。 
 
 
使用 spidev 库可以简化 SPI 设备的驱动开发,使得开发者可以专注于应用逻辑的实现。 
ELF2-RK3588上,我们可以先看看有哪些SPI外设: 
 
 
系统提供了spi-tools工具包,该软件包包含一些简单的命令行工具,用于辅助操作Linux下的spidev设备。 
spi-config 
查询或设置SPI配置(模式、速率、每字节位数等)。 
 
spi-pipe 
实现向SPI设备同时发送和接收数据。 
 
 
例如,查询当前配置,以及修改时钟频率并再次查询: 
 
这样看,似乎配置失败了,可以看到设置的波特率根本没有变化,原因是在ELF2平台上,当文件描述符关闭时,速度会重置为默认值。为了避免此问题,可以使用-w选项保持文件描述符打开。例如: 
可以使用printf命令格式化要发送的二进制数据。 例如,发送字节序列0x41、0x42、0x43并查看回复: 
最后如果不用了,就杀死后台进程: 
通过这种方式,开发者可以在 Linux 系统上方便地进行 SPI 设备的通信操作。 
 
如果是使用Python脚本,以下是使用spidev是进行 SPI 通信的基本步骤: 
1. 加载 spidev是模块: 
   在 Linux 系统中,需要确保spidev是模块已经加载。可以通过以下命令加载: 
   sudo modprobe spidev 
2. 打开 SPI 设备: 
   在用户空间中,使用 open()函数打开 SPI 设备文件,通常位于 /dev/ 目录下。设备文件名格式为 /dev/spidev<bus>.<device>,其中 <bus> 是总线号,<device> 是设备号。 
   import spidev 
   spi = spidev.SpiDev() 
   spi.open(4, 0)  # 打开 SPI 总线 0 的设备 0 
 
3. 配置 SPI 参数: 
   使用 spidev 库可以配置 SPI 的各种参数,包括最大时钟速度、模式、位顺序等。 
   spi.max_speed_hz = 500000  # 设置最大时钟速度为 500 kHz 
   spi.mode = 0b00            # 设置 SPI 模式为 0 
   spi.bits_per_word = 8      # 设置每个字的数据位数为 8 
 
4. 进行数据传输: 
   使用 xfer() 或 xfer2() 方法进行数据传输。xfer() 方法在发送和接收数据时会先发送然后接收,而 xfer2() 方法可以在同一时钟周期内同时发送和接收数据。 
   to_send = [0x01, 0x02, 0x03] 
   received = spi.xfer(to_send)  # 发送数据并接收响应 
   print(received)    
5. 关闭 SPI 设备: 
   完成通信后,使用 close() 方法关闭 SPI 设备。 
   spi.close() 
 
 |   
 
  
  
  
 
 
 | 
| 
 | 
| 
 | 
| 
 | 
 |