i2X-MP15X开发板

SPI外设可用于使用SPI(Serial Peripheral Interface)与外部设备进行通信。
SPI控制器的一个子集支持I2S音频协议。这些SPI/I2S外设配置为I2S接口时,也可以在音频应用程序中使用。
SPI特性:

  • 包含6个SPI控制器(SPI2S1, SPI2S2, SPI2S3, SPI4, SPI5, SPI6)。

  • master mode 和 slave mode通信速率在50Mbit/s。

  • 所有SPI接口都支持NSS pulse mode,TI mode,硬件CRC计算以及具有DMA功能的8个8bit Rx和Tx FIFO。

  • 可以将SPI6(在ETZPC中)定义为只能由安全软件访问。

SPI/I2S特性:

  • 有三个控制器支持标准的I2S接口(I2S1, I2S2, I2S3复用SPI1, SPI2, SPI3)。

  • 三个控制器可以在master或slave模式,可配置为full-duplex或half-duplex。

  • 所有I2S接口均支持具有DMA功能的16个8bit Rx和Tx 的FIFO。

 

i2X-MP15X开发板的支持两个SPI控制器,分别是SPI1, SPI2。

DomainPeripheralRuntime allocationComment   
InstanceCortex-A7
secure
(OP-TEE)
Cortex-A7
non-secure
(Linux)
Cortex-M4
(STM32Cube)
   
Low speed interfaceSPISPI2S1☐☐Assignment (single choice)
SPI2S2☐☐Assignment (single choice)  
SPI2S3☐☐Assignment (single choice)  
SPI4☐☐Assignment (single choice)  
SPI5☐☐Assignment (single choice)  
SPI6☐☐Assignment (single choice)  

Clock

PeripheralMax Freq (MHz)
SPI2S1200
SPI2, SPI3200
SPI4, SPI5133
SPI6133

SPI1控制器

SignalPin NameJ25 扩展座
SPI1_MISOPZ1J25.30
SPI1_NSSPZ3J25.21
SPI1_SCKPZ0J25.16
SPI1_MOSIPZ2J25.14
PB5J25.5

SPI2控制器

SignalPin NameJ25扩展座
SPI2_MISOPI2J25.28
SPI2_NSSPI0J25.26
SPI2_SCKPB13J25.7
PI1J25.18
SPI2_MOSIPI3J25.24

PanGu开发板的J17 板对板扩展做支持四个SPI控制器,分别是SPI1, SPI2, SPI4, SPI6。
SPI1控制器

SignalPin NameJ17 扩展座
SPI1_MISOPZ1J17.71
SPI1_NSSPZ3J17.53
SPI1_SCKPZ0J17.43
SPI1_MOSIPZ2J17.35
PB5J17.14
PF1J17.58

SPI2控制器

SignalPin NameJ17 扩展座
SPI1_MISOPI2J17.54
SPI1_NSSPI0J17.57
SPI1_SCKPI1J17.49
PB13J17.46
SPI1_MOSIPI3J17.55

SPI4控制器

SignalPin NameJ17 扩展座
SPI1_MISOPE13J17.31
SPI1_NSSPE11J17.65
SPI1_SCKPE12J17.63
SPI1_MOSIPE14J17.25

SPI6控制器

SignalPin NameJ17 扩展座
SPI1_MISOPZ1J17.71
PF1J17.58
SPI1_NSSPZ3J17.53
SPI1_SCKPZ0J17.43
SPI1_MOSIPZ2J17.35
PB5J17.14

 

CA7配置

  • cs-gpios 代表对应GPIO作为CS信号的列表。

从设备的配置参数

  • *compatible *代表从设备的驱动名称

  • reg 代表从设备和对应CS信号

  • spi-max-frequency 代表最大的SPI时钟速度,单位 Hz

&spi1 {
	pinctrl-names = "default", "sleep";
	pinctrl-0 = <&spi1_pins_a>;
	pinctrl-1 = <&spi1_sleep_pins_a>;
	cs-gpios = <&gpioz 3 0>;
	status = "okay";

	st33zp24@0 {
		compatible = "st,st33htpm-spi";
		#address-cells = <1>;
		#size-cells = <0>;
		reg = <0>; /* CS #0 */
		spi-max-frequency = <10000000>;
	};
};

CM4配置

STM32MP1平台的SPI控制器也可以在CM4侧来使用,使用前需要先在dts代码中禁用对应spi的控制器,开启CM4侧的控制器。

&spi1 {
		status = "disabled";
};
&m4_spi1 {
		pinctrl-names = "rproc_default";
		pinctrl-0 = <&spi1_pins_a>;
		status = "okay";
};

CA7配置spidev驱动

如果开发者需要在用户空间与SPI总线的丛设备使用自定义方式通迅,可以使用spidev方式。
PanGu开发板J25扩展座上已经有SPI控制器信号,可以直接配置使用。下面配置spi1为启用状态,CS信号由PI1来控制。
Linux kernel的配置需要启用"CONFIG_SPI_SPIDEV"选项后才能使用,PanGu开发板的系统已经启用了SPIDEV功能,可以直接使用。添加下面的代码到arch/arm/boot/dts/stm32mp157a-panguboard.dts文件内。

&spi1 {
         pinctrl-names = "default", "sleep";
         pinctrl-0 = <&spi1_pins_a>;
         pinctrl-1 = <&spi1_sleep_pins_a>;
         cs-gpios = <&gpioi 1 0>;
         status = "okay";

         spidev@0 {
                 compatible = "spidev";
                 reg = <0>;
                 spi-max-frequency = <660000>;
         };
};

修改好后,重新编译dtb并且更新到开发板上

make dtbs

重新启动系统后,系统将会出现"/dev/spidev0.0"设备,表示spidev设备可以使用了。

root@pangu:~# ls /dev/spidev0.0
/dev/spidev0.0

CA7配置sc16is752

sc16is752芯片的功能是支持通过I2C或SPI接口来扩展串口。

Function NamePinmux
SPI_CSPZ3
SPI_MOSIPZ2
SPI_MISOPZ1
SPI_SCLKPZ0
RESETPI2
IRQPZ5
/ {
	clocks {
		clk_sc16is752: clk_sc16is752 {
			compatible = "fixed-clock";
			#clock-cells = <0>;
			clock-frequency = <14745600>;
		};
	};
};

&spi1 {
	pinctrl-names = "default", "sleep";
	pinctrl-0 = <&spi1_pins_a>;
	pinctrl-1 = <&spi1_sleep_pins_a>;
	cs-gpios = <&gpioz 3 0>;
	status = "okay";

	sc16is752: sc16is752@0 {
		compatible = "nxp,sc16is752";
		clocks = <&clk_sc16is752>;
		#address-cells = <1>;
		#size-cells = <0>;
		reg = <0>;
		interrupt-parent = <&gpioz>;
		interrupts = <5 IRQ_TYPE_EDGE_FALLING>;
		reset-gpios = <&gpioi 2 GPIO_ACTIVE_LOW>;
		spi-max-frequency = <400000>;
		gpio-controller;
		#gpio-cells = <0>;
		status = "okay";
	};
};