2019年3月23日土曜日

STM32: SPI DACのMCP4922を使う(Nucleo-F446RE)

SPI DACのMCP4922でノコギリ波を2ch出力しました。

実行環境

  • Nucleo-F446RE
  • STM32CubeMX Version 5.1.0
  • System Workbench for STM32 - C/C++ Embedded Development Tools for MCU Version: 2.8.1.201903050911

配線

プロジェクト:
https://github.com/ryood/STM32Cube_Test/tree/master/SW4STM32/Nucleo-F446_MCP4922_Test1

STM32CubeMXの設定


MCP4922はMISOが必要ないのでSPIは「Transmit Only Master」でOKです。


GPIOは、SPIのNSS(CS)をソフトウェアで制御するのに1つ、2ch分ラッチして出力するのでLDAC1つで計2本です。


SW4STM32でコードを追加(一部)


/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

// param
//   channel: 0, 1
//   val: 0 .. 4095
void MCP4922_Write(uint8_t channel, uint16_t val)
{
 channel = channel & 0x01;
 val = val & 0x0fff;

 uint8_t cmd[2];
 cmd[0] = (channel << 7) | (val >> 8) | 0x30;
 cmd[1] = val & 0xff;

 HAL_GPIO_WritePin(SPI1_CS_GPIO_Port, SPI1_CS_Pin, GPIO_PIN_RESET);
 if (HAL_SPI_Transmit(&hspi1, cmd, 2, 100) != HAL_OK) {
  Error_Handler();
 }
 HAL_GPIO_WritePin(SPI1_CS_GPIO_Port, SPI1_CS_Pin, GPIO_PIN_SET);
}

/* USER CODE END 0 */


  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  uint16_t cnt = 0;
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
 HAL_GPIO_WritePin(LDAC_GPIO_Port, LDAC_Pin, GPIO_PIN_SET);
 MCP4922_Write(0, cnt);
 MCP4922_Write(1, 4095 - cnt);
 HAL_GPIO_WritePin(LDAC_GPIO_Port, LDAC_Pin, GPIO_PIN_RESET);

 cnt++;
 if (cnt > 4095) {
  cnt = 0;
 }
  }
  /* USER CODE END 3 */

ノコギリ波の非反転、反転を出力しました。

出力結果


ch1:VOUTA ch2:VOUTB

0 件のコメント:

コメントを投稿