我无法从应用程序中找到任何直接使用SPI的示例。相反,有许多传感器使用SPI作为总线。
我试图从头开始编写它,但在将设备绑定到spi-device节点时遇到了问题。我还应该提到,我有其他外围设备的工作样本,如SPI或ADC,所以我认为这是SPI的问题,而不是项目配置的问题。
以下是装置的节选:
&spi1 {
pinctrl-0 = <&spi1_sck_pb3 &spi1_miso_pb4 &spi1_mosi_pb5>;
cs-gpios = <&gpiob 9 GPIO_ACTIVE_LOW>;
status = "okay";
spi1_dev0: spi-device@0 {
reg = <0>;
spi-max-frequency = <1000000>;
label = "spi_dev1";
status = "okay";
};
};我在项目配置中设置了SPI:
CONFIG_GPIO=y
CONFIG_SPI=y
CONFIG_SPI_STM32=y
CONFIG_SPI_STM32_USE_HW_SS=n但是不幸的是,spi1_dev0设备的DT节点无法被解析。
const struct device *spi_dev = device_get_binding(DT_NODELABEL(spi1_dev0));
const struct spi_config *spi_cfg = SPI_CONFIG_DT(DT_NODELABEL(spi1_dev0), SPI_WORD_SET(8), 10);编译zephyr/include/generated/devicetree_unfixed.h:11068:34:错误:“DT_N_S_soc_S_spi_40013000_S_spi_device_0”未声明(在此函数中首次使用);您的意思是'DT_N_S_soc_S_spi_40013000_S_spi_device__BUS'?吗?
我还试图在DT_BUS的基础上使用DT_NODELABEL,但没有成功。
可以直接使用像SPI或I2C这样的总线吗?
发布于 2021-09-12 15:33:10
以下几点对我来说是可行的:
...
#include <drivers/gpio.h>
#include <drivers/spi.h>
struct spi_cs_control spi_cs = {
/* PA4 as CS pin */
.gpio_dev = DEVICE_DT_GET(DT_NODELABEL(gpioa)),
.gpio_pin = 4,
.gpio_dt_flags = GPIO_ACTIVE_LOW,
/* delay in microseconds to wait before starting the transmission and before releasing the CS line */
.delay = 10,
};
#define SPI_CS (&spi_cs)
struct spi_config spi_cfg = {
.frequency = 350000,
.operation = SPI_OP_MODE_MASTER | SPI_TRANSFER_MSB | SPI_WORD_SET(8) | SPI_LINES_SINGLE | SPI_LOCK_ON,
.cs = SPI_CS,
};
void spi_init()
{
spi = device_get_binding("SPI_1");
....
}SPI_1是设备树中spi_1节点的标签。检查构建文件夹中的zephyr.dts文件,以查找spi节点标签。下面是一个示例:
spi1: arduino_spi: spi@40013000 {
compatible = "st,stm32-spi-fifo", "st,stm32-spi";
#address-cells = < 0x1 >;
#size-cells = < 0x0 >;
reg = < 0x40013000 0x400 >;
clocks = < &rcc 0x3 0x1000 >;
interrupts = < 0x23 0x5 >;
status = "okay";
label = "SPI_1";
pinctrl-0 = < &spi1_sck_pa5 &spi1_miso_pa6 &spi1_mosi_pa7 >;
cs-gpios = < &gpiod 0xe 0x11 >;当然,您可以用自己的.overlay文件覆盖这些设置。
https://stackoverflow.com/questions/67962637
复制相似问题