请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号: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