LMX8410LEVM  TEST1

テスト回路の形成
LMX8410LEVMの評価ボードを手にする機会があったので触ってみる。
まず、評価ボードのマニュアルを見て配線がどうピンに引き出されているかを確認する。
 


キーのある方を写真のように下にした時、左下が1番ピン。回路図からCS、SDI(MOSI)、SCK、さらにGNDのピンがどこに出ているかを確認する。


一般的にMISOに対応するピンは、Mux_outとシルク印刷されているTP6に出てくるのでここはICクリップで摘まむ。このMux_outがJ13のピンに出てていてくれていれば・・・


STM32F103との配線を行う。先に答えをいうと
PA4-CS
PA5-SCK
PA6-Mux_out
PA7-SDI
に接続する。あとGNDも共通にとっておく。


電源はSMAのコネクタの端子から5Vの電源に接続。SMAのコネクタの先がワニ口クリップになっているケーブルを用いて接続。(上の電源、電圧値は正しいが電流は正しくない)
初期状態でどうなっているかわからないので、テストするまでは5Vの供給は止めておいて、マイコンを走らせてから出力させるようにした。

コーディング設定

NEW-STM32 Projectで新しいプロジェクトを開く。
使うMPU(ここではF103C8T6)を選択。

SPIを使うのでSPI1にチェック。ModeをFull-Deplex Masterを選択。
下のクロックParametersでPrescalerを16にでもしておく。(のちにUSBを使ってクロックをはやくしたいので)

次に出力状態をUSBのCDC経由でシリアルにPCに表示させたいので、
USBを選択、Device(FS)のチェックを入れる。

MiddlewareのUSB_DEVICEが反転するので、ModeをCDCを選択。その他はデフォルトのまま。
クロックの調整をする。クリスタルを接続してやる。
RCCをクリックして、HSFをCrystal/Ceramic Resonatorを選択

クロックは上のように設定する。
この状態でセーブしてコードを自動生成する。

コーディング
USBのCDCを使うのでインクルードする。

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "usbd_cdc_if.h"
/* USER CODE END Includes */

用いる変数の定義をしておく。

/* USER CODE BEGIN PV */
uint8_t cdc_TX_Buffer[64];
uint8_t SPI_RX_buffer[3];
uint8_t control_bits[3];
/* USER CODE END PV */
USB経由で送り出す文字列を格納する変数
SPI経由で文字列を受け取る変数
評価ボードに送り込む命令を格納する変数

whileの中は、
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  control_bits[0]=0b11101001;
  control_bits[1]=0x00;
  control_bits[2]=0x00;

  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
  HAL_SPI_TransmitReceive(&hspi1, &control_bits[0],  &SPI_RX_buffer[0],3, 100);
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);

  sprintf((char*)cdc_TX_Buffer, "%x\n\r",SPI_RX_buffer[1]);
    while(CDC_Transmit_FS(cdc_TX_Buffer, strlen((char*)cdc_TX_Buffer)) == USBD_OK) {}
  sprintf((char*)cdc_TX_Buffer, "%x\n\r",SPI_RX_buffer[2]);
    while(CDC_Transmit_FS(cdc_TX_Buffer, strlen((char*)cdc_TX_Buffer)) == USBD_OK) {}

    HAL_Delay(1000);
  }

0b11101001の部分
最初の1はReadを意味していて、書き込みするときは0にする。
続く7ビットはレジスタの番号。
ここでは、テストのためR105を読みにいってみる。105を二進数で示すと、”1101001”
これで”R105の状態を読みなさい!”となる。
レシーブするのは、16bitで8ビットの配列で受ける。SPI_RX_buffer[0]の最初は送信しているタイミングデータが格納されるので、SPI_RX_buffer[1],SPI_RX_buffer[2]にほしい答えが格納される。

動作確認テスト

まず、デジアナで確認してみる。CS(Channel 0)がLOWになってからクロック(Channel 1)が出て、その後MOSI(Channel 2)から命令として0b11101001が送り込まれて、その後16ビットでChannel 2に状態がかえってくる。0001110


データシートのR105の状態と一致する。

USB経由でシリアルに出しているので、そちらも確認する。

上位ビットはすべてゼロで、1C は2進数で”00011100”なので当然、データシートの記載内容と一致する。

関数化

関数化しておく

/* USER CODE BEGIN 4 */
uint16_t LMX8410L_Read(uint8_t reg)
{
static uint8_t SPI_RX_buffer_[3];
static uint8_t control_bits[3];

  control_bits[0]=(0x1<<7)|reg;
  control_bits[1]=0x00;
  control_bits[2]=0x00;

  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
  HAL_SPI_TransmitReceive(&hspi1, &control_bits[0],  &SPI_RX_buffer_[0],3, 100);
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);

  return  (SPI_RX_buffer_[1]<<8)|SPI_RX_buffer_[2];
}
/* USER CODE END 4 */

これにあわせて、プロトタイプを
/* USER CODE BEGIN PFP */
uint16_t LMX8410L_Read(uint8_t reg);
/* USER CODE END PFP */

と宣言。
whileの中身を
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  for (int i=0;i<128;i++){
  sprintf((char*)cdc_TX_Buffer, "%03d=%04x\n\r",i,LMX8410L_Read(i));
    while(CDC_Transmit_FS(cdc_TX_Buffer, strlen((char*)cdc_TX_Buffer)) == USBD_OK) {}
  }
    HAL_Delay(1000);
  }
  /* USER CODE END 3 */

として128個あるレジスタの内容をすべて書き出してみる。

これで中身を知りたいレジスタの状態を読み取る事ができる。





コメント

このブログの人気の投稿

Attiny85とAQM0802A(LCD)のI2C接続

Attiny85 FuseRest

HS101 STM32の自作お手軽オシロスコープ