“线程:DRV8305”中讨论的其它部件
您好,
使用用于 F280049C 的 DriverLIb 进行 F280049C 和之间的 SPI 通信
DRV8305N,我可以看到 SOMI 引脚上的电气信号(黄色为 CLK,绿色为 ISD SOMI)

数据到达 SPIDAT 寄存器,但在周期结束时未传输到 SPIRXBUF 寄存器:

GPIO 的设置如下:
// GPIO16->SPIA-SDI DRV8305 -> M1_DRV_SDI
GPIO_setPinConfig(GPIO_16_SPIA_SIMO);
GPIO_setDirectionMode(16, GPIO_DIR_MODE_OUT);
GPIO_setPadConfig(16, GPIO_PIN_TYPE_PULLUP);
// GPIO17->SPIA-SDO DRV8305 -> M1_DRV_SDO
GPIO_setPinConfig(GPIO_17_SPIA_SOMI);
GPIO_setDirectionMode(17, GPIO_DIR_MODE_IN);
GPIO_setPadConfig(17, GPIO_PIN_TYPE_PULLUP);
// SPIA->SPIA-CLK for DRV8305 -> M1_DRV_SCLK
GPIO_setPinConfig(GPIO_3_SPIA_CLK);
GPIO_setDirectionMode(3, GPIO_DIR_MODE_OUT);
GPIO_setPadConfig(3, GPIO_PIN_TYPE_PULLUP);
// GPIO11->SPIA_STE - DRV8305 nSCS -> M1_DRV_SCS
GPIO_setPinConfig(GPIO_11_SPIA_STE);
GPIO_setDirectionMode(11, GPIO_DIR_MODE_OUT);
GPIO_setPadConfig(11, GPIO_PIN_TYPE_STD);
SPI ist 初始化如下:
//mySPI0 initialization
// Must put SPI into reset before configuring it
SPI_disableModule(mySPI0_BASE);
// SPI configuration. Use a 500kHz SPICLK and 16-bit word size, 25MHz LSPCLK
SPI_setConfig(mySPI0_BASE, DEVICE_LSPCLK_FREQ, SPI_PROT_POL0PHA0, SPI_MODE_MASTER, 400000, 16);
SPI_disableLoopback(mySPI0_BASE);
SPI_setEmulationMode(mySPI0_BASE, SPI_EMULATION_FREE_RUN);
SPI_enableFIFO(mySPI0_BASE);
SPI_setTxFifoTransmitDelay(mySPI0_BASE, 0x10);
SPI_clearInterruptStatus(mySPI0_BASE, SPI_INT_TXFF);
// Configuration complete. Enable the module.
SPI_enableModule(mySPI0_BASE);
DRV8305寄存器的读数如下所示:
uint16_t DRV8305_readSpi(DRV8305_Handle handle,const DRV8305_Address_e regAddr)
{
DRV8305_Obj *obj = (DRV8305_Obj *)handle;
uint16_t ctrlWord;
uint16_t n;
const uint16_t data = 0;
volatile uint16_t readWord;
static volatile uint16_t WaitTimeOut = 0;
/* volatile SPI_FifoStatus_e RxFifoCnt = SPI_FifoStatus_Empty;*/
volatile SPI_RxFIFOLevel RxFifoCnt = SPI_FIFO_RXEMPTY;
// build the control word
ctrlWord = (uint16_t)DRV8305_buildCtrlWord(CtrlMode_Read,regAddr,data);
// wait for registers to update
for(n = 0; n < 0x08; n++)
{
__asm(" NOP");
}
// reset the Rx fifo pointer to zero
/* SPI_resetRxFifo(obj->spiHandle);*/
/* SPI_enableRxFifo(obj->spiHandle);*/
SPI_resetRxFIFO(obj->spiHandle);
SPI_enableFIFO(obj->spiHandle);
// wait for registers to update
for(n = 0; n < 0x20; n++)
{
__asm(" NOP");
}
// write the command
/* SPI_write(obj->spiHandle,ctrlWord);*/
SPI_writeDataBlockingNonFIFO(obj->spiHandle,ctrlWord);
// wait for the response to populate the RX fifo, else a wait timeout will occur
/* while((RxFifoCnt < SPI_FifoStatus_1_Word) && (WaitTimeOut < 0xffff))*/
while((RxFifoCnt < SPI_FIFO_RX1) && (WaitTimeOut < 0xffff))
{
/* RxFifoCnt = SPI_getRxFifoStatus(obj->spiHandle);*/
RxFifoCnt = SPI_getRxFIFOStatus(obj->spiHandle);
if(++WaitTimeOut > 0xfffe)
{
obj->RxTimeOut = true;
}
}
// wait for registers to update
for(n = 0; n < 0x100; n++)
{
__asm(" NOP");
}
// Read the word
/* readWord = SPI_readEmu(obj->spiHandle);*/
SPI_readDataNonBlocking(obj->spiHandle);
// SPI_readRxEmulationBuffer(obj->spiHandle);
return(readWord & DRV8305_DATA_MASK);
} // end of DRV8305_readSpi() function
我已经多次了解 F280049C 的技术参考手册,但没有
看看我错过了什么。
感谢您的帮助。
谢谢,
约翰