工具与软件:
大家好、我正在尝试通过 SSI 与 drv8308通信、但每次它的读数都是0xFF。
#include
#include
#include
#include
#include "inc/hw_i2c.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/gpio.h"
#include "driverlib/i2c.h"
#include "driverlib/pin_map.h"
#include "driverlib/sysctl.h"
#include "driverlib/uart.h"
#include "driverlib/ssi.h"
#include "driverlib/interrupt.h"
uint32_t ui32SysClock;
uint32_t Datarx[3]={0};
uint8_t uartTx[100];
#define REG_ADDR_1 0x01
#define REG_ADDR_2 0x02
#define REG_ADDR_3 0x03
void delayms ( uint32_t ui32Ms )
{
SysCtlDelay (ui32MS *(120000000 / 3 / 1000));
}
void delayus ( uint32_t ui32U )
{
SysCtlDelay (ui32U *(120000000 / 3 / 1000000));
}
void init_UART0 (void)
{
SysCtlPeripheralEnable (SYSCTL_PERIPH_UART0);
SysCtlPeripheralEnable (SYSCTL_PERIPH_GPIOA);
GPIOPinConfigure (GPIO_PA0_U0RX);
GPIOPinConfigure (GPIO_PA1_U0TX);
GPIOPinTypeUART (GPIO_PORTA_BASE、GPIO_PIN_0 | GPIO_PIN_1);
UARTConfigSetExpClk (UART0_BASE、ui32SysClock、1500000、(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE));
}
void uart_0transmit (const uint8_t * str)
{
uint16_t i = 0;
while (str[i]!='\0')
{
UARTCharPut (UART0_BASE、str[i]);
I++;
}
}
void init_SSI (void)
{
SysCtlPeripheralEnable (SYSCTL_PERIPH_SSI0);
SysCtlPeripheralEnable (SYSCTL_PERIPH_GPIOA);
GPIOPinConfigure (GPIO_PA2_SSI0CLK);
GPIOPinConfigure (GPIO_PA4_SSI0XDAT0);
GPIOPinConfigure (GPIO_PA5_SSI0XDAT1);
GPIOPinTypeSSI (GPIO_PORTA_BASE、GPIO_PIN_5 | GPIO_PIN_4 | GPIO_PIN_3 | GPIO_PIN_2);
SSIConfigSetExpClk (SSI0_BASE、ui32SysClock、SSI_FRF_MOTO_MODE_1、SSI_MODE_MASTER、1000000 8);
SSIEnable (SSI0_BASE);
while (SSIDataGetNonBlocking (SSI0_BASE、&Datarx[0]));
}
void init_GPIO (void)
{
SysCtlPeripheralEnable (SYSCTL_PERIPH_GPIOM);
GPIOPinTypeGPIOOutput (GPIO_PORTM_BASE、(GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3));
}
void browser_initial (void)
{
GPIOPinWrite (GPIO_PORTM_BASE、GPIO_PIN_3、GPIO_PIN_3);//启用 drv
GPIOPinWrite (GPIO_PORTM_BASE、GPIO_PIN_1、GPIO_PIN_1);// DRV 的复位
delayus(10);
GPIOPinWrite (GPIO_PORTM_BASE、GPIO_PIN_1、0);// drv 复位
GPIOPinWrite (GPIO_PORTM_BASE、GPIO_PIN_0、0);//使芯片选择变为低电平
GPIOPinWrite (GPIO_PORTM_BASE、GPIO_PIN_2、GPIO_PIN_2);//用于电机断路
}
void SPI_Write (uint8_t Addr、uint16_t data)
{
GPIOPinWrite (GPIO_PORTM_BASE、GPIO_PIN_0、GPIO_PIN_0);
SSIDataPut (SSI0_BASE、Addr);
SSIDataPut (SSI0_BASE、((DATA >> 8)和0xFF);
SSIDataPut (SSI0_BASE、(DATA 和0xFF));
GPIOPinWrite (GPIO_PORTM_BASE、GPIO_PIN_0、0);
}
空 SPI_READ (uint8_t Addr)
{
GPIOPinWrite (GPIO_PORTM_BASE、GPIO_PIN_0、GPIO_PIN_0);
SSIDataPut (SSI0_BASE、(Addr | 0x80));
SSIDataPut (SSI0_BASE、0);
SSIDataPut (SSI0_BASE、0);
SSIDataGet (SSI0_BASE、&Datarx[1]);
SSIDataGet (SSI0_BASE、&Datarx[2]);
GPIOPinWrite (GPIO_PORTM_BASE、GPIO_PIN_0、0);
}
int main (void)
{
ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_240)、120000000);
init_ssi();
init_gpio();
init_UART0();
BLOWER_INITIALIZE();
SPI_Write (0x00、0x0002);
SPI_READ (0x00);
memset (uartTx、"\0"、100);
sprintf ((char *) uartTx、"%#X\t\t%#X\n"、Datarx[1]、Datarx[2]);
UART_0TRANSMIT (uartTx);
while (1)
{
}
}
避免简洁和任何拼写错误
此致、
Hemanth