LMX8410LEVM  TEST2(書き込み)


 基本動作



実際はケーブルがなくてソフトを立ち上げて動かしただけ。本来はつなげて動作を見るところからやりたい。またモニターするためにロジアナをICクリップでSCLKなどのテストポートを繋いでみておく事が良い。


TI TICSPro softwareをダウンロード(TI社のメンバーのレジストレーションは必要)してきて触ってみる。結果的にレジスタの正しい値というのはこのソフトを見るしかなく、データシートにはすべて記載されていない。




レジスター書き込みデータの準備
ヘッダーファイルを一つ用意して、そこでデータを記載する。上のソフトでエクスポートしたレジスターデーターをエクセル等で処理。書き込む番地とデータを確実に紐づけるために、番地データを含めた形で用意してやった。






スプレッドシートはこちら
薄いオレンジのセルにコピーぺでデータを流し込んで利用する。

関数の準備

/* 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; //when reading fist bit set to 1
  control_bits[1]=0x00;
  control_bits[2]=0x00;
  //__HAL_SPI_ENABLE(&hspi1);
  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];
}

void LMX8410L_Write(uint8_t reg,uint16_t data)
{

static uint8_t SPI_TX_buffer_[3];
  SPI_TX_buffer_[0]=reg;
  SPI_TX_buffer_[1]=data>>8;
  SPI_TX_buffer_[2]=data & 0xFF;

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
HAL_SPI_Transmit(&hspi1, &SPI_TX_buffer_[0], 3, 100);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
}

void LMX8410L_Write2(uint32_t data)
{

static uint8_t SPI_TX_buffer_[3];
  SPI_TX_buffer_[0]=(data>>16);
  SPI_TX_buffer_[1]=data>>8;
  SPI_TX_buffer_[2]=data & 0xFF;

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
HAL_SPI_Transmit(&hspi1, &SPI_TX_buffer_[0], 3, 100);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
}

プロトタイプの宣言

/* USER CODE BEGIN PFP */
uint16_t LMX8410L_Read(uint8_t reg);
void LMX8410L_Write(uint8_t reg,uint16_t data);
void LMX8410L_Write2(uint32_t data);
/* USER CODE END PFP */

mainの記述


  /* USER CODE BEGIN 2 */
  LMX8410L_Write(127,0x0003);
  LMX8410L_Write(6,0x0100);
//  LMX8410L_Write(127,0x0000);
  int i;
  for (i=0;i<=127;i++)
 {
  LMX8410L_Write2(regdata[i]);
  }
 HAL_Delay(10);


 while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

whileの中に以下のような記述をしてみた。

   /* USER CODE BEGIN 3 */
  for (int i=127;i>=0;i--)
  {
  read_data=LMX8410L_Read(i);
  sprintf((char*)cdc_TX_Buffer, "%02x%04x\n\r",i,read_data);
    while(CDC_Transmit_FS(cdc_TX_Buffer, strlen((char*)cdc_TX_Buffer)) == USBD_OK) {}
  }

  HAL_Delay(1000);
  }
  /* USER CODE END 3 */

問題点

正しく書き込みできたか?書いた後のレジスターの内容を読んで書き出す事をやてみたが・・・中身が一致しない・・・一致する所もあれば一致しない所がある。

かと言ってちゃんと値を返してくる所もあり、書き込みはできているが、読み取りだけが上手くできていないのか?書き込みそのものが上手くできていないのか?というが切り分けできない。

ロジアナで見る限りは、書き込みはちゃんと信号を送っているようには見えている。
レジスターすべてのデータを送り込むとLEDが点灯する事は確認できている。

こうなるとスペアナなんかでPLLから信号が出ているかみるしかないか





コメント

このブログの人気の投稿

Attiny85とAQM0802A(LCD)のI2C接続

Attiny85 FuseRest

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