- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- Permalink
- 印刷
- 不適切なコンテンツを報告
過去に、下記の質問をしました。
この際に、デバイスによっては、と注釈付きでUARTの反転出力が可能との回答でしたが、
SCBのUARTはやはり反転は難しそうです。
[Show UART terminals]からUARTのTX/RX信号を引っ張り出した後、
SmartIOに接続してみましたが、Buildが通りませんでした。
(レポートを確認しても詳細がわからず)
必然的に、UDBでUARTを作る形になりそうなのですが、
上記のようにSCBでUARTの構成をした上で反転の制御をする(SmartIOでもUDBでも可)、
ということは可能なのでしょうか。可能であれば、どのように設定すればよいでしょうか。
ターゲットデバイスは現時点ではPSoC4の4100Sか4100S Plusです。
UDBありきであればデバイス変更を検討します。
宜しくお願いします。
解決済! 解決策の投稿を見る。
- ラベル:
-
PSoC 4 Architecture
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- Permalink
- 印刷
- 不適切なコンテンツを報告
こんにちは、
過去に考え無しに一手間と書いたものです・・・ orz
CQ出版 トラ技の付録でついてきた TSoC基板 (CY8C4146LQI-S433) を使用して実験をしてみました。
回路図
※入力ピン uart_nRx は水平方向反転してあります。
SmartIO
LUT は LUT0, LUT1 を NOT に設定。
LUT4, LUT7 を素通りに設定しました。
LUT0
LUT1
LUT4
LUT7
PINS
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 になっているので、反転している考えて良いと思います。
また、rx 側に関しては、外部で P3[6] と P3[7] をジャンパでショートしてループバックを行い
デバッガで UART_UartPutString() の行にブレークを掛けて rx_buf[] の内容を確認したところ
ちゃんと "Hello" が入っていました。
個人的には SmartIO で LUT を2つ使わないと UART と外部ピンが接続できないところでハマりました。
1.5 ~ 2 手間必要でしたね(笑)
moto
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- Permalink
- 印刷
- 不適切なコンテンツを報告
こんにちは、
過去に考え無しに一手間と書いたものです・・・ orz
CQ出版 トラ技の付録でついてきた TSoC基板 (CY8C4146LQI-S433) を使用して実験をしてみました。
回路図
※入力ピン uart_nRx は水平方向反転してあります。
SmartIO
LUT は LUT0, LUT1 を NOT に設定。
LUT4, LUT7 を素通りに設定しました。
LUT0
LUT1
LUT4
LUT7
PINS
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 になっているので、反転している考えて良いと思います。
また、rx 側に関しては、外部で P3[6] と P3[7] をジャンパでショートしてループバックを行い
デバッガで UART_UartPutString() の行にブレークを掛けて rx_buf[] の内容を確認したところ
ちゃんと "Hello" が入っていました。
個人的には SmartIO で LUT を2つ使わないと UART と外部ピンが接続できないところでハマりました。
1.5 ~ 2 手間必要でしたね(笑)
moto
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- Permalink
- 印刷
- 不適切なコンテンツを報告
丁寧なご対応ありがとうございます。
LUTを2段通しているのは、I/Oアサインのためだけ、という理解で正しいでしょうか。
(Buildが通らないのは、確かにアサインの問題のようでしたが、2段通す発想が無かったです)
実運用上は、正転と反転を制御できるようにしたいのですが、
これはそもそもLUTがあるので真理値表通りにすれば簡単に実現できそうでした。
(その意味では2段あってもいいのかもしれませんが、3入力あれば1段で実現できてしまうため、
こちらもその考えに至りませんでした)
以上です。
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- Permalink
- 印刷
- 不適切なコンテンツを報告
> LUTを2段通しているのは、I/Oアサインのためだけ、という理解で正しいでしょうか。
はい、一段で接続する方法が思いつかず、ちょっと難儀しました。
> (Buildが通らないのは、確かにアサインの問題のようでしたが、2段通す発想が無かったです)
私も 2段の裏技を思いつくのに少し時間がかかってしまいました。
しかしこの方法になれると SmartIO は、かなりいろいろなことをさせてくれそうですね。
> 実運用上は、正転と反転を制御できるようにしたいのですが、
> これはそもそもLUTがあるので真理値表通りにすれば簡単に実現できそうでした。
> (その意味では2段あってもいいのかもしれませんが、3入力あれば1段で実現できてしまうため、
> こちらもその考えに至りませんでした)
ご指摘のように、3入力の内一つをセレクタ信号として論理を反転・直通するように
組んでやればできると思います。(まだ、試していないので大きなことは言えませんが
理論上は可能と思います。)
moto
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- Permalink
- 印刷
- 不適切なコンテンツを報告
理解できました。ありがとうございました。
セレクタについては、UARTの信号自体は1本でセレクタも1本の、
実質2入力なので1段で実現はできます。
が、せっかく?2段必要なのであれば、振り分けてもいいのかもしれません。
(今後必要ないFeatureとなった時の設計変更容易性を鑑みて)
以上です。