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も共通にとっておく。
初期状態でどうなっているかわからないので、テストするまでは5Vの供給は止めておいて、マイコンを走らせてから出力させるようにした。
コーディング設定
使うMPU(ここではF103C8T6)を選択。
SPIを使うのでSPI1にチェック。ModeをFull-Deplex Masterを選択。
下のクロックParametersでPrescalerを16にでもしておく。(のちにUSBを使ってクロックをはやくしたいので)
次に出力状態をUSBのCDC経由でシリアルにPCに表示させたいので、
クロックの調整をする。クリスタルを接続してやる。
この状態でセーブしてコードを自動生成する。
コーディング
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
関数化
関数化しておく
/* 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 */
これで中身を知りたいレジスタの状態を読み取る事ができる。
コメント
コメントを投稿