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