TI中文支持网
TI专业的中文技术问题搜集分享网站

TMS320C6678: 使用C6678的SPI读取ADIS16505 MEMS IMU数据

Part Number:TMS320C6678

我使用创龙例程中spi.c的c66x_spi_xfer函数测试cs1能够实现自闭环收发,但读取IMU数据却老是读不出来。SPI时钟为1MHz,时钟极性和相位都按IMU手册设置了。我考虑到这个函数是连续读写的,而IMU数据burst模式下写0x6800指令到读出数据可能需要一个延迟,我想或许要分离这里的spi写函数和读函数,试了直接把函数读写部分分开,但执行到读函数时会卡在while判定Rx非空这一步上,对SPI底层逻辑不是很了解,不知道如何修改为好,还请各位指教!感谢!

uint32_t c66x_spi_xfer(uint32_t nbytes, uint8_t *data_out, \
uint8_t *data_in, Bool terminate)
{
uint32_t i, buf_reg;
uint8_t *tx_ptr;
uint8_t *rx_ptr;

tx_ptr = (uint8_t *)data_out;
rx_ptr = (uint8_t *)data_in;

/* Clear out any pending read data */
spiRegs->SPIBUF;

for(i = 0; i < nbytes; i++) {
/* Wait untill TX buffer is not full */
while(spiRegs->SPIBUF & CSL_SPI_SPIBUF_TXFULL_MASK);

/* Set the TX data to SPIDAT1 */
data1_reg_val &= ~0xFFFF;
if(tx_ptr) {
data1_reg_val |= *tx_ptr & 0xFF;
tx_ptr++;
}

/* Write to SPIDAT1 */
if((i == (nbytes -1)) && (terminate)) {
/* Release the CS at the end of the transfer when terminate flag is TRUE */
spiRegs->SPIDAT1 = data1_reg_val & ~(CSL_SPI_SPIDAT1_CSHOLD_ENABLE << \
CSL_SPI_SPIDAT1_CSHOLD_SHIFT);
} else {
spiRegs->SPIDAT1 = data1_reg_val;
}

/* Read SPIBUF, wait untill the RX buffer is not empty */
while(spiRegs->SPIBUF & (CSL_SPI_SPIBUF_RXEMPTY_MASK));

/* Read one byte data */
buf_reg = spiRegs->SPIBUF;
if(rx_ptr) {
*rx_ptr = buf_reg & 0xFF;
rx_ptr++;
}
}

return 0;
}

Shine:

“执行到读函数时会卡在while判定Rx非空这一步上”,请先确认ADIS16505是否有数据发送给DSP端,如果已经发送给DSP了,还是卡在这里的话,再检查dsp端的SPI配置。

可以量一下时序是否正确。

,

Li Guangchen:

好的,非常感谢!

,

Shine:

不客气~

赞(0)
未经允许不得转载:TI中文支持网 » TMS320C6678: 使用C6678的SPI读取ADIS16505 MEMS IMU数据
分享到: 更多 (0)