打印
[应用相关]

如何跳出USI中断问题

[复制链接]
610|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
androidbus|  楼主 | 2016-12-5 19:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ic, sic, ST, TI, SIP
int main(void)
{
  volatile unsigned int i;

  WDTCTL = WDTPW + WDTHOLD;             // 关闭看门狗
  P1OUT =  BIT4;
  P1REN |= BIT4;                        // P1.4 上拉电阻(P1OUT决定)
  P1DIR = BIT0;                         // P1.0 输出
  P1OUT |= BIT0;
  USICTL0 |= USIPE7 + USIPE6 + USIPE5 + USIMST + USIOE;
  /*
   *        USIPE7 SPI输入模式,I2C开漏输出
   *        USIPE7 SPI输出模式,I2C开漏输出
   *        USIPE5 SPI从机输入,I2C,SPI主机输出
   *        USILSB LSB优先
   *        USIMST 主机模式
   *        USIGE 输出锁存
   *        USIOE 数据输出使能
   *        USISWRST 软复位
   */
  USICTL1 |= USIIE;
  /*
   * USICKPH SCLK的上升沿捕捉,下降沿发送.
   * USII2C I2C使能
   * USISTTIE 传输开始时中断
   * USIIE 中断开启
   * USIAL 关闭仲裁
   * USISTP 启用停止标记
   * USISTTIFG 收到开始信号时候的请求中断标记.
   * USIIFG USI计数器中断标记
   */
  USICKCTL = USIDIV_4 + USISSEL_2;
  /*
   * USIDIV 分频器1,2,4,8,16,32,64,128
   * USISSEL 时钟源SCLK(SPI无效),ACLK,SMCLK,[NULL],USISWCLK,TACCR0,TACCR1,[NULL]
   * USICKPL 空闲时时钟信号为高电平
   * USISWCLK 输入时时钟信号为高电平
   */
  USICTL0 &= ~USISWRST;                //USI操作软复位,数据立即需要准备.

  P1OUT &= ~BIT0;
  USISRL = char_ch++;                        //低8位数据,其实可以存16位,包含USISRH + USISRL (USI16B = 1)
  USICNT = 0x08;
  /*
   * USISCLREL SCL保持低电平,即使USIIFG置位
   * USI16B 16位模式
   * USIIFGCC USIIFG不自动清零
   * USICNT 设置发送位数0-F(1-16位)
   */
  _BIS_SR(LPM0_bits + GIE);             // LPM0模式,总中断开启
  while(1){
                //立即发送下一次数据
                P1OUT &= ~BIT0;
                USISRL = char_ch++;
                USICNT = 0x08;
  }
}

// USI 中断服务路由
#pragma vector=USI_VECTOR
__interrupt void universal_serial_interface(void)
{
        /*
         * 两个不同的中断服务,需要分开判断.
         * USIIFG 数据收发完成
         * USISTTIFG 请求接收
         */
        if(USICTL1 & USIIFG){
                //这是USIIFG中断服务
                P1OUT |= BIT0;
                USICNT = 0x08; //这里打断点,发现单步后USICNT没有改变
                USICTL1 &= ~USIIFG;        //永远循环在这里
        }else{
                //这是USISTTIFG中断服务
                char_ch = USISRL;
                USICTL1 &= ~USISTTIFG ;
        }

}
沙发
litengg| | 2016-12-5 19:44 | 只看该作者
我想问下,USICTL1 &= ~USIIFG;      这句单步下去能走不?

使用特权

评论回复
板凳
qiangweii| | 2016-12-5 19:46 | 只看该作者

我好像也遇上这个问题了 JTAG调试的时候会发现USICNT = 0x08;

使用特权

评论回复
地板
shashaa| | 2016-12-5 19:52 | 只看该作者
USICNT根本就没有写进去,一直都是0.所以中断标志位会一直是1,也就是死在中断里面了。

使用特权

评论回复
5
xia00| | 2016-12-5 19:54 | 只看该作者
清除中断了吗?有可能是中断的问题。

使用特权

评论回复
6
hfdy01| | 2016-12-5 19:59 | 只看该作者
可能USI单步调试到哪里有问题?

使用特权

评论回复
7
CallReceiver| | 2016-12-5 20:02 | 只看该作者
不能跳出中断,是中断一直执行吗?

使用特权

评论回复
8
boy1990| | 2016-12-5 20:11 | 只看该作者
不妨清除一下中断标志位试试。

使用特权

评论回复
9
sourceInsight| | 2016-12-5 20:13 | 只看该作者
楼主,你的USI 中断服务配置进入了吗?

使用特权

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

本版积分规则

181

主题

1597

帖子

3

粉丝