SPI外设配置
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。
Domain | Peripheral | Runtime allocation | Comment | |||
Instance | Cortex-A7 secure (OP-TEE) | Cortex-A7 non-secure (Linux) | Cortex-M4 (STM32Cube) | |||
Low speed interface | SPI | SPI2S1 | ☐ | ☐ | Assignment (single choice) | |
SPI2S2 | ☐ | ☐ | Assignment (single choice) | |||
SPI2S3 | ☐ | ☐ | Assignment (single choice) | |||
SPI4 | ☐ | ☐ | Assignment (single choice) | |||
SPI5 | ☐ | ☐ | Assignment (single choice) | |||
SPI6 | ☐ | ☐ | Assignment (single choice) |
Clock
Peripheral | Max Freq (MHz) | |
SPI2S1 | 200 | |
SPI2, SPI3 | 200 | |
SPI4, SPI5 | 133 | |
SPI6 | 133 |
SPI1控制器
Signal | Pin Name | J25 扩展座 |
SPI1_MISO | PZ1 | J25.30 |
SPI1_NSS | PZ3 | J25.21 |
SPI1_SCK | PZ0 | J25.16 |
SPI1_MOSI | PZ2 | J25.14 |
PB5 | J25.5 |
SPI2控制器
Signal | Pin Name | J25扩展座 |
SPI2_MISO | PI2 | J25.28 |
SPI2_NSS | PI0 | J25.26 |
SPI2_SCK | PB13 | J25.7 |
PI1 | J25.18 | |
SPI2_MOSI | PI3 | J25.24 |
PanGu开发板的J17 板对板扩展做支持四个SPI控制器,分别是SPI1, SPI2, SPI4, SPI6。
SPI1控制器
Signal | Pin Name | J17 扩展座 |
SPI1_MISO | PZ1 | J17.71 |
SPI1_NSS | PZ3 | J17.53 |
SPI1_SCK | PZ0 | J17.43 |
SPI1_MOSI | PZ2 | J17.35 |
PB5 | J17.14 | |
PF1 | J17.58 |
SPI2控制器
Signal | Pin Name | J17 扩展座 |
SPI1_MISO | PI2 | J17.54 |
SPI1_NSS | PI0 | J17.57 |
SPI1_SCK | PI1 | J17.49 |
PB13 | J17.46 | |
SPI1_MOSI | PI3 | J17.55 |
SPI4控制器
Signal | Pin Name | J17 扩展座 |
SPI1_MISO | PE13 | J17.31 |
SPI1_NSS | PE11 | J17.65 |
SPI1_SCK | PE12 | J17.63 |
SPI1_MOSI | PE14 | J17.25 |
SPI6控制器
Signal | Pin Name | J17 扩展座 |
SPI1_MISO | PZ1 | J17.71 |
PF1 | J17.58 | |
SPI1_NSS | PZ3 | J17.53 |
SPI1_SCK | PZ0 | J17.43 |
SPI1_MOSI | PZ2 | J17.35 |
PB5 | J17.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 Name | Pinmux |
SPI_CS | PZ3 |
SPI_MOSI | PZ2 |
SPI_MISO | PZ1 |
SPI_SCLK | PZ0 |
RESET | PI2 |
IRQ | PZ5 |
/ {
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:47