投稿

2月, 2023の投稿を表示しています

nRF NFCをやってみる

イメージ
  テストでNFCでデータのやり取りをする環境を整えてみる。 XAIOの裏面にNFCの端子が出ていて、ここにアンテナを接続する。がこのアンテナだけというのは自作でもしないとなかなか手に入りにくい。 でアンテナをどうやっても持ってくるか?手元にFelica用のカードリーダーが余っていたのでそれを転用する事にした。 使ったものとは別だが、こんな感じのもの。おそらくタグとかでもOKなはず。 というのも、欲しいのは、アンテナを構成するL(インダクタ)とLCの共振器を構成するコンデンサの部分だけ。 https://www.murata.com/ja-jp/products/inductor/nfc/design-development/tech 村田製作所のHPより。 大抵の場合はNXP社製のICがNFC用のICとして使われていて、LCからなるLPFがあって、その後にアンテナのL(回路でとぐろを巻いている部分)とアンテナ本体にあたる。急進を得るためのL部分とキャパシタンスからなる。アンテナと言ってもLのとぐろを巻いているところだけ付けても動かない。LCとの共振回路を成すためにCが必要。  上の図でいうとTXという文字がある部分にXAIOのアンテナ端子を接続するようにすればOKで、この基板に載っているNFCICのアンテナ接続用のピンから先を転用する。  アンテナとキャパシタンスは共振周波数が合うように設計されているので、これを個別にもってこようとすると大変なので、そのまま転用する。キャパシタンスはともかく、PCB基板上に設けられたLはどれだけの値か?と把握する事は難しいので、コンデンサーも基板の上のものを使う。 LCフィルタはなくても質の問題だけで動くはず。 大き目の表面実装部品が、フィルタのインダクタで2つならんでいるので、その入り口に半田で接続。一応、NFCの制御IC(NPX社のものが積んであった)からのパターンはカッターで切断した。またGNDを接続してやる。テスターを当ててやると、別のパターンの大きな所がGNDと同電位で導通していたのでそちらに半田してやりブレッドボードのGNDに接続。 XAIO側には、極性は関係がないので、半田してケーブルをひきました( (赤と黒の線)。13.56MHzの信号が通るので一応長さとかできればよじるとか?同軸を使うとかした方が本来はよのかも・

STM HAL 同一SPIバス上ICのモード切り替え

イメージ
  SPI接続するICを2つ制御する場合、一番簡単なのは、SPIのバスを変えて2つ使う事。 これは簡単だが、場合によっては配線をその分必要とするので面積や、余剰のピン次第。 SPIのバスを1つにカスケードされたもののモードを動作中に変えられるか? Can SPI clk polarity and clk phase be changed on the fly? https://community.st.com/s/question/0D50X00009XkdzRSAR/can-spi-clk-polarity-and-clk-phase-be-changed-on-the-fly とかでも質問があがっており、”これは実践的なテストであり、ドキュメントで保証されるものではありません。”と言われている・・・・ HandleSpiBMP.Init.CLKPolarity = SPI_POLARITY_HIGH; HandleSpiBMP.Init.CLKPhase = SPI_PHASE_2EDGE; を変えられるか?という事を試した。 結論:変えられる。 ただし、一筋縄ではいかない。ICの素性にもよる。 必ずロジアナが手元にあって波形を見ながらいろいろ試して初めてできるという事が結論である。 When controlling two SPI-connected ICs, the easiest way is to use two different SPI buses. This is easy, but in some cases it requires more wiring, so it depends on the area and the extra pins. Can the mode of the cascaded SPI buses be changed during operation? In other words, is it possible to change the mode of a cascaded SPI bus during operation? HandleSpiBMP.Init.CLKPolarity = SPI_POLARITY_HIGH; HandleSpiBMP.Init.CLKPhase = SPI_PHASE_2EDGE

STM HAL ADS8341E

イメージ
 TI社のADS8341EをSPIで動かしてみる。 【テスト回路の作製】 https://www.ti.com/product/ja-jp/ADS8341/part-details/ADS8341E/2K5 丁寧に、リアルな見た目の回路図がデータシートに載っているのでその通りに回路をブレッドボードに作る。 マニュアルより引用 SPI関係のワイヤーを接続する前はこんな感じ。(コンデンサーは別に割愛しても動くが・・・) ジャンパーワイヤーを使ってSPIのピンにあわせの配線もこのあとやってやる。 【コーディング】 新規ファイルーSTM32 projectを立ち上げる。 ConnectivityでSPI1を選択し、Full Demux Masterを選択。PIN3をCSピンとしてGPIP outputとして設定する。 クロックは待機状態の時LOWなのでCPOLをLOWを選択、CPHAは1stEdgeを選択しておく。 ADCの場合DACとかと違い、テスターをあてて出力を確認するとかできないので、デバッグには表示器が必要。OLEDに表示できれば、それを使う。ここではCDC-USBでシリアルで答えを吐き出す事を行う。 ConnectivityのUSBも選択、Device(FS)にもチェックを入れる。 チェックを入れるとMidlewareの所にUSB_DEVICEが反転選択できるようになるので、ClassはCDCを選択する。 USBを使うのでクロックとしてちゃんとしたものが必要なので、 System coreのRCCを選択して、HSEをCrystal/Ceramic Resonatorを選択する。 次いでクロックのClock Configrationのタブを開いてクロックの調整をする。 これでUSBのクロックを設定すると今度は、SPIのクロックがエラーになるはずなので Prescalerを設定する4以上を選択する。ADS8341 は、2.4MHz を超えるクロック・レートでデータをシフト・イン/アウトすることができるが、但し、最小収集時間ACQは1.7μs以上に保たれると記載がある。4ビット分のクロックで1.7usecだから、1.7/4=0.425usec/ bitで、クロック周波数に直すと、1/0.425=2.35MHz? (結果的に実験的に、Prescalerを最速の4、18M

nRF APP_TIMER

イメージ
 APP_TIMERを少しやってみた。 sys_configの中身を確認しておく。templateから作っているので、必要なものはある。 The low frequency clock (LFCLK) クロックのタイマーは32.768kHz(上の数字は2で割られている) app_timer: RTCペリフェラルを使用するSWタイマライブラリで、LFCLKを使用 nrf_drv_timer: TIMERペリフェラル用のドライバ。RTCと同等と考えることができるが、LFクロックの代わりにHFクロックを使用する。 流れは以下 1.  ヘッダーファイルを読み込む(対応するcファイルがない場合は加える) 2.タイマーに使う定数を定義する。 3. idを生成する。 4.クロックの設定とタイマーハンドラーを作る。 5. main の中で初期化してタイマータスクを開始する。 1.  ヘッダーファイルを読み込む //To use application timer #include "app_timer.h" #include "nrf_drv_clock.h" コンパイルしてエラーがないか確認する。 2.タイマーに使う定数を定義する。 #define LED_INTERVAL APP_TIMER_TICKS(200) を定義する。APP_TIMER_TICKSは200msecを待つ時に必要なTICKSの数に変換してくれる関数。 3. idを生成する。 mainの外で APP_TIMER_DEF(timer_id); timer_idの部分は任意で、タイマーの識別子。識別子を作成し、タイマー用のメモリを静的に割り当てる。 4.クロックの設定とタイマーハンドラーを作る。 static void lfclk_config(void) {   ret_code_t err_code =nrf_drv_clock_init();   APP_ERROR_CHECK(err_code);   nrf_drv_clock_lfclk_request(NULL); } static void app_timer_handler(void * p_context) {      nrf_gpio_pin_toggle(26); } nrf_drv_clock_

nRF I2C LSM6DS3TR-C

イメージ
 I2Cの理解のために、センサから値を読む事をしてみる。 【回路】 nRFの勉強に、正規のDKをつかわず、XAIOで勉強しているのだが、メリットの一つはSeeed Seeed Studio XIAO nRF52840 Senseを購入していると、6軸慣性センサ(IMU)がすでに搭載されている。型番は以下のLSM6DS3TR-Cである事がわかる。 https://wiki.seeedstudio.com/XIAO_BLE/ このセンサはI2Cに接続されているので、I2Cを学ぶのに回路をブレッドボードに作らなくてもすぐに試せる。 でどのピンに接続されているかは、 回路図 を見てみるとわかる。 https://files.seeedstudio.com/wiki/XIAO-BLE/Seeed-Studio-XIAO-nRF52840-Sense-v1.1.pdf P0.27にINTERNAL_I2C_SCLのラベルP0.07にINTERNAL_I2C_SDAのラベルがついていてそれぞれ内部でどこに接続されているかはわかる。また、6D_PWRのラベル のついているP1.08のピンがHIHGになると、このICに電源が共有される。また6D_INI1のピンはP0.11に接続されている。 【コードの記載】 過去に作っているTemplateからnRF_logでシリアルに文字列が出力ができるプロジェクトをテンプレートにするため、フォルダーをmyprojectsの下にでもコピーして名前を変更する。 ダブルクリックしてSESで立ち上げる。 I2Cのアドレス SDO/SA0 ピン(1番ピン)は。デバイスアドレスの下位ビットを変更するために使用されるSDO/SA0ピンが電源電圧に接続されている場合 LSbは'1'(アドレス1101011b)、SDO/SA0ピンがグランドに接続されている場合 LSbは'0'(アドレス1101010b)。 XAIOのSENSEの場合は、SDO/SA0ピンはGNDに接続されているのでアドレス1101010bになる。これは2進数8ビットで表現すると6A。 ヘッダーファイルと変数 まず、#includeしている所に、 //To use I2C #include "nrf_drv_twi.h" と6D_PWRのラベル の