2020年02月15日

組込ビデオコントローラBT817

以前に組込ビデオコントローラを紹介してから、実際にDigital Video Shieldとして製品化しました。Digital Video Shieldでは汎用性を考え、BT816を選定しました。先日、BridgetekからBT817が発表されました。

発表資料によるとBT817はBT815/816の後継機種で下記のような特徴があるようです。

・BT815/816互換性有
・24bit 最大解像度1280x800
・BT815/816に比べてパフォーマンスが50%向上
・四角以外のLCDにも対応

最大解像度がBT815/816の800x600から拡大したことは魅力的ですが、HD対応でないのは少し残念です。HD対応であれば、後継版Digital Video Shieldも検討したのですが。一旦様子見というところです。少しニッチな組込ビデオコントローラという市場で毎年のように新しいビデオコントローラが発売されるのは頼もしい限りです。今後のHD対応に期待したいと思います。

posted by Crescent at 00:00| Comment(0) | 電子工作 | このブログの読者になる | 更新情報をチェックする

2020年02月08日

UART割込み有効確認

STM32マイコンのシリアルUART受信の割込みについて少し紹介します。

STM32マイコンのHALライブラリを使用してUART受信をする場合は割込みHAL_UART_Receive_ITか、DMA受信転送HAL_UART_Receive_DMAのどちらかを多く使用します。

HAL_UART_Receiveを使用しない理由として、ブロッキング処理のためUART受信するまで他の処理が停止してしまいます。
一方、HAL_UART_Receive_IT、HAL_UART_Receive_DMAはノンブロッキング処理のため、他の処理をさせて、受信したときor受信後にのみ処理を走らせることができます。ノンブロッキング処理のUART受信処理をする場合は事前にHAL_UART_Receive_IT、HAL_UART_Receive_DMAを実行し、割込みを有効化する必要があります。受信するとHAL_UART_RxCpltCallback関数が呼び出されます。


ここで事前にHAL_UART_Receive_IT、HAL_UART_Receive_DMAを実行する際に注意すべきポイントがあります。別の処理で既に実行されていて、割込みが有効化されている場合に再度、実行するとエラーが発生します。エラーを避けるためにはUART割込み有効か確認して無効の場合にのみ実行するような処理が必要です。今回はその割込み有効確認の関数を紹介します。

■割込みHAL_UART_Receive_ITの場合

uint32_t UART_IsEnabledIT_RX(UART_HandleTypeDef *huart){
 #if defined(USART_CR1_FIFOEN)
  return ((READ_BIT(huart->Instance->CR1, USART_CR1_RXNEIE_RXFNEIE) == (USART_CR1_RXNEIE_RXFNEIE)) ? 1U : 0U);
 #else
  return ((READ_BIT(huart->Instance->CR1, USART_CR1_RXNEIE) == (USART_CR1_RXNEIE)) ? 1U : 0U);
 #endif
}

■DMA転送の場合
uint32_t UART_IsEnabledDMA_RX(UART_HandleTypeDef *huart){
 return (READ_BIT(huart->CR3, USART_CR3_DMAR) == (USART_CR3_DMAR));
}

上記の事前に確認して、すでに有効な場合は割込み有効化処理をしないといったことができるようになります。
posted by Crescent at 00:00| Comment(0) | 電子工作 | このブログの読者になる | 更新情報をチェックする

2020年01月18日

シリアル受信割り込み

以前に紹介したUART I2Cプロトコルブリッジを用いてNode-Red連携をする際に少し戸惑った点があったので対処方法についてお伝えします。

USBシリアル変換IC PL2303SAを用いてNode-Redのserialノードでデータを受信する際にNode-Redの受信ノードが動作せず、シリアルデータを受信してもイベントが発生しない不具合がありました。

node-red.jpg

Teratermでは受信できるものの、Node-RedのSerialノードでは受信してもイベントが発生しませんでした。
他のFTDI製のUSBシリアル変換ICでは受信すると正常にイベントが発生しました。

原因を追ってみるとドライバが古いことが分かり、Windowsの標準ドライバからアップデート、再起動するとUSBシリアル変換IC PL2303SAでも正常に受信することができました。


Driver.jpg

正常に動作確認ができたところでUART I2Cプロトコルブリッジを用いてNode-Redから様々なI2Cデバイスを制御する例について今後、紹介したいと思います。
posted by Crescent at 00:00| Comment(0) | 電子工作 | このブログの読者になる | 更新情報をチェックする

2019年11月16日

STM32 RTC起因のUART不具合

STM32マイコンの多くはVBAT端子があり、RTC機能をマイコンに内蔵しています。VBAT端子にリチウム電池等を接続することで時刻を保持することができます。

STM32マイコンのRTCの特徴として、マイコンのファームを書き換えた際にも時刻が保持されます。また、時刻の他にバックアップレジスタがあり、ちょっとしたデータを保持することが可能です。

マイコンのファームを書き換えた際にも時刻が保持されるため、開発側としては非常に便利ですが、ごく稀に不具合が発生することがあったので現象と対処方法を紹介します。


前提:
VBAT端子にリチウム電池を接続し、時刻を保持した状態でファームを書き換える

不具合:
ごく稀にUARTのボーレートが異常な値となり、マイコン自体は動いているものの、UART通信ができなくなる

対処方法:
マイコンのメイン電源を切り、VBAT端子にリチウム電池を外して数秒放置させる


上記の事象が発生した場合、ファームをフルイレースしても現象は直りません。VBAT端子の供給を遮断し、RTC関連をリセットする必要があります。RTC関連をリセットすれば時刻情報は消えますが、再度、ファーム書き換え直す必要もなく、UARTは正常に戻ります。


もし、STM32 RTCを使用していてUARTに不具合が発生した場合はVBAT端子の電池を外してみてください。
posted by Crescent at 00:00| Comment(0) | 電子工作 | このブログの読者になる | 更新情報をチェックする

2019年11月02日

I2C/Uartコンバータ

今回はI2C/UARTプロトコルブリッジICのSC16IS740/750/760 を紹介します。SC16IS740/750/760はI2CからUARTに変換するICです。

マイコンでUARTを使用する場合、UARTのボーレートに合わせてマイコンのメインクロックを調整するといったことが必要な場合が多々あります。また、UARTポートが他の用途で使用して足りないこともあります。特にUARTの受信処理はSPIに比べ、信号タイミングを測定しながらサンプリングする必要があり、ソフトウェアUARTで実装するとマイコンの負荷が高くなりがちです。マイコンの負荷が高くなることで受信ミスも発生しやすくなります。

I2C/UARTプロトコルブリッジICのSC16IS740/750/760 を使用することでこのような問題を解決することができます。

マイコンからはSC16IS740/750/760 をI2Cデバイスとして制御し、UARTのボーレート設定、送信、受信処理をすることはできます。64 bytesのバッファを内蔵しているため、通信速度が遅いI2Cでも一旦、バッファで受けて後から受信したデータを読み出すといったことが可能です。

また、SC16IS740/750/760 は別途水晶発振子を接続する必要があり、マイコンのクロックから切り離すことができます。そのため、UARTのボーレートに合わせてマイコンのクロックを最大クロックから下げるといった調整が不要です。

SC16IS740、750、760で3種類ありますが、違いは下記の通りです。

 SC16IS740SC16IS750SC16IS760
Flow Control PinRTS/CTSRTS/CTS/DSR/DTR/CD/RIRTS/CTS/DSR/DTR/CD/RI
IO Pin088
SPI Max Clock4Mbit/s4Mbit/s15Mbit/s


SC16IS740/750/760の電源は3.3Vですが、信号の各ピンは5V耐圧のためArduino UNOなどに接続してそのまま使用することも可能です。


このSC16IS740/750/760を使用してGrove変換アダプタを作成してみました。GROVEからUARTに変換する「I2C UART Converter」とGROVEからRS232Cに変換する「I2C RS232C Converter」を設計してみました。

I2CUart.jpg

I2CRS232.jpg




GROVEの多くはI2Cデバイスですが、一部のGROVEはUARTデバイスがあります。UARTデバイスの場合、そのままI2Cポートでは接続できず、ソフトウェアUARTを使用せざるを得ない場合がありました。そのような場合に上記Converterを使用するとソフトウェアUARTを使用せずにUARTデバイスを接続することができます。

サンプルコードを作成して設計に問題なければ、どこかで販売をしたいと思います。

posted by Crescent at 00:00| Comment(0) | 電子工作 | このブログの読者になる | 更新情報をチェックする