查看: 2573|回复: 3

MC9S08QE128的SPI中断问题

[复制链接]

该用户从未签到

9

主题

23

帖子

0

注册会员

Rank: 2

积分
59
最后登录
1970-1-1
发表于 2012-12-18 21:06:28 | 显示全部楼层 |阅读模式
我在使用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;
    }
 } 
}

 
回复

使用道具 举报

该用户从未签到

11

主题

288

帖子

0

版主

Rank: 7Rank: 7Rank: 7

积分
610
最后登录
1970-1-1
发表于 2012-12-19 10:42:48 | 显示全部楼层

RE:MC9S08QE128的SPI中断问题

SPRF is cleared by reading SPRF while it is set, then reading the SPI data register.
从手册上面看,当读取走数据以后会自动清除。写中断的时候,不管当前数据是否需要采集,都要把数据读取走。这样才能清除中断标志。在读取数据以后,不应该对数据SPI2D进行写操作。
回复 支持 反对

使用道具 举报

该用户从未签到

9

主题

23

帖子

0

注册会员

Rank: 2

积分
59
最后登录
1970-1-1
 楼主| 发表于 2012-12-19 14:43:33 | 显示全部楼层

回复:MC9S08QE128的SPI中断问题

我在中断开始时就读取数据了,而且没有再发送任何数据,但程序始终跳到中断里……
回复 支持 反对

使用道具 举报

该用户从未签到

11

主题

288

帖子

0

版主

Rank: 7Rank: 7Rank: 7

积分
610
最后登录
1970-1-1
发表于 2012-12-19 16:28:08 | 显示全部楼层

RE:MC9S08QE128的SPI中断问题

你把
tmp=SPI2S;
tda=SPI2D;
下面的程序屏蔽掉。然后看看中断是否还一直在产生。如果还在产生,就请连接示波器,看一下SPI线上的时序。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-9-21 07:30 , Processed in 0.091282 second(s), 22 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表