4 Replies Latest reply on Jun 3, 2020 7:57 PM by TeMa_2997106

    UARTの反転出力(2)

    TeMa_2997106

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

      UARTの反転出力

       

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

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

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

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

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

       

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

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

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

       

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

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

       

      宜しくお願いします。

        • 1. Re: UARTの反転出力(2)
          MoTa_728816

          こんにちは、

           

          過去に考え無しに一手間と書いたものです・・・ 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[i] = 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

          • 2. Re: UARTの反転出力(2)
            TeMa_2997106

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

             

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

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

             

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

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

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

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

             

            以上です。

            • 3. Re: UARTの反転出力(2)
              MoTa_728816

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

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

               

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

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

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

               

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

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

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

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

               

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

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

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

               

              moto

              • 4. Re: UARTの反転出力(2)
                TeMa_2997106

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

                 

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

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

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

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

                 

                以上です。