cancel
Showing results for 
Search instead for 
Did you mean: 

PSoC™ 4

TeMa_2997106
Contributor II

過去に、下記の質問をしました。

UARTの反転出力

この際に、デバイスによっては、と注釈付きでUARTの反転出力が可能との回答でしたが、

SCBのUARTはやはり反転は難しそうです。

[Show UART terminals]からUARTのTX/RX信号を引っ張り出した後、

SmartIOに接続してみましたが、Buildが通りませんでした。

(レポートを確認しても詳細がわからず)

必然的に、UDBでUARTを作る形になりそうなのですが、

上記のようにSCBでUARTの構成をした上で反転の制御をする(SmartIOでもUDBでも可)、

ということは可能なのでしょうか。可能であれば、どのように設定すればよいでしょうか。

ターゲットデバイスは現時点ではPSoC4の4100Sか4100S Plusです。

UDBありきであればデバイス変更を検討します。

宜しくお願いします。

0 Likes
1 Solution
MotooTanaka
Esteemed Contributor

こんにちは、

過去に考え無しに一手間と書いたものです・・・ orz

CQ出版 トラ技の付録でついてきた TSoC基板 (CY8C4146LQI-S433) を使用して実験をしてみました。

IMG_4290.JPG

回路図

※入力ピン uart_nRx は水平方向反転してあります。

000-schematic.JPG

SmartIO

001-SmartIO.JPG

LUT は LUT0, LUT1 を NOT に設定。

LUT4, LUT7 を素通りに設定しました。

LUT0

002-LUT0.JPG

LUT1

003-LUT1.JPG

LUT4

004-LUT4.JPG

LUT7

005-LUT7.JPG

PINS

006-PINS.JPG

main.c

=================

#include "project.h"

#include "stdio.h"

#define RX_BUF_LEN 16

int main(void)

{

    volatile char rx_buf[RX_BUF_LEN+1] ;

    int i = 0 ;

   

    CyGlobalIntEnable; /* Enable global interrupts. */

   

    UART_Start() ;

   

    SmartIO_Start() ;

    for(;;)

    {

        UART_UartPutString("Hello\n\r") ;

        CyDelay(100) ;

        i = 0 ;

        while(UART_SpiUartGetRxBufferSize()) {

            rx_buf[i++] = UART_UartGetChar() ;

            if (i >= RX_BUF_LEN)  {

                break ;

            }

        }

        rx_buf = 0 ;

        i = 0 ;

    }

}

=================

オシロの波形

TXの出力が通常 Low, 通信時 High になっているので、反転している考えて良いと思います。

IMG_4289.JPG

また、rx 側に関しては、外部で P3[6] と P3[7] をジャンパでショートしてループバックを行い

デバッガで UART_UartPutString() の行にブレークを掛けて rx_buf[] の内容を確認したところ

ちゃんと "Hello" が入っていました。

個人的には SmartIO で LUT を2つ使わないと UART と外部ピンが接続できないところでハマりました。

1.5 ~ 2 手間必要でしたね(笑)

moto

View solution in original post

0 Likes
4 Replies
MotooTanaka
Esteemed Contributor

こんにちは、

過去に考え無しに一手間と書いたものです・・・ orz

CQ出版 トラ技の付録でついてきた TSoC基板 (CY8C4146LQI-S433) を使用して実験をしてみました。

IMG_4290.JPG

回路図

※入力ピン uart_nRx は水平方向反転してあります。

000-schematic.JPG

SmartIO

001-SmartIO.JPG

LUT は LUT0, LUT1 を NOT に設定。

LUT4, LUT7 を素通りに設定しました。

LUT0

002-LUT0.JPG

LUT1

003-LUT1.JPG

LUT4

004-LUT4.JPG

LUT7

005-LUT7.JPG

PINS

006-PINS.JPG

main.c

=================

#include "project.h"

#include "stdio.h"

#define RX_BUF_LEN 16

int main(void)

{

    volatile char rx_buf[RX_BUF_LEN+1] ;

    int i = 0 ;

   

    CyGlobalIntEnable; /* Enable global interrupts. */

   

    UART_Start() ;

   

    SmartIO_Start() ;

    for(;;)

    {

        UART_UartPutString("Hello\n\r") ;

        CyDelay(100) ;

        i = 0 ;

        while(UART_SpiUartGetRxBufferSize()) {

            rx_buf[i++] = UART_UartGetChar() ;

            if (i >= RX_BUF_LEN)  {

                break ;

            }

        }

        rx_buf = 0 ;

        i = 0 ;

    }

}

=================

オシロの波形

TXの出力が通常 Low, 通信時 High になっているので、反転している考えて良いと思います。

IMG_4289.JPG

また、rx 側に関しては、外部で P3[6] と P3[7] をジャンパでショートしてループバックを行い

デバッガで UART_UartPutString() の行にブレークを掛けて rx_buf[] の内容を確認したところ

ちゃんと "Hello" が入っていました。

個人的には SmartIO で LUT を2つ使わないと UART と外部ピンが接続できないところでハマりました。

1.5 ~ 2 手間必要でしたね(笑)

moto

View solution in original post

0 Likes
TeMa_2997106
Contributor II

丁寧なご対応ありがとうございます。

LUTを2段通しているのは、I/Oアサインのためだけ、という理解で正しいでしょうか。

(Buildが通らないのは、確かにアサインの問題のようでしたが、2段通す発想が無かったです)

実運用上は、正転と反転を制御できるようにしたいのですが、

これはそもそもLUTがあるので真理値表通りにすれば簡単に実現できそうでした。

(その意味では2段あってもいいのかもしれませんが、3入力あれば1段で実現できてしまうため、

こちらもその考えに至りませんでした)

以上です。

MotooTanaka
Esteemed Contributor

> LUTを2段通しているのは、I/Oアサインのためだけ、という理解で正しいでしょうか。

はい、一段で接続する方法が思いつかず、ちょっと難儀しました。

> (Buildが通らないのは、確かにアサインの問題のようでしたが、2段通す発想が無かったです)

私も 2段の裏技を思いつくのに少し時間がかかってしまいました。

しかしこの方法になれると SmartIO は、かなりいろいろなことをさせてくれそうですね。

> 実運用上は、正転と反転を制御できるようにしたいのですが、

> これはそもそもLUTがあるので真理値表通りにすれば簡単に実現できそうでした。

> (その意味では2段あってもいいのかもしれませんが、3入力あれば1段で実現できてしまうため、

> こちらもその考えに至りませんでした)

ご指摘のように、3入力の内一つをセレクタ信号として論理を反転・直通するように

組んでやればできると思います。(まだ、試していないので大きなことは言えませんが

理論上は可能と思います。)

moto

0 Likes
TeMa_2997106
Contributor II

理解できました。ありがとうございました。

セレクタについては、UARTの信号自体は1本でセレクタも1本の、

実質2入力なので1段で実現はできます。

が、せっかく?2段必要なのであれば、振り分けてもいいのかもしれません。

(今後必要ないFeatureとなった時の設計変更容易性を鑑みて)

以上です。