我在接收 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
}