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 interfaceSPISPI2S1Assignment (single choice)
SPI2S2Assignment (single choice)  
SPI2S3Assignment (single choice)  
SPI4Assignment (single choice)  
SPI5Assignment (single choice)  
SPI6Assignment (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";
	};
};
作者:SteveChen  创建时间:2024-09-18 17:45
最后编辑:SteveChen  更新时间:2024-09-18 17:47
上一篇:
下一篇: