簡體   English   中英

為 max310x SPI-UART 轉換器啟用 RS485 模式

[英]Enable RS485 mode for max310x SPI-UART converter

在我的應用程序中,我需要 RS485 接口。 我正在使用 am3352 的一些 UART,但我需要更多,所以我正在嘗試使用 SPI 和 max3109 芯片進行擴展。

我已經使用模塊 max310x 成功地將 max3109 添加到我的設備樹 - 它顯示了兩個設備:/dev/ttyMAX0 和 /dev/ttyMAX1。 這是設備樹片段:

&spi1 {
    status = "okay";
    pinctrl-names = "default";
    pinctrl-0 = <&spi1_pins>;
    num_cs = <1>;
    cs-gpios = <&gpio2 17 0>;
    ti,pindir-d0-out-d1-in;

    max310x_0: max0@0 {
        compatible = "maxim,max3109";
        reg = <0>;
        spi-max-frequency = <24000000>;
        clocks = <&clk1m8>;
        clock-names = "xtal";
        interrupt-parent = <&gpio2>;
        interrupts = <12 IRQ_TYPE_EDGE_FALLING>;
        gpio-controller;
        #gpio-cells = <2>;
        clk1m8: clk1m8 {
            compatible = "fixed-clock";
            #clock-cells = <0>;
            clock-frequency = <1843200>;
        };
    };
};

和引腳:

spi1_pins: pinmux_spi1_pins {
    pinctrl-single,pins = <
        0x108 (PIN_INPUT_PULLUP | MUX_MODE2) /* (H16) gmii1_col.spi1_sclk */
        0x10c (PIN_INPUT_PULLUP | MUX_MODE2) /* (H17) gmii1_crs.spi1_d0 */
        0x110 (PIN_INPUT_PULLUP | MUX_MODE2) /* (J15) gmii1_rxer.spi1_d1 */
    >;
};

max3109 的 UART 連接到 rs232/rs485 轉換器,max3109 的 RTSn 引腳連接到 DE 和 RE 引腳。

問題:max3109 上的 UARTS 似乎工作正常 - 兩個 rs485 都在傳輸數據,但沒有接收。 問題是 RTS 始終處於 0V 電平...

在 am3352 的 UART 中,我在設備樹中使用以下屬性:“linux,rs485-enabled-at-boot-time”。 但是將它添加到主要的 max310x_0 節點沒有任何效果——這個節點是擴展器節點(包含 2 個 UART 和 gpio 控制器),而不是 UART 本身。

我的想法是我需要為每個 UART 添加一個子節點,並在其中放置屬性“linux,rs485-enabled-at-boot-time”。 但我不知道該怎么做。 我試過這樣的事情:

&spi1 {
    status = "okay";
    pinctrl-names = "default";
    pinctrl-0 = <&spi1_pins>;
    num_cs = <1>;
    cs-gpios = <&gpio2 17 0>;
    ti,pindir-d0-out-d1-in;

    max310x_0: max0@0 {
        compatible = "maxim,max3109";
        reg = <0>;
        spi-max-frequency = <24000000>;
        clocks = <&clk1m8>;
        clock-names = "xtal";
        interrupt-parent = <&gpio2>;
        interrupts = <12 IRQ_TYPE_EDGE_FALLING>;
        gpio-controller;
        #gpio-cells = <2>;
        clk1m8: clk1m8 {
            compatible = "fixed-clock";
            #clock-cells = <0>;
            clock-frequency = <1843200>;
        };
        ttyMAX0 {
            linux,rs485-enabled-at-boot-time;
        };
        ttyMAX1 {
            linux,rs485-enabled-at-boot-time;
        };
    };
};

但它沒有用。

我的問題:我應該如何添加這些子節點(如果這是正確的方法)以及我應該在它們中放置什么以使 RTS 工作?

編輯:在鋸末建議之后,似乎不可能在設備樹中添加 rs485 模式。 所以我嘗試將此功能添加到設備樹中,我想我開始了解這里的工作原理。 首先,我正在將port.flags值打印到dmesg ,看起來我的小插入工作(有點) - 它根據設備樹中linux,rs485-enabled-at-boot-time參數的存在來更改值。 這是我插入的代碼:

    if (of_property_read_bool(dev->of_node, "linux,rs485-enabled-at-boot-time")) 
    s->p[i].port.flags |= SER_RS485_ENABLED; 
    printk("s->p[i].port.flags is: %d\n",s->p[i].port.flags); 

port.flags切換從134225920134225921取決於存在linux,rs485-enabled-at-boot-time 但是 RTS 引腳在我的示波器上仍然具有恆定的 0V SER_RS485_RTS_ON_SEND ...我想弄清楚SER_RS485_RTS_ON_SENDSER_RS485_RTS_AFTER_SEND是否與此有關,但我確信它僅用於恢復 RTS 信號。

經過幾次嘗試, IOCTL是最好和最簡單的解決方案。 這是一些對我有很大幫助的示例代碼。 https://gist.github.com/amarburg/07564916d8d32e20e6ae375c1c83a995

這是如何使用IOCTL打開和關閉 RS485 模式並讀取其當前模式的基本示例。 適用於兩個 CPU 內部 UARTS 和 MAX3109。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM