打印

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

[复制链接]
1747|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
pyh921|  楼主 | 2012-12-18 21:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在使用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;
    }
}
}

相关帖子

沙发
shell.albert| | 2012-12-19 09:14 | 只看该作者
你在ISR中将标志寄存器清零 这个没错.
但我记得好像一都都是写1清0吧.
你看你的这句话:SPI2_SerFlag &= ~CHAR_IN_TX;
我觉得应该是SPI2_SerFlag |= CHAR_IN_TX;
手册里应该有写这么一句话:Write 1 to clean this bit.

使用特权

评论回复
板凳
pyh921|  楼主 | 2012-12-19 14:40 | 只看该作者
SPI2_SerFlag是我定义的一个标志寄存器,清中断应该是通过读取SPI2S的方式,但我每次都读取了SPI2S,系统还是会自动将它置位,就算没有数据发送了

使用特权

评论回复
地板
2389676302| | 2012-12-19 15:36 | 只看该作者
坐等高手前来解答

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:兼职各类电子开发 pyh921@163.com

18

主题

46

帖子

0

粉丝