物联网嵌入式工程师40周[包含电子书]|之SPI总线通信

246 阅读11分钟

物联网嵌入式工程师40周[包含电子书]|之SPI总线通信

附上资源MP4下载地址

我用夸克网盘分享了「2025年物联网嵌入式工程师40周[包含电子书]-完结」,点击链接即可保存。打开「夸克APP」,无需下载在线播放视频,畅享原画5倍速,支持电视投屏。 链接:pan.quark.cn/s/3b0a95006…

失效访问:cowcowit.com/course/4/4

SPI(Serial Peripheral Interface),串行外围设备接口。是由Motorola公司开发,用来在微控制器和外围设备芯片之间提供一个低成本、易使用的接口。这种接口可以用来连接存储器(存储数据)、AD转换器、DA转换器、实时时钟、LCD驱动器、传感器、音频芯片、甚至其他处理器。

与标准的串行端口不同,SPI是一个同步协议接口,所有的传输都参照一个共同的时钟,这个同步时钟信号由主机(处理器)产生。接收数据的外设(从设备)使用时钟对串行比特流的接收进行同步化。当有多个芯片连接到主机的同一个SPI接口上,这时主机通过触发从设备的芯片的片选输入引脚来选择接收数据的从设备,没有被选中的外设将不会参与SPI传输。

SPI主要使用4个信号:

l 主机输输出/从机输入(MOSI: Master Output Slave Input)

l 主机输入/从机输出(MISO:Master Input Slave Output)

l 串行时钟(SCLK或SCK)

l 外设片选(CS)

1.主机和从机连接方式

2.主机和从机数据传输

**主机和从机都包含一个串行移位器,主机通过向它的SPI串行移位器写入一个字节发起一次传输。****移位器通过MOSI信号线将字节传送给从机,从机也将自己的移位器中的内容通过MISO信号线返回给主机。这样两个移位寄存器中的内容就被交换了。**从机的写操作和读操作时同步完成的,因此SPI成为一个很有效的协议。

注意:

如果只是进行写操作,主机只需忽略收到的字节**;**反过来,如果主机要读取从机的一个字节,就必须发送一个空字节来引发从机的传输。

二、SPI时序

通过SPI总线在主机和从机之间传输数据,必须保证主机发出的时序和从机所要求的时序一致才可以。在SPI总线时序中有两个非常重要的概念,我们先来了解一下。

1.时钟极性与时钟相位

l 时钟极性

¢ Clock Polarity ,简称CPOL或POL, 指SPI CLK在空闲时的电平,是0还是1

l 时钟相位

¢ Clock Phase ,简称CPHA或PHA, 指数据采样的时候,是CLK的第一个边沿还是第二个边沿。

¢ CPHA=0,CLK的第一个边沿采样

¢ CPHA=1,CLK的第二个边沿采样

将CPOL和CPHA进行组合,可以得到SPI主要有四种模式的时序:

Mode 0CPOL = 0,CPHA = 0Mode 1CPOL = 0,CPHA = 1Mode 2CPOL = 1,CPHA = 0Mode 3CPOL = 1,CPHA = 1

对应到时序图的关系如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.SPI的四种时序

1.CPOL = 0,CPHA = 0

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

SPI CLK空闲时为低电平,所以CPOL=0,CLK的第一个边沿采样,所以CPHA=0

2.CPOL = 0,CPHA = 1

SPI CLK空闲时为低电平,所以CPOL=0,CLK的第二个边沿采样,所以CPHA=1

3.CPOL = 1,CPHA = 0

SPICLK空闲时为高电平,所以CPOL=1,CLK第一个边沿采样,所以CPHA=0

4.CPOL = 1,CPHA = 1

SPICLK空闲时为高电平,所以CPOL=1,CLK第二个边沿采样,所以CPHA=1

三、I.MX6ull SPI控制器介绍

The Enhanced Configurable Serial Peripheral Interface (ECSPI) is a full-duplex, synchronous, four-wire serial communication block.

增强型可配置串行外设接口(ECSPI)是一种全双工、同步、四线制串行通信模块。

The ECSPI contains a 64 x 32bit receive buffer (RXFIFO) and a 64 x 32bit transmit buffer (TXFIFO). With data FIFOs, the ECSPI allows rapid data communication with fewer software interrupts. The figure below shows a block diagram of the ECSPI.

ECSPI包含一个64 x 32接收缓冲器(RXFIFO)和一个64 x 32发送缓冲器(TXFIFO)。通过数据FIFO,ECSPI允许以更少的软件中断进行快速数据通信。下图显示了ECSPI的框图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Key features of the ECSPI include(全双工同步串行接口):

l Full-duplex synchronous serial interface(全双工同步串行接口)

l Master/Slave configurable (主/从配置)

l Four Chip Select (SS) signals to support multiple peripherals (支持多种外设的四芯片选择(SS)信号)

l Transfer continuation function allows unlimited length data transfers(传输延续功能允许无限长度的数据传输)

l 32-bit wide by 64-entry FIFO for both transmit and receive data (32位宽、64条目FIFO,用于传输和接收数据)

l Polarity and phase of the Chip Select (SS) and SPI Clock (SCLK) are configurable (芯片选择(SS)和SPI时钟(SCLK)的极性和相位是可配置的)

l Direct Memory Access (DMA) support (直接内存访问(DMA)支持)

l Max operation frequency up to the reference clock frequency(最大工作频率可达参考时钟频率)

1.Clocks

2.Master Mode

When the ECSPI is configured as a master, it uses a serial link to transfer data between the ECSPI and an external slave device.

当ECSPI配置为主设备时,它使用串行链路在ECSPI和外部从设备之间传输数据。

One of the Chip Select (SS) signals and the clock signal (SCLK) are used to transfer data between two devices. If the external device is a transmit-only device, the ECSPI master’s output port can be ignored and used for other purposes. In order to use the internal TXFIFO and RXFIFO, two auxiliary output signals, Chip Select (SS) and SPI_RDY, are used for data transfer rate control. Software can also configure the sample period control register to a fixed data transfer rate.

一个芯片选择(SS)信号和时钟信号(SCLK)用于在两个设备之间传输数据。如果外部设备是仅传输设备,则可以忽略ECSPI主站的输出端口并用于其他目的。为了使用内部TXFIFO和RXFIFO,两个辅助输出信号芯片选择(SS)和SPI_RDY用于数据搬迁速率控制。软件还可以将采样周期控制寄存器配置为固定的数据搬迁速率。

The ECSPI master uses the Chip Select (SS) signal to enable an external SPI device, and uses the SCLK signal to transfer data in and out of the Shift register.

ECSPI主机使用芯片选择(SS)信号来启用外部SPI设备,并使用SCLK信号将数据传入和传出Shift寄存器。

The SPI_RDY enables fast data communication with fewer software interrupts. By programming the ECSPI_PERIODREG register accordingly, the ECSPI can be used for a fixed data transfer rate.

该SPI_RDY能够以更少的软件中断实现快速数据通信。通过对ECSPI_PERIODREG寄存器进行相应的编程,ECSPI可用于固定的数据搬迁速率。

When the ECSPI is in Master mode the SS, SCLK, and MOSI are output signals, and the MISO signal is an input.

当ECSPI处于主模式时,SS、SCLK和MOSI是输出信号,MISO信号是输入信号。

In the above figure, the Chip Select (SS) signal enables the selected external SPI device, and the SCLK synchronizes the data transfer.The MOSI and MISO signals change on rising edge of SCLKandthe MISO signal is latched on the falling edge of the SCLK. The figure above shows a data of 0xD2 is shifted out, and a data of 0x66 is shifted in.

在上图中,芯片选择(SS)信号启用选定的外部SPI设备,SCLK同步数据搬迁。MOSI和MISO信号沿SCLK的上升沿变化,MISO信号锁存在SCLK的下降沿。上图显示一个0xD2的数据移出,一个0x66的数据移入。

四、SPI控制器重点寄存器介绍

1.Control Register (ECSPIx_CONREG)

The Control Register (ECSPI_CONREG) allows software to enable the ECSPI , configure its operating modes, specify the divider value, and SPI_RDY control signal, and define the transfer length.

控制寄存器(ECSPI_CONREG)允许软件启用ECSPI,配置其操作模式,指定分频器值,SPI_RDY控制信号,并定义传输长度。

2.Config Register (ECSPIx_CONFIGREG)

The Config Register (ECSPI_CONFIGREG) allows software to configure each SPI channel,configure its operating modes, specify the phase and polarity of the clock, configure the Chip Select (SS), and define the HT transfer length. Note, HT mode is not supported by this product.

配置寄存器(ECSPI_CONFIGREG)允许软件配置每个SPI通道,配置其工作模式,指定时钟的相位和极性,配置芯片选择(SS),并定义HT传输长度。注意,本产品不支持HT模式。

3.Status Register (ECSPIx_STATREG)

4.Test Control Register (ECSPIx_TESTREG)

5.Receive Data Register (ECSPIx_RXDATA)

The Receive Data register (ECSPI_RXDATA) is a read-only register that forms the top word of the 64 x 32 receive FIFO. This register holds the data received from an external SPI device during a data transaction. Only word-sized read operations are allowed.

接收数据寄存器(ECSPI_RXDATA)是一个只读寄存器,构成64 x 32接收FIFO的顶部字。该寄存器保存数据事务期间从外部SPI设备接收的数据。只允许字大小的读取操作。

6.Transmit Data Register (ECSPIx_TXDATA)

The Transmit Data (ECSPI_TXDATA) register is a write-only data register that forms the bottom word of the 64 x 32 TXFIFO. The TXFIFO can be written to as long as it is not full, even when the SPI Exchange bit (XCH) in ECSPI_CONREG is set. This allows software to write to the TXFIFO during a SPI data exchange process. Writes to this register are ignored when the ECSPI is disabled (ECSPI_CONREG[EN] bit is cleared).

传输数据(ECSPI_TXDATA)寄存器是一个只写的数据寄存器,它构成了64 x 32 TXFIFO的底部字。TXFIFO可以被写入,只要它没有满,即使设置了ECSPI_CONREG中的SPI交换位(XCH)。这允许软件在SPI数据交换过程中写入TXFIFO。当ECSPI被禁用时(ECSPI_CONREG[EN]位被清除),写入该寄存器将被忽略。

五、SPI硬件原理图分析

六、回环测试SPI通信是否正常

将设备端的RFID_MISO与RFID_MOSI用杜邦线相连接,让SPI的输出接SPI的输入,形成回路,测试SPI通信是否正常。

1.管脚初始化

1 void spi_pin_init(void)

2 {

3 //0011 ALT3 — Select mux mode: ALT3 mux port: ECSPI4_MISO of instance: ecspi4

4 IOMUXC_SW_MUX_CTL_PAD_GPIO2_IO14 &= ~(0xf << 0);

5 IOMUXC_SW_MUX_CTL_PAD_GPIO2_IO14 |= (0x3 << 0);

6

7 //0011 ALT3 — Select mux mode: ALT3 mux port: ECSPI4_MOSI of instance: ecspi4

8 IOMUXC_SW_MUX_CTL_PAD_GPIO2_IO13 &= ~(0xf << 0);

9 IOMUXC_SW_MUX_CTL_PAD_GPIO2_IO13 |= (0x3 << 0);

10

11 //0011 ALT3 — Select mux mode: ALT3 mux port: ECSPI4_SCLK of instance: ecspi4

12 IOMUXC_SW_MUX_CTL_PAD_GPIO2_IO12 &= ~(0xf << 0);

13 IOMUXC_SW_MUX_CTL_PAD_GPIO2_IO12 |= (0x3 << 0);

14

15 //0101 ALT5 — Select mux mode: ALT5 mux port: GPIO1_IO03 of instance: gpio1 for spi cs

16 IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 &= ~(0xf << 0);

17

18 return;

19 }

2.控制器初始化

1 void spi_con_init(void)

2 {

3 /*

4 BURST_LENGTH [31-20] 0x007 A SPI burst contains the 8 LSB in a word.

5 PRE_DIVIDER [15-12] 0x09 SPI Pre Divider

6 POST_DIVIDER [11-8 ] 0000 Divide by 1.

7 SPI Clock = 60MHZ /PRE_DIVIDER/POST_DIVIDER

8 = 60MHZ /(9 + 1)/2^0

9 = 6MHZ

10

11 SMC [3 ] 1 Immediately starts a SPI burst when data is written in TXFIFO.

12 EN [0 ] 1 Enable the block.

13 */

14 ECSPI4->CONREG = (0x7 << 20) | (0x9 << 12) | (0x0 << 8) | (1 << 3) | (1 << 0);

15

16 return;

17 }

3.SPI通道配置

1 void spi_channel_config(uint8_t channel,uint8_t parse,uint8_t pol)

2 {

3 /*1.Select Channel

4 *

5 *CHANNEL_SELECT [19–18] SPI CHANNEL SELECT bits.

6 *CHANNEL_MODE [7-4 ] 1 Master mode.

7 */

8 ECSPI4->CONREG &= ~(0x3 << 18);

9 ECSPI4->CONREG |= (channel << 18);

10 ECSPI4->CONREG |= (1 << (channel + 4));

11

12 /*2.Config spi timing

13 *

14 *SCLK_POL [7-4] SPI Clock Polarity Control.

15 *SCLK_PHA [3-0] SPI Clock/Data Phase Control.

16 */

17 ECSPI4->CONFIGREG &= (1 << (channel + 4));

18 ECSPI4->CONFIGREG |= (pol << (channel + 4));

19

20 ECSPI4->CONFIGREG &= (1 << (channel + 0));

21 ECSPI4->CONFIGREG |= (parse << (channel + 0));

22

23 return;

24 }

4.收发数据与片选信号

1 uint8_t spi_transfer(uint8_t tx_data)

2 {

3 int flag;

4 uint8_t rx_data;

5

6 ECSPI4->TXDATA = tx_data;

7 do{

8 /*

9 TE [0] 1 TXFIFO is empty.

10 */

11 flag = ECSPI4->STATREG & (1 << 0);

12 }while(!flag);

13

14 do{

15 /*

16 RR [3] 1 More than 1 word in RXFIFO.

17 */

18 flag = ECSPI4->STATREG & (1 << 3);

19 }while(!flag);

20

21 rx_data = ECSPI4->RXDATA;

22

23 return rx_data;

24 }

25 void spi_cs_start(void)

26 {

27 GPIO1->GDIR |= (1 << 3);

28 GPIO1->DR &= ~(1 << 3);

29

30 return;

31 }

32

33 void spi_cs_stop(void)

34 {

35 GPIO1->GDIR |= (1 << 3);

36 GPIO1->DR |= (1 << 3);

37 return;

38 }

5.测试代码

1 void spi_test(void)

2 {

3 uint8_t data;

4 uint8_t ch;

5

6 spi_pin_init();

7 spi_con_init();

8 spi_channel_config(0,0,0);

9

10 while(1){

11 for(ch = 'a';ch <= 'z'; ch ++){

12 spi_cs_start();

13 data = spi_transfer(ch);

14 spi_cs_stop();

15 uart_printf("%c\r\n",data);

16 gpt_delay_ms(500);

17 }

18 }

19

20 return;

21 }