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.

[参考译文] CCS/TMS320F28035:DRV8308之间的 F2803x SPI 通信问题

Guru**** 2562100 points
Other Parts Discussed in Thread: DRV8308

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/637452/ccs-tms320f28035-f2803x-spi-communication-issue-between-drv8308

器件型号:TMS320F28035
主题中讨论的其他器件:DRV8308

工具/软件:Code Composer Studio

大家好、我使用的是包含 F28035 MCU 和 DRV8308的卡。 我将使用具有 FIFO 和中断的 SPI 模块。 DRV8308芯片选择状态为高电平有效并且我无法从寄存器(尝试过 SPIPRI.STEINV 寄存器、但不起作用)中更改它、所以我使芯片选择引脚输出。 当传输开始时、我将使其变为高电平、当 RX FIFO 已实现数据时、它将变为低电平。  

我的 SPI init 函数如下所示:

SpiaRegs.SPICCR.bit.SPISWRESET=0;//重置 SPI

SpiaRegs.SPICCR.All=0x0007; //8位字符、回送模式关闭
SpiaRegs.SPICTL.All=0x0017; //中断启用,主/从发送启用
SpiaRegs.SPISTS.All=0x0000;
SpiaRegs.SPIBRR=0x007F; //波特率
SpiaRegs.SPIFFTX.All=0xC023; //启用 FIFO,将 TX FIFO 级别设置为3
SpiaRegs.SPIFFRX.All=0x0023; //将 RX FIFO 深度设置为3
SpiaRegs.SPIFFCT.all=0x00;
SpiaRegs.SPIPRI.All=0x0010;

SpiaRegs.SPICCR.bit.CLKPOLARITY = 1;
SpiaRegs.SPICTL.bit.CLK_PHASE = 0;SpiaRegs.SPICCR.SPICESRIT.SPISET.BIT.1

;SpiaRegs.SPICREST.BIT.BIT.BIT.BIT.BIT.BIST.BIT.1 //启用 SPI

SpiaRegs.SPIFFTX.bit.TXFIFO=0;
SpiaRegs.SPIFFRX.bit.RXFIFORESET=1; 

我要做的是将所需的值写入 DRV8308的寄存器、并读回这些值以控制它们是否正常。 (总共13个寄存器)

对于 DRV8308、要进行通信、请禁用复位引脚并启用使能引脚。 (根据数据表)

您可以看到、我正在将 FIFO 寄存器配置为3级、将 SPI 寄存器配置为8位字符以进行移位。  我有一个计时器中断、用于设置通过 SPI 发送的数据。 然后将其加载到 TXBUF 并 将 SpiaRegs.SPIFFTX.bit.TXFIFO 设置为1。   

首先、我想问、当我加载 TXBUF 时、在我制作 TXFIFO 1之前、不会发生3个数据中断。 因此、我无法理解该 SPIFFTX 和 SPIFFRX 中断级别位是如何工作的。

除此之外 、TXFFST 在传输过程中或之后不会改变。 它始终读取为零。 因此、我无法跟踪传输是否完成。

为什么在 MCU 处于传输状态时 TXFFST 不会改变?

在这些问题之后,我提出了这个想法:

_interrupt void spiTxFifoIsr (void)
{

DELAY_US (1000);

COUNT++;
IF (count > 1)
{
count=0;
SPI_inf.spiState_U16++;

SPI_inf.Getdata_b = true;
spi_inf.senddata_b = true;
SpiaRegs.SPIFFTX.bit.TXFIFO = 0;
}

SpiaRegs.SPIFFTX.bit.TXFFINTCLR = 1;//清除中断标志
PieCtrlRegs.PIEACK.All|=0x20; //发出 PIE ACK

} 

上面给出了我的 TxFifoIsr。 我在这里要做 的是发送两次 TXBUFF、然后将 TXFIFO 设置为低电平。 因此不再有 TX FIFO 中断。  但是、在完成一个写入或读取过程(对于任何其他寄存器)之后、我的 bool spi_inf.senddata_b 将触发其他写入或读取过程(对于任何其他寄存器)。 使用此配置、我能够以正确的顺序从 DRV8308写入和读取值。  

当我从代码中删除 if (count>1)条件时,不会执行任何敏感读取。 我无法理解这种情况。  如何纠正?  


我尝试解释我的代码是如何工作的。 为简单起见、我在下面给出了计时器中断和 RX FIFO ISR 代码:

_interrupt void spiRxFifoIsr (void)
{
uint16 i;

for (i=0;i<3;i++)
{
RDATA[I]=SpiaRegs.SPIRXBUF; //读取数据
}


GpioDataRegs.GPADAT.bit.GPIO19=0;

DELAY_US (100);//芯片选择引脚低电平后的延迟;

SpiaRegs.SPIFFRX.bit.RXFFOVFCLR=1;//清除溢出标志
SpiaRegs.SPIFFRX.bit.RXFFINTCLR=1;//清除中断标志
PieCtrlRegs.PIEACK.All|=0x20; //发出 PIE ACK
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

_interrupt void cpu_timer2_isr (void)
{

get_Rxbuffer (&RDATA[0]);

DRV8308_SPI_sendandget_fn ();

PieCtrlRegs.PIEACK.all = PIEACK_Group1;
} 

感谢您的帮助。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Rasih、

    很抱歉、您在使其正常工作方面遇到了一些问题。 让我们看看发生了什么。

    您的配置代码似乎会驱动反相的 SPISTE。 您是否有示波器捕获显示此内容? 如果您在没有 DRV 芯片的情况下测试代码、是否将 SPISTE 驱动为反相?

    当 TX FIFO 深度设置为3时、当 FIFO 中的字少于或者等于3个时、TXFIFO 中断将被触发。 RX FIFO 也是如此。 当 SPIFFRX.RXFFIL = 3时、RX FIFO 中断将在 FIFO 中大于或等于3个字时触发。

    从外观来看、您永远不会到达 FIFO 中任何给定时间都有多个字的位置。 当字从 TXFIFO 移入要发送的移位寄存器时、FIFO 指针实际上会递减。 只要 TXFIFO 中小于3个字的阈值、SPI TX 中断就会持续触发。

    作为测试、将中断级别设置为2、并连续写入4个字到 FIFO 中。 您将看到、在第二个字完全传输之前、中断不会出现。

    您还将禁用 TX FIFO ISR 内部的 TX FIFO。 这可能是一个问题、因为在发送期间 FIFO 可能会被关闭。 将 TXFFIENA 置为0可禁用中断、而不是禁用 FIFO 本身、而不是将 TXFIFO 置为0。 在定时器中断中、可以将 TXFFIENA 设置为1来启用中断。

    实际上、在这里、您可能只是对三个中断之间的同步产生了一些困惑。 您可以通过消除 TXFIFO 中断来简化配置。 您可以依靠 RXFIFO 中断计数来确定读取时间以及完成传输的字数。

    我希望这有助于您再次访问。

    此致、
    标记
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Mark、您好!

    感谢您的及时反馈。 您询问了 SPISTE 引脚状态。 我应该更具体一点。 我要将 SPIASTE 引脚多路复用器配置为正常 GPIO 引脚。 在我加载 TXBUF 之前、将其设置为高电平、当发生 RX 中断时、手动将其设置为低电平以完成传输。

    您可能是我在将 TXFIFO 设置为0时中断 FIFO。 我在初始化时将 TXFFIENA 设置为0。 然后、就在我加载 TXBUF 将 TXFFIENA 设置为1并对 TXFIFO 产生中断之后。 现在、我对 DRV8308的写入和读取没有任何问题。

    我真的很感谢。 非常感谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我很乐意提供帮助。

    如果您有任何其他问题、请随时再次发帖。