diff --git a/docs/Application_guide/zh/bsp/media/media_SPI_1.jpg b/docs/Application_guide/zh/bsp/media/media_SPI_1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f9e636fa9fc329c164c2e2f42f31795b5c61abaf Binary files /dev/null and b/docs/Application_guide/zh/bsp/media/media_SPI_1.jpg differ diff --git a/docs/Application_guide/zh/bsp/media/media_SPI_2.jpg b/docs/Application_guide/zh/bsp/media/media_SPI_2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7ac14f0715250687e91e68bf13d5b98b4efac075 Binary files /dev/null and b/docs/Application_guide/zh/bsp/media/media_SPI_2.jpg differ diff --git a/docs/Application_guide/zh/bsp/media/media_SPI_3.jpg b/docs/Application_guide/zh/bsp/media/media_SPI_3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cf87c486c4832c74f3d20170f7cd64faf10d774a Binary files /dev/null and b/docs/Application_guide/zh/bsp/media/media_SPI_3.jpg differ diff --git a/docs/Application_guide/zh/bsp/media/media_SPI_4.jpg b/docs/Application_guide/zh/bsp/media/media_SPI_4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..66b9a7b203f332146efb947dc5c550a98c413dd5 Binary files /dev/null and b/docs/Application_guide/zh/bsp/media/media_SPI_4.jpg differ diff --git a/docs/Application_guide/zh/bsp/media/media_SPI_5.jpg b/docs/Application_guide/zh/bsp/media/media_SPI_5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..88c9a0922849681691935bf954f22daf1123b45e Binary files /dev/null and b/docs/Application_guide/zh/bsp/media/media_SPI_5.jpg differ diff --git a/docs/Application_guide/zh/bsp/media/media_SPI_6.jpg b/docs/Application_guide/zh/bsp/media/media_SPI_6.jpg new file mode 100644 index 0000000000000000000000000000000000000000..86e7fbfce741edf00face5e7bebed76fbf98c6b9 Binary files /dev/null and b/docs/Application_guide/zh/bsp/media/media_SPI_6.jpg differ diff --git a/docs/Application_guide/zh/bsp/spi.md b/docs/Application_guide/zh/bsp/spi.md index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..f0a6de297c26bd37506c85f13381caa6305683dc 100644 --- a/docs/Application_guide/zh/bsp/spi.md +++ b/docs/Application_guide/zh/bsp/spi.md @@ -0,0 +1,93 @@ +# SPI通信 + +SPI,是英语 Serial Peripheral interface 的缩写,顾名思义就是串行外围设备接口。是 Motorola 首先在其 MC68HCXX 列处理器上定义的。SPI接口主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。SPI是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议。 + +本文档主要介绍如何使用 QuecPython_SPI 功能,通过本文你将了解到 QuecPython_SPI 的参数设置及使用方法。 + + + +## SPI 简介 + +### 主-从模式(Master-Slave) + +SPI 规定了两个 SPI 设备之间通信必须由主设备 (Master) 来控制次设备 (Slave)。一个 Master 设备可以通过提供 Clock 以及对 Slave 设备进行片选 (Slave Select) 来控制多个 Slave 设备,SPI 协议还规定 Slave 设备的 Clock 由 Master 设备通过 SCK 管脚提供给 Slave 设备,Slave 设备本身不能产生或控制 Clock,没有 Clock 则 Slave 设备不能正常工作。 + +![media_SPI_1](media/media_SPI_1.jpg) + + + +### 同步方式(Synchronous) + +Master 设备会根据将要交换的数据来产生相应的时钟脉冲(Clock Pulse),时钟脉冲组成了时钟信号(Clock Signal),时钟信号通过时钟极性 (CPOL) 和 时钟相位 (CPHA) 控制着两个 SPI 设备间何时数据交换以及何时对接收到的数据进行采样,来保证数据在两个设备之间是同步传输的。 + +![media_SPI_2](media/media_SPI_2.jpg) + + + +### 四种通信模式 + +**时钟极性 CPOL** 是指 SPI 通讯设备处于空闲状态时,SCK 信号线的电平信号(即 SPI 通讯开始前、 NSS 线为高电平时 SCK 的状态)。 CPOL=0 时, SCK 在空闲状态时为低电平,CPOL=1 时,则相反。 + + **时钟相位 CPHA** 是指数据的采样的时刻,当 CPHA=0 时, MOSI 或 MISO 数据线上的信号将会在 SCK 时钟线的“奇数边沿” 被采样。当 CPHA=1 时,数据线在 SCK 的“偶数边沿” 采样。 + +根据 **时钟极性 CPOL** 与 **时钟相位 CPHA** 的不同,SPI具有四种通信模式。 + +![media_SPI_3](media/media_SPI_3.jpg) + +![media_SPI_4](media/media_SPI_4.jpg) + +![media_SPI_5](media/media_SPI_5.jpg) + + + +### 数据交换(Data Exchanges) + +SPI 设备间的数据传输之所以又被称为数据交换,是因为 SPI 协议规定一个 SPI 设备不能在数据通信过程中仅仅只充当一个 "发送者(Transmitter)" 或者 "接收者(Receiver)"。在每个 Clock 周期内,SPI 设备都会发送并接收一个 bit 大小的数据,相当于该设备有一个 bit 大小的数据被交换了。 + +一个 Slave 设备要想能够接收到 Master 发过来的控制信号,必须在此之前能够被 Master 设备进行访问 (Access)。所以, Master 设备必须首先通过 SS/CS pin 对 Slave 设备进行片选,把想要访问的 Slave 设备选上,在数据传输的过程中,每次接收到的数据必须在下一次数据传输之前被采样。如果之前接收到的数据没有被读取,那么这些已经接收完成的数据将有可能会被丢弃,导致 SPI 物理模块最终失效。因此,在程序中一般都会在 SPI 传输完数据后,去读取 SPI 设备里的数据,即使这些数据(Dummy Data)在我们的程序里是无用的。 + +SPI只有主模式和从模式之分,没有读和写的说法。因为实质上每次SPI是主从设备在交换数据。也就是说,你发一个数据必然会收到一个数据;你要收一个数据必须也要先发一个数据。 + + + +## SPI通信 + +### 实验代码 + +以下代码适合EC600x 开发板进行 SPI 自发自收通信测试。**实验前提:短接 SPI_MISO 与 SPI_MOSI 引脚**。 + +```python +# -*- coding: UTF-8 -*- +import utime +from machine import SPI +from machine import Pin + +# 屏蔽GNSS模块数据干扰. 由于EC600S/N的SPI_MISO与SPI_MOSI引脚还被复用为UART1. 开发板还连接GNSS模块L76K, 为了断开L76K吐数据对SPI通信的干扰, 需要添加下面两句代码. +gpio11 = Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PD, 0) # EC600S/EC600N使用 +gpio11.write(0) # EC600S/EC600N使用 + +w_data = "test" +r_data = bytearray(len(w_data)) +count = 10 # 运行次数 + +# 以下代码根据模块型号进行选择. +spi_obj = SPI(1, 0, 1) # EC600S/N使用 +# spi_obj = SPI(0, 0, 1) # EC600U使用 + +while count: + count -= 1 + utime.sleep(1) + ret = spi_obj.write_read(r_data, w_data, 100) + if ret == -1: + SPI_msg = "SPIReadError" + else: + SPI_msg = "SPIRead:{} running:{:0>2d}".format(r_data, count) + print(SPI_msg) +``` + + + +### 实验现象 + +![media_SPI_6](media/media_SPI_6.jpg) +