2018年11月10日

STM32F373 SDADCマルチチャンネル読み込み

今回はSTM32F373マイコンに内蔵されている
デルタシグマADC(SDADC)のMulti Channelでの
読み込みする方法を紹介します。

SDADCは一部のSTM32マイコンのみ内蔵のため、
サンプルコードや情報がなかなかありません。

試行錯誤してSDADC+DMA+2channelという条件で動作したため、
方法を覚書として紹介します。



今回はSDADC1の2チャンネルを順次変換します。


CubeMX上の設定は下記の通りです。
ポイントは
・Injected Conversions有効化
・DMA転送
です。


・Injected Conversions :Enable
・Number of Channels To be converted :2
・Continuous Mode :Enable
・Channel Configuration1,2: Channel 4,5


sdadc-conf.jpg


・Mode: Circular
・Increment Address: Memory Checked


sdadc-dma.jpg



main.cでは下記のコードを追記します。

//グローバル変数
uint16_t g_SDADCBuffer1[2];

//while文の前に初期化
HAL_SDADC_InjectedStart_DMA(&hsdadc1 , (uint32_t*)g_SDADCBuffer1,2);

//while文
printf(" %d,\t %d, \n\r",g_SDADCBuffer1[0],g_SDADCBuffer1[1]);
HAL_Delay(100);


g_SDADCBuffer1[0]にChennel 4
g_SDADCBuffer1[1]にChennel 5
がDMA転送で格納されます。


実際に実行した結果は下記の通りです。
順次SDADCの変換結果が格納されていることが確認できます。

sdadc-res.jpg

DMA転送でContinuous Mode :EnableかつCircularモードの場合は
void HAL_SDADC_ConvCpltCallback(SDADC_HandleTypeDef* hsdadc)の
関数内でDMA割込みの設定し直す必要はないようです。


HAL_SDADC_PollForConversionを使用すると変換待ちの時間を要するため、
DMA転送できると変換待ちがなく、色々応用範囲が広がります。

posted by Crescent at 00:00| Comment(0) | 組込ソフト | このブログの読者になる | 更新情報をチェックする

2018年11月03日

MachXO3LFのSPI Flashからのロード方法

今回はLattice製FPGA MachXO3LF Starter Kitについて紹介します。
MachXO3LF Starter KitはLUT規模は小さいものの、
3千円程度とお手頃な価格で入手することができます。
また、開発環境Diamondもフリーライセンスで利用できるため、
気軽に始めることができます。

特に開発環境のDiamondがダウンロードサイズ1GB前後、
インストール後が5GB前後で他社の開発環境に比べて
コンパクトな点も気に入っています。

今回はMachXO3LFのSPI Flashからのロードする設定方法を紹介します。

Starter Kitのちょっとした注意点
MachXO3LFとMachXO3Lの2種類ある点です。

・MachXO3LFはFPGA内にFlashを内蔵しており、
何度も書き換えが可能なタイプ。

・MachXO3LはNVCM(Non-Volatile Configuration Memory、
ワンタイム・プログラマブル)という数回のみ書き換え可能な
メモリを内蔵しているタイプです。

製品実装等ので将来、書き換えることがない場合にMachXO3Lを使用しますが、
一般的なホビー用途や検討では何度も書き換え可能な
MachXO3LFが適切といえます。

最初に詳しく調べもせずに誤ってMachXO3Lを買ってしまいました…
後に改めてMachXO3LFを購入。


■MachXO3LF/MachXO3L Starter Kitについて
両タイプもSPI Flashが実装されています。
購入時にデモプログラムが書き込まれており、
MachXO3LはSPI Flashにデモコードが書き込まれており、
FPGAにはSPI Flashからプログラムをロードするコンフィグが
書き込まれています。
そのため、プログラムの書き換えはSPI Flashに
任意のbitデータを書き込んで使用します。

一方、MachXO3LFはデモプログラムは内蔵Flashに書き込まれています。
そのため、プログラムの書き換えは内蔵Flashを書き換えればよいのですが、
せっかくなので内蔵メモリでなく、外部のSPI Flashから読み込みます。

ただ、どのように外部のSPI Flashから読み込むのか、
情報が少なく、少し苦戦したため、
覚書として今回紹介することにしました。


@MachXO3LF内蔵Flashに外部SPIブートの設定書き込み

プロジェクトを生成する際のグローバル設定は下記のように設定します。


generalsetting.jpg

ポイントは
・MASTER_SPI_PORTをENABLEにする
・CONFIGURATIONをEXTERNALにする
です。

他の設定は任意です。

グローバル設定を保存しプロジェクトを合成します。
そのあと、SPI Flashに書き込むBitstream File
内蔵Flashに書き込むJEDEC Fileの2つを生成します。

続いて、外部SPI Flashから起動するための
設定ファイル(コンフィグレーション)を内蔵Flashも書き込みます。
その際にBitstream File全体でなく、
設定ファイル(コンフィグレーション)のみを書き込むことがポイントです。

書き込む際のOperationに「FLASH CFG〜」を選択します。
設定ファイル(コンフィグレーション)のみの「CFG」がポイントです。

flashcfg.jpg

これでMachXO3LFは外部SPIから起動するようになります。

A外部SPI Flashにプログラム書き込み

Starter Kitに搭載のSPI FlashはSpasion製
SPI-S25FL208Kを搭載しています。

SPI FlashオプションにSPI-S25FL208Kを選択して、
Bit Streamファイルを選択して書き込みます。

flashwrite.jpg

電源再投入でSPI Flashからプログラムを読み込みます。



今回は今回はMachXO3LFのSPI Flashから
ロードする設定方法を紹介しました。

FPGAを扱ったことが少ないため、
SPI Flashから読み込む設定をどのように書き込めばよいのか、
いろいろ探してしまいました。

書き込み時にプログラム全体を書き込むのでなく、
設定ファイル(コンフィグレーション)のみを書き込むことで、
SPI Flashから読み込むことができました。

SPI Flashから読み込めることが確認できたので、
Starter Kitを使っていろいろ実験してみたいと思います。

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

2018年10月27日

2.42インチOLEDモジュール試食

今回は2.42インチOLEDモジュールについて紹介します。

秋月やamazon等で手に入るOLEDは解像度は128x64でそこそこあるものの、
画面サイズが0.96インチで遠くからの視認性があまり良くありません。

日本ではあまり入手性がよくありませんが、
同じ解像度128x64で同じ種類の制御ドライバの

0.96インチの制御ドライバはSSD1306で、
2.42インチの制御ドライバはSSD1309です。
互換はあるようです。

2.42インチOLEDモジュールが届いた状態では
SPIモードとなっており、
裏側のジャンパ抵抗を切り替えてI2Cモードとして動作させます。

このジャンパ抵抗が曲者でした・・・
SPIモードで使用しているジャンパ抵抗は4.7kの抵抗のため、
同じようにI2Cモードも4.7kでジャンパしましたが、
まったく動作せず・・・
I2Cのアドレススキャンにも応答せず・・・

oled-jumper.jpg

ジャンパ抵抗を4.7kでなく、
0Ωにするとアドレススキャンに応答し、
I2Cモードで動作確認できました。


2.42oled.jpg


同じようなOLEDなのに思った以上に動作確認に苦戦しました。

以前、ご紹介したようにRES端子を改造して、
4線のみで簡単に制御できるようにして試食完了です。

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

2018年10月20日

Kicadのパワーラインの配線方法

電流を多く流すパワーラインの回路設計は
配線幅を広く配線するということが一般的ですが、
それに加えて下記のように意図的に絶縁層(レジスト)をなくして、
ハンダで基板上の配線の厚みを増やす方法があります。
これによってより大電流を流すことができます。

powerline.png
赤枠部分は意図的にレジストが一部ない

Kicadでも意図的に絶縁層(レジスト)をなくすことができるので
その方法を今回は紹介します。

流れとしては
今まで通り配線を行い、
後から絶縁層(レジスト)を「図形ライン」を使用して、
必要な個所を選択して剥がす
という流れです。


@まず、今まで通り配線を行う
A絶縁層(レジスト)をなくすための配線幅を設定する

fig1.png

fig2.png


A描画する層をF.MaskもしくはB.Maskを選択します。
表面のレジストを剥がす場合はF.Mask、
裏面の場合はB.Maskを選択します。
「図形ラインを追加」をクリックします。

fig3.png

B「図形ラインを追加」からレジストを剥がす箇所を描画します。
「図形ラインを追加」した箇所の色が変わっていることが分かります。

fig4.png

今回は意図的に配線よりも剥がす幅を小さくして、
差を分かりやすくしています。

C3Dビューから絶縁層(レジスト)が
無くなっていることが確認できます。

fig5.png


このようにKicadでも大電流を流す基板を
作ることができました。
posted by Crescent at 00:00| Comment(0) | 電子工作 | このブログの読者になる | 更新情報をチェックする

2018年10月06日

TinkerboardとRaspberryPIタッチディスプレイ接続

TinkerboardはRaspberryPIとポートの位置や
ピンアサインなどの互換性を謳っています。
CPUが異なるため、OSこそ異なるものの、
RaspberryPIとの互換性をかなり意識しています。

今回はTinkerboardにRaspberryPI純正の
タッチディスプレイを接続して使用する方法について紹介します。
RaspberryPI純正ディスプレイは対応ケースもあるため、
見た目や持ち運びが非常に便利です。
もちろん、対応ケースにディスプレイとTinkerboardがピタッと入ります。


基本的にはそのままRaspberryPI同様にDSI端子にフラットケーブルを接続して、
5V、GNDの配線をすればそのままTinkerOSで動作します。

ただ、ケースに入れるとディスプレイの向きが上下逆転します。
下記のコマンドとスクリプトの修正で直すことができます。

@表示の上下逆転
echo "xrandr -o inverted" >> /home/linaro/.config/lxsession/LXDE/autostart


Aタッチパネルの上下逆転
sudo leafpad /usr/share/X11/xorg.conf.d/40-libinput.conf
4つある中でも Identifier "libinput touchscreen catchall"の
タッチスクリーンを修正します。
Option "TransformationMatrix" "-1 0 1 0 -1 1 0 0 1"で
タッチ座標を変換します。

修正後は下記のようになります。

Section "InputClass"
 Identifier "libinput touchscreen catchall"
 MatchIsTouchscreen "on"
 MatchDevicePath "/dev/input/event*"
 Option "TransformationMatrix" "-1 0 1 0 -1 1 0 0 1"
 Driver "libinput"
EndSection



これで再起動するとケースに入れた場合でも上下逆転せずに使用できます。
上記の修正はRasbianでも通用します。
TinkerboardはRaspberryPIのアクセサリが流用できるので非常に便利です。
posted by Crescent at 00:00| Comment(0) | 電子工作 | このブログの読者になる | 更新情報をチェックする