This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] DRV8462EVM:通过 LAUNCHCC3235MOD 的 SPI 控制 DRV8452EVM 时出现问题

Guru**** 657930 points
Other Parts Discussed in Thread: LAUNCHCC3235MOD, DRV8462EVM
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/motor-drivers-group/motor-drivers/f/motor-drivers-forum/1220442/drv8462evm-issues-controlling-the-drv8452evm-via-spi-with-the-launchcc3235mod

器件型号:DRV8462EVM
主题中讨论的其他器件:LAUNCHCC3235MOD

德州仪器(TI)的晚上好!

我当前正在尝试使用 LAUNCHCC3235MOD 作为主器件、通过 SPI 控制 DRV8462EVM。 我无法使电机执行任何步骤、我想知道是否有人能向我指出正确的方向。 我以前使用过这类驱动器、但严格来说、是在 H/W 设置中使用、而不是 SPI。 我相信我只是错过了一些痛苦明显的东西。

我正在尝试通过 SPI 向地址0x04和0x05 (0b0000010010001111和0b0000010111110000)发送两个 uint16_t 值。 我不是要尝试执行任何过于复杂的操作、而是尝试指示电机驱动器采取步骤。 是否有任何东西明显不完整或不正确?

电机保持其位置并发出嗡嗡声。

下面、我附上了我的代码。 我正在使用 FreeRTOS!

#include <stdint.h>
#include <stddef.h>
#include <stdbool.h>
#include <string.h>
#include <ti/drivers/GPIO.h>
#include <ti/drivers/Timer.h>
#include <ti/drivers/UART2.h>
#include <ti/drivers/SPI.h>
#include <pthread.h>
// #include <semaphore.h> // May not use semaphores this time.
#include <unistd.h>
#include "ti_drivers_config.h"

// TMP global uart define:
static UART2_Handle uart;

// TMP global led pin defines:
const uint8_t led_red = 10;
const uint8_t led_green = 11;
const uint8_t led_blue = 9;

void *masterThread(void* arg0)
{
  SPI_Handle      masterSpi;
  SPI_Params      spiParams;
  SPI_Transaction transaction;
  bool            transferOK;

  // Outputs:
  GPIO_setConfig(CONFIG_GPIO_nSLEEP, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
  GPIO_setConfig(CONFIG_GPIO_MODE,   GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
  GPIO_setConfig(CONFIG_GPIO_ENABLE, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);

  // Open SPI as master (default)
  SPI_Params_init(&spiParams);
  spiParams.frameFormat = SPI_POL0_PHA0; // Need to check this. // SPI_POL0_PHA1
  spiParams.bitRate = 10000; // 10000000
  spiParams.dataSize = 16;
  masterSpi = SPI_open(CONFIG_SPI_MASTER, &spiParams);
  if (masterSpi == NULL)
  {
    while (1);
  }

  // Configure the the motor driver in SPI mode:
  GPIO_write(CONFIG_GPIO_nSLEEP, 0);
  sleep(1); // tmp
  GPIO_write(CONFIG_GPIO_MODE, 1);
  sleep(1); // tmp
  GPIO_write(CONFIG_GPIO_nSLEEP, 1);
  GPIO_write(CONFIG_GPIO_ENABLE, 1);
  UART2_write(uart, "READY\r\n", 7, NULL);
  while (1)
  {
    // Write to CTRL1 and CRTL2:
    uint16_t tx_buf[2] = {0b0000010010001111, 0b0000010111110000};
    uint16_t rx_buf[2];
    memset((void *) rx_buf, 0, 2);
    transaction.count = 2;
    transaction.txBuf = (void*) tx_buf;
    transaction.rxBuf = (void*) rx_buf;
    transferOK = SPI_transfer(masterSpi, &transaction);
    // SPI transfer:
    GPIO_write(led_red, 1);
    transferOK = SPI_transfer(masterSpi, &transaction);
    if (transferOK)
    {
      UART2_write(uart, "TC\r\n", 4, NULL); // Transfer Complete.
    }
    GPIO_write(led_red, 0);
    volatile int i;
    for (i = 0; i < 10000; i++)
    {
      // TMP "delay."
    }
  }
  SPI_close(masterSpi);
  return (NULL);
}

void timerCallback(Timer_Handle Handle, int_fast16_t status)
{
    GPIO_toggle(led_blue);
}

void *mainThread(void* arg0)
{
  // Initialization:
  GPIO_init();
  Timer_init();
  SPI_init();

  // LED Outputs:
  GPIO_setConfig(led_red,   GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
  GPIO_setConfig(led_green, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
  GPIO_setConfig(led_blue,  GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);

  // Set initial LED states:
  GPIO_write(led_red,   1);
  GPIO_write(led_green, 1);
  GPIO_write(led_blue,  1);

  // Timer:
  Timer_Handle timer_0;
  Timer_Params timer_params;
  Timer_Params_init(&timer_params);
  timer_params.period = 1000000;
  timer_params.periodUnits = Timer_PERIOD_US;
  timer_params.timerMode = Timer_CONTINUOUS_CALLBACK;
  timer_params.timerCallback = timerCallback;
  timer_0 = Timer_open(0, &timer_params);
  if (timer_0 == NULL)
  {
    while (1); // Timer_open() failed!
  }
  if (Timer_start(timer_0) == Timer_STATUS_ERROR)
  {
    while (1); // Timer_start failed!
  }
  GPIO_write(led_red, 0); // Timer creation success.

  // UART:
  UART2_Params uart_params;
  UART2_Params_init(&uart_params);
  uart_params.baudRate = 115200;
  uart = UART2_open(CONFIG_UART2_0, &uart_params);
  if (uart == NULL)
  {
    while (1); // UART2_open failed!
  }
  GPIO_write(led_green, 0); // UART creation success.

  // SPI setup:
  pthread_t           thread0;
  pthread_attr_t      attrs;
  struct sched_param  priParam;
  int                 retc;
  int                 detachState;
  pthread_attr_init(&attrs);
  detachState = PTHREAD_CREATE_DETACHED;
  retc = pthread_attr_setdetachstate(&attrs, detachState);
  if (retc != 0)
  {
    while (1); // pthread_attr_setdetachstate() failed!
  }
  retc |= pthread_attr_setstacksize(&attrs, 2048); // TODO
  if (retc != 0)
  {
    while (1); // pthread_attr_setstacksize() failed!
  }
  priParam.sched_priority = 1;
  pthread_attr_setschedparam(&attrs, &priParam);
  retc = pthread_create(&thread0, &attrs, masterThread, NULL);
  if (retc != 0)
  {
    while (1); // pthread_create() failed!
  }
  GPIO_write(led_blue, 0); // SPI creation success.

  while (1)
  {
    UART2_write(uart, "Green\r\n", 7, NULL);
    GPIO_toggle(led_green);
    volatile int i;
    for (i = 0; i < 10000; i++)
    {
    }
  }
}

SPI 配置:

通过 MOSI 发送到 SDI 的数据的屏幕截图:

我的硬件设置图片:

我的直流电源(尝试运行时):

任何帮助将会非常非常感谢。 这一切我都不知道!

非常感谢

Dan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我不小心将模式引脚永久接地、因此无法将驱动器配置为 SPI 模式! 解决这个问题后、事情似乎在工作。

    对不起这个傻傻的错误