0
问答首页 最新问题 热门问题 等待回答标签广场
我要提问

飞思卡尔的MC9S08QE128的SPI中断问题

我在使用QE128的SPI2模块时,用的是中断方式收发,在初始时将SPIxC1寄存器的SPTIE位(SPI Transmit Interrupt Enable)置1。但无数据传输时,程序始终会由于SPIxS寄存器的SPTEF位(SPI Transmit Buffer Empty Flag)置位而触发中断。中断里我每次都会读取SPIxS寄存器来清除该标志,但又会被程序自动置位。请问有用过SPI中断的朋友指导下,谢谢!附上程序如下:
void SPI2_Init(void)
{  
    SPI2C1 = 0x00;
    SPI2C2 = 0x00;
   
    // SPIE=1; SPE=1; SPTIE=1; MSTR=1; CPOL=1; CPHA=1; SSOE=0; LSBFE=0
SPI2C1 = 0xFC;

// bit7=0; bit6=0; bit5=0; MODFEN=0; BIDIROE=1; bit2=0; SPISWAI=1; SPC0=0
SPI2C2 = 0x0A;
SPI2BR = 0x22;
}
void SPI2_Interrupt(void)
{
uint8 tmp;
uint8 tda;

tmp=SPI2S;
tda=SPI2D;

if(tmp & 0x80)           //SPRF=1, SPI Read Buffer Full Flag
{
    if(rbufc) {
      SPI2_SerFlag |= CHAR_IN_RX;
      rbufc--;
      *rbuf++ = tda;
      SPI2D = 0xFF;       //Dummy Byte
      if(rbufc == 0) {
        CS_CLR;           //Chip Select high
        SPI2_SerFlag &= ~CHAR_IN_RX;
      }
    }
}
else if(tmp & 0x20)      //SPTEF=1, SPI Transmit Buffer Empty Flag
{
    if(tbufc) {     //sending data
      SPI2_SerFlag |= CHAR_IN_TX;
      tbufc--;
      SPI2D = tbuf[tbufc];        
    }
    else {
      if(tbuf[0] != 0xFF)   //Don't wait for reading data
        CS_CLR;             //Chip Select high
      SPI2_SerFlag &= ~CHAR_IN_TX;
    }
}
}
提问者:sdvywye 地点:- 浏览次数:1059 提问时间:12-21 14:32
我有更好的答案
提 交
3条回答
lc123617 12-22 20:15 回答数:1 被采纳数:0
你在ISR中将标志寄存器清零 这个没错.
但我记得好像一都都是写1清0吧.
你看你的这句话:SPI2_SerFlag &= ~CHAR_IN_TX;
我觉得应该是SPI2_SerFlag |= CHAR_IN_TX;
手册里应该有写这么一句话:Write 1 to clean this bit.
hjh22678 12-29 23:57 回答数: 被采纳数:
SPI2_SerFlag是我定义的一个标志寄存器,清中断应该是通过读取SPI2S的方式,但我每次都读取了SPI2S,系统还是会自动将它置位,就算没有数据发送了
mczxm 12-22 04:30 回答数:0 被采纳数:0
坐等高手前来解答
撰写答案
提 交
1 / 3
1 / 3