SC16IS740:Auto-RTSの設定について助けが必要です SC16IS740_750_760 現在、SPIを使ったこのSC16IS740をサポートするMicroPythonライブラリを書いています。 私はブレークアウトボードを使って、MAX3237に接続されたSC16IS740のテストを行っています。 すべての基本機能(RX & TX FiFoを含む)は正常に動作し、物理的なTX->RXループバック(および私のオシロスコープ)でテスト済みです。 今、Auto-RTS機能をテスト・実装したいと思っています。 確認するために、ch1をRXに、ch2をRTSに接続してオシロスコープを設置しました。 RXバッファをフラッディングして、RTS信号がスコープでHighに切り替わると思っていますが、実際には起こりません。 以下に、halt_trigger と resume_trigger の値 (文字単位) を含む MicroPython コードを示します。コードは主に特定のチャネル(「ch」パラメータ)に対してレジスタの読み書きを行います。 データシートに何か見落としがあるのですが、それが何なのか分かりません。 注記:最後の命令は、オシロスコープでの手動アクティベーションを確認するために、RTSをハイレベルに強制します。その後、その数値が低くなり、オートRTSで一度も起動されません......確かに、RXのFIFOは満タンになります。 def enable_rts( self, halt_trigger, resume_trigger ):
assert 4<=halt_trigger<=60, "RTS trigger must be within 4-60 range"
assert 4<=resume_trigger<=60, "RTS trigger must be within 4-60 range"
assert (halt_trigger%4) + (resume_trigger%4) == 0, "Trigger level are step by 4!"
assert halt_trigger > resume_trigger, "halt_trigger must be greater than resume_trigger!"
_halt = halt_trigger//4
_resume = resume_trigger//4
# Set LCR=0xBF to access EFR register
_old_lcr = self.owner.bus_wrapper.read_reg( REG_LCR, ch=self.ch ) # store transmission config (eg: 8n1)
self.owner.bus_wrapper.write_reg( REG_LCR, 0xBF, ch=self.ch )
# activate enhanced feature
_efr = self.owner.bus_wrapper.read_reg(REG_EFR, ch=self.ch)
_efr = _efr | 0b00010000
self.owner.bus_wrapper.write_reg(REG_EFR, _efr, ch=self.ch)
print( "EFR:" , bin(self.owner.bus_wrapper.read_reg(REG_EFR, ch=self.ch)) , 'Enhanced function activation')
# Close access to EFR & restore transmission config (eg:8n1)
self.owner.bus_wrapper.write_reg( REG_LCR, _old_lcr, ch=self.ch )
# Enable TCR & TLR register access
_mcr = self.owner.bus_wrapper.read_reg(REG_MCR, ch=self.ch)
_mcr = _mcr | 0b00000100
self.owner.bus_wrapper.write_reg(REG_MCR, _mcr, ch=self.ch)
print( "MCR:" , bin(self.owner.bus_wrapper.read_reg(REG_MCR, ch=self.ch)), 'Enable TCR & TLR register')
# Set TCR trigger values
_tcr = self.owner.bus_wrapper.read_reg(REG_TCR, ch=self.ch)
_tcr = _tcr | (_resume<<4)
_tcr = _tcr | _halt
self.owner.bus_wrapper.write_reg(REG_TCR, _tcr, ch=self.ch)
print( "TCR:", bin(self.owner.bus_wrapper.read_reg(REG_TCR, ch=self.ch)), "Transmission Control register (resume & halt levels)")
# TLR must be cleared (to use TCR)
self.owner.bus_wrapper.write_reg(REG_TLR, 0x00, ch=self.ch)
print( "TLR:", bin(self.owner.bus_wrapper.read_reg(REG_TLR, ch=self.ch)), "Disable TLR values (so use TCR)")
# Disable TCR & TLR register access
_mcr = self.owner.bus_wrapper.read_reg(REG_MCR, ch=self.ch)
_mcr = _mcr & 0b11111011
self.owner.bus_wrapper.write_reg(REG_MCR, _mcr, ch=self.ch)
print( "MCR:" , bin(self.owner.bus_wrapper.read_reg(REG_MCR, ch=self.ch)), 'Disable TCR & TLR register')
self.owner.bus_wrapper.write_reg( REG_LCR, 0xBF, ch=self.ch )
# Enable auto RTS flow control
_efr = _efr | 0b01000000
self.owner.bus_wrapper.write_reg(REG_EFR, _efr, ch=self.ch)
print( "EFR:" , bin(self.owner.bus_wrapper.read_reg(REG_EFR, ch=self.ch)) , 'Enable auto RTS')
# Close access to EFR & restore transmission config (eg:8n1)
self.owner.bus_wrapper.write_reg( REG_LCR, _old_lcr, ch=self.ch )
# Initial State of RTS bit in Modem (MCR)
_mcr = self.owner.bus_wrapper.read_reg( REG_MCR, ch=self.ch )
_mcr = _mcr | 0x02
self.owner.bus_wrapper.write_reg( REG_MCR, _mcr, ch=self.ch ) ご意見やご提案を心よりお待ちしております。 乾杯、 ドミニク Re: SC16IS740 : Need help to configure Auto-RTS こんにちは、
データシートに基づき、以下の点を確認することをお勧めします。
EFCR[4] = 0 であることを必ず確認してください。EFCR[4] は Auto RS-485 RTS コントロールを有効にします。このビットが設定されると、**トランスミッタ**はRTSピンの制御を行い、この機能は手動RTS制御およびハードウェアフロー制御回路の両方よりも優先されます。したがって、Auto-RTSハードウェアフロー制御を使用する場合はEFCR[4]をクリアする必要があります。
TLRはAuto-RTSの停止/再開閾値を定義していません。Auto-RTSでは、**レシーバ**のFIFOトリガーレベルはTCRから、またはTCRビットがクリアされている場合はFCRから取られます。TLRは、割り込み生成に関連する、プログラム可能な送信および受信FIFOトリガーレベルに使用されます。したがって、オートRTS動作にTLRのクリアリングは必須ではありません。 Re: SC16IS740 : Need help to configure Auto-RTS こんにちは、 @ErikaC さん。 ご連絡ありがとうございます。 EFCR[4]を確認したところ、すべてが予想通りに進んでいることがわかりました。 ともあれ、EFCR[4]ありがとうございます。FUTURE的に役立つでしょう。 質問:何が変わったのですか? 応答:完全な電源サイクル。 推測:テストと試行錯誤が多すぎたために、SC16IS7xxxの設定が壊れてしまった可能性が高い。 ご協力いただきありがとうございます。 ドミニク
View full article