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。

 

PanGu开发板的J25扩展座支持两个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)  

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使用SPI

  • 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使用SPI

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

使用MCP2515

/ {
	clk8m: clk8m {
		compatible = "fixed-clock";
		#clock-cells = <0>;
		clock-frequency = <8000000>;
	};

	reg_5v0: regulator-5v0 {
		compatible = "regulator-fixed";
		regulator-name = "5V";
		regulator-min-microvolt = <5000000>;
		regulator-max-microvolt = <5000000>;
	};
};

&spi6 {
	pinctrl-names = "default", "sleep";
	pinctrl-0 = <&spi6_pins_a>;
	pinctrl-1 = <&spi6_sleep_pins_a>;
	cs-gpios = <&gpioz 3 0>;
	status = "okay";

	mcp2515: can@0 {
		compatible = "microchip,mcp2515";
		reg = <0>;
		clocks = <&clk8m>;
		interrupt-parent = <&gpiog>;
		interrupts = <1 IRQ_TYPE_EDGE_FALLING>;
		spi-max-frequency = <10000000>;
		vdd-supply = <&v3v3>;
		xceiver-supply = <&reg_5v0>;
		status = "okay";
	};
};
作者:SteveChen  创建时间:2024-09-18 14:55
最后编辑:SteveChen  更新时间:2024-09-18 14:56
上一篇:
下一篇: