2023年8月22日火曜日

BlackFinを使ってみるなり(20) BlackFinにADCをつなぐには?

BlackFin DSPにADCを繋ごうとしているひらりんです.

BF706のSPORTのI2S modeでAD/DAを接続するのですが、信号の入出力関係がよくわかんないので調査しました.

SPORTをI2Sモードで使います.
 SPORT1のA Tx DAC
 SPORT1のB Rx ADC
FB706評価ボードの、SPORTの接続場所を確認します.(回路図はこちら
DACの線とADCの線として使える場所はこうなっていると思われます.
 SPT1_xCLK  →BCK
 SPT1_xFS  →LRCK
 SPT1_xD0  →DATA

↓現在はDACのみ繋いでいまして、ADCは未接続です.配線はこうなっています.
・源発振は外部XTAL(25MHz)で内部PLLで100MHzにupしてI2Sのclkになっている
・I2S内部で適宜分周する.ぴったり96kHzにはならない.
・I2Sが出力側
・DACが入力側

これにADCを追加するにはどうするか?
↓これが1つの解と思われます.
・BF706のXTALが源発振
・ADCはslaveである(BCK,LRCKを入力される側)
・ADCにとって、BCK/XTALが非同期で構わないとの前提 ※
※ADCのXTALはdigital演算用の512fsとかのclockです.BCKと非同期でもOKなのかどうかはdatasheetから読み取れてません.旭化成のAK4495などのDACでは非同期でもOKなんです.

↓2つ目の解はこうです.
・ADCがmasterであり、ADCのXTALが全てを支配する
・すっきりして気持ちイイ
・配線が少し増えるが、こっちの方が確実

I2SのBCKを入力に切り替えるには?
赤字のところが切り替えです.
true: BCKは出力
false: BCKは入力
adi_sport_ConfigClock(hDev, 0u,false,false,false)

I2SのLRCKを入力に切り替えるには?
赤字のところが切り替えです.
true: LRCKは出力
false: LRCKは入力
adi_sport_ConfigFrameSync(hDev, 31u, true, false, false, false, false, false);

この調査結果で円満にADCを追加できると思うのですが、現物を動かしてみなくちゃ油断は禁物なのよね.

PCM1803のプリント基板はJLCPCBが製造中です.

19へ    21へ

かしこ

2023年8月21日月曜日

BlackFinを使ってみるなり(19) ADC MCP3561 つかえない~

本日はリフォームはお休みです.3時間も昼寝しました.

BlackFin DSPいじりを再開します.ADCを接続するのが次のお仕事です.

MCP3561というICを使おうと思います.24bit 150kspsというSPECなので実験には使えるのと、Audio用途じゃないので余計なHPFとか入って無さそうだから.マルツで¥1000ぐらいと、まぁお手頃価格.↓先日のこの写真がそれ.
実装しようかとdatasheetを読んでいたら、MCP3561は使えないと判明しました.153kspsだと16bitになってしまうんです.プリント基板も作ったのに丸損でぇす.こうゆうしくじりはよくある.

なーんも考えずにTIのPCM1804(24bit 192ksps)を使えば良かったかも.
PCM1804なら持ってたよなと探したら、、、手持ちはPCM1803でした.こちらは24bit 96kHzなんですが、とりあえず火入れには使えるでしょう.プリント基板を作ります.
AliexpressにPCM1804を注文しましたが本物なのかは知りません.

18へ      20へ

かしこ

興行収入watch バービー、君生き、アリスとテレス、スラダン、マリオ、TOP、コナン

はいっ、今週も興行収入watchのお時間がやって参りました.

「バービー」が初週8位スタートだったそうで、想像以上にそっぽ向かれてます.
公開前には原爆コラージュが問題になってたけど、原爆に敏感な層は元々バービー見ない人達だと思うので、原爆コラのせいで不振だったとは思い難い.バービーの中身は、意識高い系フェミニズム映画だそうです.それが日本人に嫌われたのかというと、いきなり初週でそっぽですから、別の理由が在ったのでしょう.
バービー不振の理由は、バインバインな白人美女のコメディっていう、、、「50年前の『奥様は魔女』なんか今さら誰が見るんだよ」という意識だったんじゃね?
1970年代ならUSへの憧憬は日本人に内在していたと思う.けれど、ロス暴動(1992)、銃乱射、ポリコレなどを見るにつけ「めんどくせぇ奴ら」というのが現代日本人のUS観じゃないかな.

「君たちはどう生きるか」の興収は70億円だそうです.来週は歴代100位に入ってくるでしょう.

9月15日公開の「アリスとテレスのまぼろし工場」の試写会が8/31に開催されるらしいのですが、ちゃんとお布施支払って観ようと申し込みを見送りました.しかしその後、試写会募集をいつまでもやってるので、応募が少ないんだなぁと思われ、不吉な予感がします.130億円クラスのアニメ映画が続出するこの頃ですが、その原動力はカジュアルヲタクです.それに比べて本作のtarget客層は本物のヲタクですから、100億なんか絶対行きません.「かがみの孤城」が10億円、「閃光のハサウェイ」が22億円なので、本作の期待値は願望込みで25億円ってところかと思います.

カジュアルヲタクとは「SPY FAMILY」や「推しの子」が一番と思ってる層です.わたしはあんな凡庸な作品には興味ないけど.いちおう見ただけ.
先日、銀座松屋でアニメの展示会がありました.同じフロアで、リコリコとSPY FAMILYを同時開催してました.わたしはリコリコを見学したのですが、SPYの列に並んでいる客層とリコリコの客層がかなり違うんです.リコリコに並んでるのは汚い男子が多数.それに対してSPYはフツーのOLっぽい女子が多数.
「アリスとテレス」の客層は40歳超の男子じゃないかなぁ.SPYや推しを好む若い層を多数動員するとは思えない~

ーーーー
さて、興行通信社の歴代100位には動きがありました.130億円台は多くの作品が詰まっているので、めまぐるしく順位が入れ替わる傾向があります.
スラダンは、2weeksかけて+2億です.ポニョを抜けるかどうかギリですね.
マリオが2weeksで+3億と頑張りました.呪術とTOPGUNを抜いて歴代17位に躍進.
TOPGUNはホバリングするヘリコプターの如く興収の伸びはゼロです.
コナンは、2weeksで+0.8と失速したけど、TOPGUNを超える可能性はありそう.

かしこ

2023年8月20日日曜日

埼玉戸建てリフォーム(67) ドアとかタイルとか

おはよーございます。日曜出勤。天気曇り。東横線平常運転。最近の東横線は相鉄の呪いを祓えたようで快調になったようだ。

最新のInterface買いました.いろんな解説が書かれていて勉強ネタとしてよろしいかんじ.オレこうゆうの疎いし.通勤電車で読もう.
中身:量子コン, AI, ブロックチェーン, GPU, IoT, IDE, コンパイラ, MATLAB, interface, RISCV, マイコン, 組込Linux, storage, 無線, 5G, WiFi6, モータ, GPS, ロボット, レーダ, カメラ, 映像, 圧縮, ドローン, CAN

ーーーー
このやる気のNASAは暑さのせいだろうか。

↓洗面所ドアを外開きにしました。斜線部を有効活用できます。
↓幅調整で削りました。せっかく塗装したのにちくしょー
↓ばかうけ休憩。今日の水分補給は2リットルです。

ーーーー
↓錆水対策で破壊したお風呂の混合水栓のところにタイルを貼ります。
↓タイルのセメントを買いました。味見します。
↓垂直の壁にタイルを貼るのですから粘性があります。夏であっても固まるのは遅くて、1時間後でもまだ弾力がありました。
↓貼ってみました。周囲のタイルと違うけどどのみち同じ柄のタイルなんか入手出来ません。中目黒の家のリフォームで脱衣所の壁から剥がしたタイルの廃物利用です。
セメントタイプの接着剤を使ったので、周囲よりも若干凸になってしまったので悔いが残ります。有機接着剤の方がよかったかもしんない。

↓上3枚は水栓の穴を開けてから貼ります。屋内用のタイルは軟らかいのでダイヤモンドドリルで穴開けOKでしょう。後日やります。

ーーーー
ドアノブを取付けたら、回転が渋くて使えない。
↓原因は、極端に表現すれば中身の本体がこんな風に斜めってしまうから。
↓さらに原因はこの座ぐり面が傾いているから。
肉盛りで傾き修正するのは別の副作用が在るのでやめます。削りで修正しますが座ぐりは難しい。
この扉はたぶん10年間撤去されたままだったのです。10年前はちゃんと使えてたのか、それは不明です。

本日の出費:
電車賃
吉野家 448円
お弁当+麦茶 500円
ばかうけ+水分 350円

あでゅ~

2023年8月19日土曜日

埼玉戸建てリフォーム(66) 照明、セメント、ドア

おはよーございます。遅い出勤です。天気夏。東横線平常運転。

本日は建具塗装とかクロスとか取付とかいろいろ。

ーーーー
「パインズの悪魔」って知ってますか? わたしは初耳でしたが京大他の研究GPが観測に成功したんだとか。
固体内電子クラスタが、無質量、無電荷、光子との相互作用無し、といった性質になるとの理論予想が在りました。その電子クラスタの名はdemon。そのdemonを実測したと言ってます。
記事には、プラズモン同士が逆位相で結合したら無電荷になると書かれていますが、質量まで消滅するって不思議です。先端的物理学には位相質量なんつうものが在るとでも云うのかっ?

電子の電荷を利用するのがelectoronics。電子のスピンを利用するのがspintronics。電子クラスタを利用するdemontronicsデバイスが出来たらいいね。

ーーーー
Twitterからブロック機能が削除されるそうです。
河野太郎どうするのかな?困るんじゃね。
DQNがやりたい放題なあの場で、主にとって唯一の防御手段がブロックだと思うんだけど、これで「DQN>主」の図式はますます確固たるものになり、地獄絵図が展開されるのではないかと楽しみです。なにしろ憎悪>愛ですから。

ーーーー
壊れてしまった勝手口の外部灯を交換。塗装はサボる。
↓錆水対策のため勝手口外部に在った洗い場を撤去。排水口をセメントで閉塞しました。排水口を開けっ放しだとドブネズミの出入り口になる可能性があります。
↓ビール休憩。
↓平置きすると巨大でムカつく扉というもの。
↓塗装とクロスを終えて元の場所に据え付けようとしましたが何故か寸法が合わず閉じませんでした。塗装で太ったかな?
↓扉幅を、上-0.5mm、下-0.8mmぐらい削って納めました。削った部分の塗装は後日。

本日の出費:
電車賃
おにぎり+麦茶 430円
ビール 270円

あでゅ~

2023年8月18日金曜日

埼玉戸建てリフォーム(65) 1ヶ月ぶりの現場

おはよーございます。天気曇り。気温夏。東横線平常運転。

2023年7月14日を最後にやってなかったリフォームを再開します。1ヶ月あまりも中断していた理由は右肘の負傷のせいでした。

中断が無くても、どのみち完了は10月中旬〜末と予想していたので、中断を経て完了は12月になるでしょう。急ぐ必要もないので年越しもあり得ます。

ーーーー
最寄り駅、出勤前に珈琲休憩とはやる気のNASAがうかがえる。

スタバとタリーズでは店内利用の際にマグカップで提供される事があります。
この内容量が、紙コップよりも多いのではないかと邪推しているのですが、珈琲チェーンソムリエの方々の知見や如何に?

わたしはいつもshortsじゃなかったshortサイズを注文するので、スタバのマグカップはすげー得してる気がするんだよね。マグになみなみと注いでくれるものだから、「大盛り?」っていつも思ふ。

ーーーー
リハビリがてら建具に塗装などしてるとこ。エアコンは入れない。

さっき見かけた記事によると、インディジョーンズとミッションインポの新作は製作費+広告費を回収できず、双方ともに1億ドルの損失になる見込みだそう。

興行推移を見てると確かにそんな感じはします。日本みたいな小さい市場でハリウッドの製作会社が満足するような成績になるには4週連続1位ぐらいの集客しないと無理でしょう。

ミッションインポが1位だったのは初週だけでした。劇場で観て、人形使い+ルパン+列車脱線でしかも前後編じゃぁダメだろうと思ったけど、もう少し健闘するかとも思いました。厳しかったようです。

インディは観てないんです。

ーーーー
17:50
早めの撤収。
マルツに注文したADCが入荷したため、これから秋葉→新橋と巡ります。

写真は後日載せますが、リフォームやっていて、
 「この扉ってどうして内開きなんだろう?」
って何処の家でも必ず1箇所は思います。

例えば、一般的に洗面所・脱衣所って狭いです。そこへ向かって扉を内開きにしちゃったら、狭い空間を余計に喰ってしまい、収納ケースを置いたりする場所を圧迫し、空間が死んじゃうんです。だから扉は廊下へ向かって外開きにするべきだとわたしは思います。
廊下の通行人がギョッとするとかいう懸念は運用で回避しろや。

というわけで、今日は内開き→外開き変換の加工をやりました。他にもいろんな事をやりました。

ーーーー
19:30
秋葉原。
マルツでADC受領。IC1つなのに箱が大きい。
↓インバース。120GB HDDジャンクを求めていたが120GBは売ってなかった。代わりに160GBが特価180円だったので5個買いました。(後日:1個はセクタ不良があったので捨てました)
あきばおーで、TEAMの512GB SSDが税込2990円で目を疑った。あれは夢だろうか?

ーーーー
新橋のバー。
謎の梱包のADCを開封してみる。ネーメジスシリーズという言葉がアタマをよぎる。中央の小さいのがICチップ。なんじゃこりゃな梱包でした~

本日の出費:
電車賃
タリーズ     345円
おにぎり+水   300円
ビール      250円
水道代5〜6月 2640円
マスキングテープ 500円
キャップ2ヶ   500円
防水電灯2ヶ  4800円  勝手口、お風呂用

あでゅ〜

2023年8月17日木曜日

BlackFinを使ってみるなり(18) お休み前、PCからUART経由で制御

明日からリフォームのひらりんです.

リフォームで多忙になる前にBlackFin BF706で動作確認を終わらせておきたかったことはほぼ出来ました.

今日はUART Rxを動かして、PCからUSB COMでDSPを制御しました.

今まで、UARTの設定がよくわからず例外が発生していたのですが、以下の設定で動きました.UART0のTxRx両方使いです.全二重と呼びますか?
例外の原因は、赤字のメモリサイズでした.TxまたはRxの場合のメモリサイズは小さくていいが、両方向は大きなメモリサイズが必要です.BIDIRとは両方向のことです.
adi_uart_Open(0, ADI_UART_DIR_BIDIRECTION, driverMemory_uart, ADI_UART_BIDIR_DMA_MEMORY_SIZE, &hDevice);
adi_uart_SetMode(hDevice, ADI_UART_MODE_UART);
adi_uart_SetBaudRate(hDevice, 115200);
adi_uart_SetParity(hDevice, ADI_UART_NO_PARITY);
adi_uart_SetNumStopBits(hDevice, ADI_UART_ONE_STOPBIT);
adi_uart_SetWordLen(hDevice, ADI_UART_WORDLEN_8BITS);
adi_uart_EnableDMAMode(hDevice, true);
adi_uart_RegisterCallback(hDevice, UARTCallback, (void*)0);

adi_uart_SubmitTxBuffer(hDevice, txbuf_uart[0], 1);
adi_uart_EnableTx(hDevice, true);

adi_uart_SubmitRxBuffer(hDevice, rxbuf_uart, 1);
adi_uart_EnableRx(hDevice, true);

Tx側は以前の投稿を読んでもらうとして、今回はRx側です.

Rxはどうも使い心地が悪いかなぁ.現状のRxのやりかたをポエム風に表現するとこうです.
 ・DMAである
 ・1BYTE Rxの要求を出す
 ・1BYTE Rxが完遂されたら割り込みcallbackが生じる
 ・callbackの内部で、その1文字を自前のバッファに積む
 ・CRを受信したらコマンド解析などを行う
この「1文字毎にcallback処理する」のってなんかのろくさくて好かないんだけど.
もちろん、50文字Rxという要求を出すのも可能なのですが、それだとコマンド列の末尾で50文字に満たず無反応になってしまうので受諾できません.なので1文字毎にしてます.
または、pollingで「Rxしたぁ?」「何文字?」みたいな関数も用意されてるみたいなのですが、なんのためのDMAなのかなと思ってしまいますが、1文字毎にDMAで受信してるパープリンの言う事じゃねぇや、と思わんでもなく.なんか居心地悪いです.

callback関数の1文字処理のところ.
①ADI_UART_EVENT_RX_BUFFER_PROCESSEDというevent flagが受信完了の意味.
②すぐに受信文字をsaveしといてから、
③次の1文字をRxしろと要求する
④UARTへecho back
⑤CR受信で行末検出
⑥1行受信のflagを立てる
void UARTCallback(){
 switch (event) {
  case ADI_UART_EVENT_RX_BUFFER_PROCESSED: ①
   char x = rxbuf_uart[0]; ②
   adi_uart_SubmitRxBuffer(hDevice_uart, rxbuf_uart, 1); ③
   h_uart_tx_char(x); ④
   switch (x) {
    case 0x0d: ⑤
     comN = N;
     if(N==0 && i==0) break; // no character
     N=0; i=0;
     bComplete_uart_CR = true; // end of a line ⑥
   break;

⑥のフラグをmain()のloopでチェックしていまして、そこでコマンド解析し、DACに発生させる周波数、電圧、波形などを変更します.結果として、BF706をPCから制御していることになります.
制御コマンドはこんな感じです.
 f r 600   Rchを600Hzにする
 a l 67    Lchの電圧をフルスケールの67%にする

32bitのsin(x)を67%に小さくする演算って固定小数点だとどうやるんだろう???
浮動小数点で表現するとこんなに簡単なわけですが、、、
 out = sin(x) * 67 / 100;
固定小数点だと現状はこんなにしています.かったるくない?
 long long t64 = mult64_32x32( 0x7fffffff, 67 );
 int t32 = t64 / 100;
 o = sin_fr32( x );
 o = mult_fr1x32x32( o, t32 );
 out = polarity==true ? o : (-1)*o; ←前回書いた極性制御
赤字の乗算関数はライブラリが提供するものです.

ーーーー
CrossCoreのproject詰め合わせはこちらです.

BF706のサンプルとしてどんな事を見れるかというと、、、
・BF706評価ボードがtarget
・Timer0でLEDチカチカ(GPIOも)
・Timer1でUARTの周期的送信(10Hzだったかな)
・UART0 Tx 内部状態をPCへ送信
・UART0 Rx PCからBF706を制御する
・SPORTのI2SでDACへ音声データ送信
・sin_fr32(x)で固定小数点でsin波発生→DAC出力
・speed tuneはなにもやってません、だらだらcodeです

免責:被害に遭っても知りません.

明日からDSPのupdateは遅くなりますのでまたね~

17へ      19へ

かしこ

2023年8月16日水曜日

BlackFinを使ってみるなり(17) 固定小数点のsin_fr32()でsin波を出す

明後日からリフォーム復活です.こんばんわ.ひらりんです.

FB706の固定小数点演算でsin波を出してみよう.こんな感じです.ノコギリ波のイジイジしたリンギングはDACのfilterのせいです.

math_bf.hにsin_fr32(x)という関数が定義されています.これを使ってsin波を出します.

sin_fr32(x)は32bit固定小数点入出力の関数です.
この関数の定義域と値域はどうなってるのかをまず調べました.
↓こうなりました.すなわち、
 定義域  x = ーπ/2 ~ +π/2
 値域   sin_fr32(x) = -1 ~ +1
まず値域については、、、32bit符号付整数の表現範囲のmaxが 0x7FFFFFFF で、これが+0.999999に相当します.グラフが2E+09まで振れているのは、0x7FFFFFFF = 2147483647 ≒ 2E+9だからです.表現範囲のマイナス方向minは0x80000000で、これが-0.999999に相当します.
つぎに定義域は、x=0.99999を+π/2に相当させているようです.マイナス方向も同様.

sin_fr32は周期関数でなくて、ブツ切りsin関数ですから、使い方には注意が必要です.
X=0から少しずつXを増やしてsin波を発生させるのは通常どおりですが、X=0x7FFFFFFFに達した次はX=0x80000000に飛んでしまうので、そこから先は(-1)*sin_fr32(z)に極性を変える必要があります.
こういう極性反転をπラジアン毎に繰り返す必要があります.

ーーーー
このような初期化関数で、サンプリング周波数、周波数、レベル、DC、波形を設定します.レベルとDCは未実装です.いずれは位相も調整できるようにしなくちゃいけない.
 h_wavegen_init(
  H_WAVEGEN_RCH,
  192000,   // sample freq.   ex.96000 Hz
  10000,    // signal freq.
  0,        // level
  0,        // dc
  H_WAVEGEN_SIN
 );

ーーーー
I2Sのバッファ空っぽ割り込みで、バッファに波形データを仕込みます.
 L = h_wavegen(H_WAVEGEN_LCH); ←この中でsin_fr32()を呼ぶ
 nBufferTx0[i+0] = L;  ←リトルエンディアン
 nBufferTx0[i+1] = L>>8;
 nBufferTx0[i+2] = L>>16;
 nBufferTx0[i+3] = L>>24;

ーーーー
sin_fr32(x)のxの更新stepの計算式.
 step_sin = 0x100000000 * 2 / ( fsmpl / freq ) ;

たとえば96kHzサンプルで1000Hzを発生させるには、
 step_sin = 0x100000000 * 2 / ( 96000/ 1000 ) = 8947848
となります.

ーーーー
sin_fr32(x)の極性反転について.
xが正→負に変わった瞬間で極性反転させています.
 xold = x;
 x += step;
 if( xold>=0 && x<0 ) {
  p->polarity = p->polarity==true ? false : true;
 }
boolの論理反転って~pか!pで出来ないのかね? > Cさん

ーーーー
project詰め合わせはこちらです.

16へ    18へ

かしこ

動かないTL072 (Aliexpress)

回路屋諸君、注目!

動かない電子パーツシリーズ第2段というかなんつうか....
今回のは感銘を受けました.
どうやったらこういう半導体ウエハーを作れるのだろうか?とすら思ってしまいます.

TL072というJFET入力の昔からあるopampをAliexpressで買いました.偽物だろうとは思ってたけど、これは凄い...

中華TL072の波形です.
ゲイン2倍で、正弦波30kHzを入力して、まさかのスルーレート制限で完全にやられてる状態.16uSecで7V変化してるので、実測スルーレートは7/16=0.4V/uSecぐらい.ギャグみたいな遅さ.
TL072のdatasheetから20V/uSecですから、中華TL072の性能は1桁下です.TL072は高速型ではないですから、フツーのfabで真心を込めて作れば似たような性能を出すのは難しくはないと思うんですがねぇ.

ICを換装してみます.
信頼できるTL072を持ってないので、代わりにuPC842というTL072よりも性能の劣るopampに換装して同じ条件での波形がこれ.いやもう周波数応答が全然違うでしょう.腐って猫も喰わないお魚と、釣ったばかりの新鮮なお魚ぐらいの違いがあるじゃん.
階段はDACのせい
ちなみに、uPC842のスルーレートは8.5V/uSecですから、真正TL072の半分以下の性能でこんなに深圳もとい新鮮なんですよ.

中華TL072がどんだけ腐ってるのかが判ります.わざとじゃなけりゃこんな性能劣化品なんか作れないだろうに.違うopampの刻印を072にしたのだろう.腰が抜けたわ、ぎゃははのは

EVが燃えるわけだ

えいめん

2023年8月15日火曜日

BlackFinを使ってみるなり(16) 閑話 アナログ基板

お盆休みなので自分で前髪切りました.こんにちは、ひらりんです.

本日はDSPの進展は無いんです.
アナログフロントエンド基板が届いたので組み立てました.

↓プリント基板取付のための支柱を3DPで印刷します.3DPはエレキ開発にも役立ちます.
↓5枚の基板の継ぎはぎがアナログフロントエンド基板です.仕様は秘密.下の基板はおなじみBF706評価ボード.ADCをDSPで制御したいのだけど、marutsuへの入荷待ちです.品切れとか言われたらやだな.

今回の5枚の基板は急いだので深く考えずに発注したため、部品のピン配ミス、コネクタが逆順などの凡ミスがあり、早くも2枚の基板が致命傷です.アートワーク修正してJLCPCBに発注しました.$7は¥1000ぐらいか.

15へ    17へ

かしこ

動かない7812(Aliexpress)

これぞ中華クオリティ!

7812といえば12Vレギュレータです.

これを注文したのですが、、、D2PAKとかいうやつです.DPAKかも.
驚くべきことに、届いたのはこれ.packageがまるで違う.刻印はSTのL7812CVとなっているがどうせ偽物だろう.
トラブルはまだ続く.
15V入れて12Vを出そうとしたのですが、電流が35mAも流れて出力には0~5Vがふらふらと出てくるのみ.

5個試して全滅でした.

中身が何かわからない7812を掴まされてしまいました.

よもや中華クオリティがここまでとは、まさに異次元.

えいめん

2023年8月14日月曜日

BlackFinを使ってみるなり(15) TIMERの例外の解決

アニメキャラの腰つきを重視するひらりんです.

BF706 DSPを動かしています.

AD社提供のライブラリを使います.しかし、TIMERとUARTで例外が出るんです.

例えばこれはUARTで生じる例外.→こちらに少し書いた
A non-recoverable error or exception has occurred.
  Description:   A data CPLB miss has occurred without a corresponding CPLB entry.
  General Type:  RunTimeError

これと同類の例外がTIMERでも起きて困ってたんです.がっ解決しました.

症状: TIMER0は動くが、1や2や3をopenすると例外が生じる

以下原因を書きますが、ポエム的表現ではこんな感じでした.
AD提供のTIMERライブラリには、TMRとCTMRの2つあり、CTMRが新しいようだ.
TMRなら正常.しかしCTMRは例外を生じる.
CTMRは、ライブラリソース自体がTIMER1~7を動かすように作られていなかった

UARTの例外も似たよな事情かもしれません.

ーーーー
↓CTMRライブラリ関数を使ったTIMER1の設定はこんな関数でやってました.でもこれだと例外です.
#include <services/tmr/adi_ctmr.h>
adi_ctmr_Open (1, Timer1Handler, 0, &phCTimer1);
adi_ctmr_SetPeriod(phCTimer1, 100000);
adi_ctmr_SetScale(phCTimer1, 100);
adi_ctmr_Enable(phCTimer1, true);
adi_ctmr_EnableAutoReload(phCTimer1, true);
adi_ctmr_Activate(phCTimer1, true);

↓TMRライブラリ関数だとこうなります.これなら動きます.
#include <services/tmr/adi_tmr.h>
adi_tmr_Open(1, Timer1CBMEM, ADI_TMR_MEMORY, Timer1Handler, 0, &phCTimer1);
adi_tmr_SetMode(phCTimer1,ADI_TMR_MODE_CONTINUOUS_PWMOUT);
adi_tmr_SetPeriod(phCTimer1,100000*100);
adi_tmr_SetIRQMode(phCTimer1, ADI_TMR_IRQMODE_PERIOD);
adi_tmr_Enable(phCTimer1, true);

↓CTMRライブラリ関数の問題箇所はここです.
TIMER0~7まで8個の配列が必要ですがTIMER0しか書かれていませんから、TIMER1をopenしたらメモリ壊しますわなぁ.そして例外が生じます.1~7を追加するのはやめときます.
static ADI_CTMR_DATA gCTimerData[] = {
 { // TIMER0のみ
  (volatile ADI_CTMR_REGS  *)TCNTL,
  NULL,
  NULL,
  false
 },
}

↓TMRにも同様の配列がありまして、こちらは0~7まで記述されており、正しく動きます.
static ADI_TMR_DEV  gaTimers[] = {
 {    /* Timer 0 */
  (ADI_TMR_REGS_PTR) pREG_TIMER0_TMR0_CFG,
  (uint32_t)INTR_TIMER0_TMR0,
  0u,
  NULL
 },
 {    /* Timer 1 */
  (ADI_TMR_REGS_PTR) pREG_TIMER0_TMR1_CFG,
  (uint32_t)INTR_TIMER0_TMR1,
  1u,
  NULL
 },
以下Timer7まで記述されている....

ーーーー
訂正.
BFにはGP Timer 0-7とCore Timer 0 の2種類あるとわかりました.(コメ欄の情報より)

TMRはGP Timerのライブラリ関数です.CTMRはCore Timerのライブラリ関数です.

わたしは最初からTMR関数を使うべきだったのでした.

資料を調べました.

1)ADSP-BF7xxシリーズdatasheet
General-Purpose Timer の記述あり.
Core Timer 「coreが独自に持つtimerでsystem tickに使用」と記述あり.

2)ADSP-BF70x Blackfin+ Processor Hardware Reference
General-Purpose Timer の記述あり.
Core Timerの記述無し.

3)ADSP-BF7xx Blackfin+ Processor Programming Reference
General-Purpose Timer の記述無し.
Core Timer の記述あり.

4)system.svcからのexample
「GP timer configured in PWM out mode」exampleあり
「Core Timer configured to auto reload」exampleあり ←わたしが最初に掴んでしまったもの

14へ     16へ

かしこ

BlackFinを使ってみるなり(14) UART Tx実装

ライブラリで悩むのがプログラミングに要する時間の大半、ひらりんです.

UARTのbaudrate問題が解決したので、UARTのTxのみですが、project詰め合わせをupしておきます.こちらです.Txのみなのは、内部状態を出力させたいためです.

あまりdebugしてないのでなにか不具合はあるでしょう.ダメなら素直に死のう.

ーーーー
USB COMのhardware
UART0_TXだけしか使ってません.なので信号の取り出しはコネクタP9の3番ということになります.この先にUSB COM ICであるFT232などを取り付けることになります.
FT232基板(自作)

main()のUART初期化界隈
power界隈を初期化しないとbaudrate設定が正しく動きませんので.
adi_pwr_Init(0,25000000); // clkin 25MHz

UART設定いろいろ.UARTを使い慣れた人ならやってる事はわかるでしょう.送信終了でcallbackしてもらいたいので登録もしています.DMAもオンしてます.
adi_uart_Open(0, ADI_UART_DIR_TRANSMIT, driverMemory_uart, ADI_UART_UNIDIR_DMA_MEMORY_SIZE, &hDevice_uart);
adi_uart_SetMode(hDevice_uart, ADI_UART_MODE_UART);
adi_uart_SetBaudRate(hDevice_uart, 115200);
adi_uart_SetParity(hDevice_uart, ADI_UART_NO_PARITY);
adi_uart_SetNumStopBits(hDevice_uart, ADI_UART_ONE_STOPBIT);
adi_uart_SetWordLen(hDevice_uart, ADI_UART_WORDLEN_8BITS);
adi_uart_EnableDMAMode(hDevice_uart, true);
adi_uart_RegisterCallback(hDevice_uart, UARTCallback, (void*)0);

enableするために、先だってsubmitしなくちゃいけないのがBFライブラリの特徴と言えるかもしれない.
adi_uart_SubmitTxBuffer(hDevice_uart, txbuf_uart[0], 1);
adi_uart_EnableTx(hDevice_uart, true);

起動メッセージをCOMへ発信します.h_uart_tx_str()はひら自作です.
h_uart_tx_str("\n\n====== BF706 test program ======", true, false);


ひら自作関数
 h_uartcom.cがそれです.

大雑把な構成を先に説明すると、、、
char txbuf_uart[2][100]
2本のバッファは、片方はUART Txに使用中、もう片方は送信したいデータを積むところ.それを交互に切り替えます.

なので、送信したいデータを積むのは基本的に随時行えます.(あまりにもドカドカ積むとoverflowしますけど)

積むのは随時.ならば、UART Txはいつkickされるのか?
TIMER0で0.1秒毎にkickされます.バッファが空ならスルーします.
本当はTIMER1を使いたかったのですが、不調で動きませんのでTIMER0を使います.

TIMER callback()
0.1秒割り込み毎にh_uart_tx()を呼びます."run"は動作確認用.
Timer1Handler(){
 switch( Event ){
 case ADI_CTIMER_EXPIRED:
  h_uart_tx();
  h_uart_tx_str("run",false,true);
  break;
 }
 return;
}

h_uart_tx()
①UART送信中なら何もしない
②積みバッファの長さ
③積み荷が在ればUART Txをkickする
h_uart_tx(){
  if(!bComplete_uart) return; ①
  int len = strlen(txbuf_uart[tx01_uart]); ②
  if(len!=0) adi_uart_SubmitTxBuffer(hDevice_uart, txbuf_uart[tx01_uart], len); ③
}

UARTCallback()
UART Txが終わったら処理します.
①終了フラグ
②バッファ切り替え
③バッファクリア
UARTCallback(){
 switch (event) {
  case ADI_UART_EVENT_TX_BUFFER_PROCESSED:
   bComplete_uart = true; ①
   if(tx01_uart==0) tx01_uart=1;
   else tx01_uart=0;
   txbuf_uart[tx01_uart][0]=0;
   break;
 }
}

バッファへ積む関数
例としてstringをバッファへ積む関数です.
末尾にspaceを追加するか、CRを追加するかはお好みです.
void h_uart_tx_str(char* x, bool CR, bool spc){
  h_uart_tx_bufadd(x);
  if(spc) h_uart_tx_char(0x20);
  if(CR)  h_uart_tx_char(0x0d);
}


こんなところですかね.

13へ     15へ

かしこ

BlackFinを使ってみるなり(13) UARTライブラリの不調原因

おはよーございます.コミケで疲労なひらりんです.

UARTのbaudrateを設定できない不調を調査します.

UARTのライブラリsourceはadi_uart_bf60x.cが使われています.
まずこの中に不調があります.

この行で、system clock周波数を得ているのですが、正常終了はするものの、3変数とも値がゼロです.
if(adi_pwr_GetSystemFreq(0u, &fsysclk, &fsclk0, &fsclk1) != ...)

原因はadi_pwr_GetSystemFreqにあり.

fileはadi_pwr_v2.cです.
やってることは単純でこれだけ.ptrがゼロってるのかなぁ?
ADI_PWR_CLK_STRUCT clk;
ADI_PWR_DEVICE *pDevice = &gPWRDevice[nDeviceNum];
GetFreq(pDevice, &clk);
*fsysclk = clk.syscclk0;
*fsclk0 = clk.sclk0;
*fsclk1 = clk.sclk1;

ptrは非ゼロでした.疑いは晴れる.
&clk = 0x11803f50
pDevice = 0x11b00ce4

ということは、GetFreq()がおかしいのかな?
clk計算の種子であるclkinがゼロでした.これは基板上の25MHz Xtalを指すと思うのですが、#defineを忘れてるのかもしれない.
 pDevice->pDevData->clkin

解決しました.main()の最初で、このpower init関数を呼ばなければならないのです.25MHzはここで設定します.
 adi_pwr_Init(0,25000000); // clkin 25MHz

悪いのはわたしでした~ 切腹してお詫びを

12へ      14へ

かしこ

2023年8月13日日曜日

BlackFinを使ってみるなり(12) BF706評価ボード上のW25Q32 FLASHを焼く方法

雨のコミケに疲れて東京駅タリーズに腰を落ち着けて動けなくっている、、、エロ小説も書くひらりんでぇす。加藤恵+エリリ+倫也の3Pには持ち込んだ。

BF706評価ボードのAD社提供ライブラリが怪しくて困ってます。

UARTのbaudrate設定APIが露骨におかしいと前回書きましたが、TIMER openも変。

BF706には0〜7の8ケのTIMERが在るんだが、何故かヘッダファイルのenum定義に0しか無くて、1234を自分で定義を増やしても、今度は例外でガッツン停止するんだよ。

なので現状TIMER0しか使えない。そんなCPUは嫌だわ。

もしかしたら、debugger駆動でのみ生じる不具合かなと思って、on board FLASHの焼きをやろうとしたら、crosscoreのボタンポチッと一発じゃ出来なくて、hex file生成に一手間かかり、さらにその後にDOS窓でcommand lineで焼く必要があるみたい

「焼き方わかんねーよ」レベルの素人目線の解説は日本語圏と英語圏には見当たらないよな感触。素人ひらりん目線での焼き方指南は後にupしますんでー

それで非debugger動作ならシレッと例外が起きないのを期待するわたしだ。

#FLASHから起動させても例外は生じました.

ーーーー
やっとW25Q32 FLASH焼きに成功したので以下に設定方法を書きましょう.網羅できているのかやや自信が無いが、上手くいかなかったら素直に死のう~~

かなりグダグダです.ADさんもう少し交通整理してくれたら良いと思う.

焼きに成功した時の画面表示(CrossCoreから焼けた)
しかるべき設定に成功すると、build後にbebuggerボタンの隣に焼きボタンが表示されるようになるのでこれをクリック.焼きに成功すると下記のmessageが出る.
Downloading to device...
'Invoking: CrossCore Blackfin Device Programmer'
cldp -proc ADSP-BF706 -verbose -cmd prog -driver "C:\Users\hira\cces\2.11.1\Device_programmer\bf706_w25q32bv_dpia.dxe" -erase affected -emu ice-1000 -format hex -emu kit  -file restdac.ldr 
Target          Blackfin CS Emulator
Platform        ADSP-BF706 EZ-KIT Mini via Debug Agent
Processor       ADSP-BF706
Core            0
Driver          C:\Users\hira\cces\2.11.1\Device_programmer\bf706_w25q32bv_dpia.dxe
Program         restdac.ldr
........................................... done
'Finished building: program_device'

赤のlineがcldpコマンドとそのoptionであり、このoptionに沿うようにあれこれとcrosscoreを設定したりするのがW25Q32 FLASH焼きを成功させる手順なのだっっ!!

なので、まずは赤のlineの意味を解説したら良いと思います.

cldpってどこにあるの?
cosscoreのインストディレクトリに最初から存在するexeです.
C:\Analog Devices\CrossCore Embedded Studio 2.11.1\cldp.exe

bf706_w25q32bv_dpia.dxe の調達
これはFLASHを焼く前に、BF706のprogram RAMに流し込むbinaryだと思う.
この人がBF706の中で立ち回ることによって、PCからhexを受信し、SPI経由でFLASHを焼いているのだと思う.
ゆえにこれを何処かから調達しなくちゃいけない.
ADのADSP-BF706 EZ-Kit Lite MiniページからDLできる.
このページにある、ADSP-BF706 EZ-KIT Mini™ Board Support Package というのをDLする.
だがしかし、このページのリンクを押してもchromeではDLできなかった.原因はhttpとhttpsの違いのせいだった.なのでこちらをクリックするとchromeでDLできた.
正体はexeなので起動してインストする.
ADI_ADSP-BF706_EZ-KIT_Mini-Rel1.1.0.exe
インスト後にこれが出来ていればOK.
C:\Analog Devices\ADSP-BF706_EZ-KIT_Mini-Rel1.1.0
この下に降りてゆくと、、、
BF706_EZ-Kit_MINI\Blackfin\Examples\Device_programmer
ビルドしないでもbf706_w25q32bv_dpia.dxeが存在するはず.

-emu ice-1000 -emu kit
効いてるのかどうか分からないのだが、現状はice1000を使ってないわけで、評価ボード(kit)を使っているから-emu kitである.しかし、後の設定画面でkitを選べないので追加optionで-emu kitを与えている.念のため.

-file restdac.ldr
これがFLASHに焼くhex fileであるが、crosscoreの初期設定では.dxeは生成されても.ldrは生成されないので長々とした設定が必要.後述する.
.dxeはBF706のprogram RAMにコピるbinary.
.ldrはFLASHに焼くhex.
で合ってると思う.

ーーーー
それでは、crosscoreの設定を長々と行う.使ってるのは2.11.1.0

↓最初はproject→Propertiesへ.
↓左端のC/C++ Build→Settingsへ.
↓Build Artifactタブ.Loader Fileにする.
↓Tool Settingタブ.設定を要するのは2つ.
CrossCore BlackFin Loader
CrossCore Device Programmer
前者は、.ldrを作るための設定だと思う.
後者は、FLASHを焼くための設定だと思う.

↓まずは前者から.参考ページあり.
CrossCore BlackFin Loader→General
このようにする.
一番下のInitialization fileは似たのがいろいろ在って悩むが、わたしがBF706評価ボードで上手く動いたのはこれだった.runtime routineでも入ってるのだろう.
C:\Analog Devices\CrossCore Embedded Studio 2.11.1\Blackfin\ldr\init_code\BF7xx_init\BF7xx_init\BF7xx_init.dxe
このinitなんちゃらはCrossCoreをインストすると最初から入っているものであるが、.dxeが最初から在ったかどうかは記憶が定かではない..dxeが無ければprojectを開いて自分でビルドするべし.

以上により、elfloaderのコマンドラインがこのように確定した.これによって、.ldrが生成されるというカラクリだと思う.dxe→ldrに変換してるんだ.
elfloader -proc ADSP-BF706 -si-revision 1.1 -b SPI -f hex -width 16 -bcode 0x01 -init "C:\Analog Devices\CrossCore Embedded Studio 2.11.1\Blackfin\ldr\init_code\BF7xx_init\BF7xx_init\BF7xx_init.dxe"

ーーーー
次は後者の設定.
CrossCore Device Programmer→General
こうする.
ファイル入力のところはこう.
C:\Analog Devices\ADSP-BF706_EZ-KIT_Mini-Rel1.1.0\BF706_EZ-Kit_MINI\Blackfin\Examples\Device_programmer\bf706_w25q32bv_dpia.dxe

もういっこ.念のために.
Tool Settings→CrossCore Device Programmer→Additional Options

以上によって、FLASH焼きコマンドが次のように確定しました.
cldp -proc ADSP-BF706 -verbose -cmd prog -driver "C:\Analog Devices\ADSP-BF706_EZ-KIT_Mini-Rel1.1.0\BF706_EZ-Kit_MINI\Blackfin\Examples\Device_programmer\bf706_w25q32bv_dpia.dxe" -erase affected -emu ice-1000 -format hex -emu kit

ーーーー
ADSP-BF706 EZ-Kit Lite MiniのJP設定.
購入時から変えてないが、念のため、こうなっている.
注意1:基板のJP設定を変えたらUSB抜いて再度挿すべきだそうです

ーーーー
以上の設定を済ませる.
build後にbebuggerボタンの隣に焼きボタンが表示されるようになるのでこれをクリック.ラッキーならFLASHを焼けるはず.

注意2:debuggerが動いている最中は焼きエラーになりますので、debuggerを止めてから焼きましょう

11へ     13へ

かしこ