首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何直接使用Zephry SPI驱动程序?

如何直接使用Zephry SPI驱动程序?
EN

Stack Overflow用户
提问于 2021-06-13 21:03:12
回答 1查看 2.1K关注 0票数 3

我无法从应用程序中找到任何直接使用SPI的示例。相反,有许多传感器使用SPI作为总线。

我试图从头开始编写它,但在将设备绑定到spi-device节点时遇到了问题。我还应该提到,我有其他外围设备的工作样本,如SPI或ADC,所以我认为这是SPI的问题,而不是项目配置的问题。

以下是装置的节选:

代码语言:javascript
复制
&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:

代码语言:javascript
复制
CONFIG_GPIO=y
CONFIG_SPI=y
CONFIG_SPI_STM32=y
CONFIG_SPI_STM32_USE_HW_SS=n

但是不幸的是,spi1_dev0设备的DT节点无法被解析。

代码语言:javascript
复制
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这样的总线吗?

EN

回答 1

Stack Overflow用户

发布于 2021-09-12 15:33:10

以下几点对我来说是可行的:

代码语言:javascript
复制
...
#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节点标签。下面是一个示例:

代码语言:javascript
复制
        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文件覆盖这些设置。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67962637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档