This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TMS320C6678: 请教关于SPI串行传输速度问题咨询!

Part Number: TMS320C6678
Other Parts Discussed in Thread: TPIC2060A

The SPI has the following features:

Up to 66 MHz operation

上面关于《Serial Peripheral Interface( SPI) for KeyStone Devices User'sGuide》说明书提到最高支持66 MHZ 的操作。

在C6678的硬件平台下,在3.3us(3300ns)中断周期内实施SPI的二路总线控制,进行多次SPI读写数据(DSP向TPIC2060A(35M=28.6ns)、AD・DA(48M=21ns)板使用SPI进行数据传输)。其中36M SPI 器件一个读写寄存器都是16(数据位)+2(启动)*28.6ns=514.8ns。

遇到问题,理论计算中断周期内3300/515=6.4可以进行SPI通讯次数6.4。但是实际发送时,只发送4次就中断周期超时了2.3us(5.6us),3个超时1us(4.3),估算5.6-4.3=1.3us,一次发送使用时间为1.3us,远远超过了514.8ns

SPI 通讯参考了TI的《7242.K1_STK_v1.1》SPI驱动代码:

//参考案例中,SPI通讯采用是读写同步方法(边写边读方式)函数名如下:

Uint32 KeyStone_SPI_TxRx(Uint8 * txBuf, Uint32 firstTxByte,
Uint32 numTxByte, Uint8 * rxBuf, Uint32 firstRxByte, Uint32 numRxByte,
SPI_Transfer_Param * transfer)

检查程序中,发现上面函数调用了KeyStone_SPI_wait_flag函数延时检查TXINTFLG和RXINTFLG状态。

代码:if(0==KeyStone_SPI_wait_flag(CSL_SPI_SPIFLG_RXINTFLG_MASK, CSL_SPI_SPIFLG_RXINTFLG_MASK))

#define SPI_TIMEOUT_CYCLES ((1000)*8*100)

Int32 KeyStone_SPI_wait_flag(Uint32 flag_mask, Uint32 expect)
{
Uint32 startTSC;
Uint32 delay;
volatile Uint32 flag;

startTSC= TSCL;
//flag_mask:CSL_SPI_SPIFLG_RXINTFLG_MASK
flag= gpSPI_regs->SPIFLG&flag_mask; //CSL_SPI_SPIFLG_RXINTFLG_MASK (0x00000100u)

/*Wait until SPI flag= expect value */
//1 = Transmit buffer is empty. An interrupt is pending to fill the transmitter.
while(flag!= expect)
{
/*if wait time is much larger than theoretical transfer time of
a byte, then it is looked as timeout.*/
delay= TSC_getDelay(startTSC);
// printf("KeyStone_SPI_wait_flag delay= %d \n",delay);
if(delay> SPI_TIMEOUT_CYCLES)
{
printf("KeyStone_SPI_wait_flag 0x%x timeout, SPIFLG=0x%x\n",
flag_mask, gpSPI_regs->SPIFLG);

return 0;
}
flag= gpSPI_regs->SPIFLG&flag_mask;

};

return 1;
}

函数的作用是判断SPI Flag Register (SPIFLG)中TXINTFLG和RXINTFLG,其中有延时等待代码判断TXINTFLG和RXINTFLG是否为1,产生延时。

起初,尝试修改#define SPI_TIMEOUT_CYCLES ((1000)*8*100)---〉#define SPI_TIMEOUT_CYCLES ((400)*1*1),运行SPI传输时间没有发生变化。

再在 KeyStone_SPI_TxRx函数中屏蔽了写入TXINTFLG判断,4次SPI通讯中断周期变成4.7us(比过去5.6us短0.9us)。此时,两个SPI控制IC读取写寄存器数据OK。

最后,在KeyStone_SPI_TxRx函数中屏蔽了写入RXINTFLG判断,中断周期恢复到正常的3.3us。但是两个SPI控制IC读取寄存器数据NG,但是写入数据ic动作了。

1、SPI 说明书中最大操作速度66MHZ,指的是SPIDAT1或SPIBUF寄存器数据转换速度也能支持到66MHZ。

2、为了保证SPI传输数据正确性,读写SPIDAT1或SPIBUF寄存器前都需要判断TXINTFLG和RXINTFLG标志位吗?从说明书理解写入新的SPIDAT1数据时,TXINTFLG会更新,那么写入数据时候需要判断吗?

3、现在屏蔽了写入RXINTFLG判断,中断周期恢复到正常的3.3us,并且IC有动作(感觉动作正常),能说明被控IC读取到SPI的发送数据,能排除硬件电路问题吗?