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.
我在接收 SPI 时遇到问题。 溢出后、接收 ISR 不会触发。
我正在使用主设备、以10字节的数据包连续发送数据。 我正在使用 FIFO 增强功能使能
并且由于有一个具有更高优先级的控制执行、所以允许在 SPI 接收中进行嵌套。
尽管我收到一些溢出、但系统仍在工作。 因此、当我接收到 RXFFOVF 时、我将 FIFO 复位、向 RXFIFORESET 写入0、1
我知道一些数据将丢失、但主器件将再次发送。
在一段时间工作后、问题出现、接收 ISR 突然未触发。 如果我检查外设寄存器、则溢出被置位、RXFFST 为16。
当我在 ISR 中复位 RXFIFO 并且不再调用时、SPI 接收不会恢复。
首先、我怀疑在我复位和清除溢出的位置、但我在所有地方都尝试过、是否知道为什么 ISR 停止触发?
这是接收代码:
//初始化
//启用 SPI FIFO 寄存器
SpicRegs.SPIFFTX.All=0xE040; //启用增强、INT 禁用、清除 Tx INT 标志
SpicRegs.SPIFFRX.bit.RXFFIENA=1; // Rx FIFO INT 使能
SpicRegs.SPIFFRX.bit.RXFFIL = RX_FIFO_LEVEL;// FIFO INT 电平缓冲器
SpicRegs.SPIFFCT.All=0x00; //无延迟
SpicRegs.SPIBRR.ALL =BAUDRATE; //波特率12.5MHz;
SpicRegs.SPICCR.bit.SPICHAR = WORD_BIT_NUMBER_1;//设置要发送或接收的位数
SpicRegs.SPISTS.All=0x0000; //复位状态
SpicRegs.SPIFFRX.bit.RXFIFORESET = 1; //重新启用 RX FIFO
SpicRegs.SPICCR.bit.SPISWRESET=1; //启用 SPI
// 间谍从属设备
_interrupt void receiveEpcMessageSpiDrv (void)
{
uint16_t rxShiftedData;
uint16_t FIFO 接收;
uint8_t 字;
EINT; //允许更高优先级的中断。
FIFO 接收= SpicRegs.SPIFFRX.bit.RXFFST;
for (word = 0;word < FIFO 接收;wore++)
{
//从 SPIRXBUF 中读取 RX FIFO 数据
rxShiftedData = SpicRegs.SPIRXBUF<<(16-word_bit_number);
if (circBuffer.validData < circ_buffer_MAX_LEN)
{
circBuffer.validData++;
circBuffer.spiRxBuff[cBuffer.writeBuffer]= rxShiftData>>(16-word_bit_number);
circBuffer.writeBuffp =(circBuffer.writeBuffer+1)和(circ_buffer_MAX_LEN-1);
}
}
Dint;
IF (SpicRegs.SPIFFRX.bit.RXFFOVF)
{
SpicRegs.SPIFFRX.bit.RXFIFORESET = 0;
PIN_TOGGLE (1);
while (SpicRegs.SPIFFRX.bit.RXFFOVF = 1);
SpicRegs.SPIFFRX.bit.RXFIFORESET = 1;
}
SpicRegs.SPIFFRX.bit.RXFFINTCLR=1; //清除中断标志
PieCtrlRegs.PIEACX.All|=PIEACK_group6;//发出 PIE ACK
}
您好!
我不清楚你观察到的是什么。 您是否说过溢出后 、您可以通过复位 FIFO 来清除 RXFFOVF 位、但接收中断永远不会再次被调用? 或者、您的代码是否在等待 RXFFOVF 清除时卡住?
如果是前者、您使用的 RX_FIFO_LEVEL 是什么? 在观察到问题后、能否读取 SPIFFRx 寄存器的内容?
如果是后者、除了复位 FIFO 之外、您能否通过设置 SPIFFRX.RXFFOVFCLR 来清除 RXFFOVF 标志?