主题中讨论的其他器件: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; }
感谢您的帮助。