OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 314|回复: 0

iIC+中断奇怪问……。。…。…。…。……

[复制链接]

5

主题

8

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2026-2-9
在线时间
16 小时
发表于 2026-3-1 18:47:31 | 显示全部楼层 |阅读模式
1金钱
extern const u8 TEXT_Buffer[];
u8  datatemp[16];

u8 len_iic=0;//中断读写的数量
//b7 读写标志
//b6 二次写标志
u8 g=0;
u8 iic[]={0xa0,0x00};
void I2C1_IER(u16 ReadAddr,u16 NumToRead)                //读
{        u8 temp=0;       
        len_iic=NumToRead;
        iic[0]=0xA0+(ReadAddr/256<<1);
        iic[1]=ReadAddr%256;
        MY_NVIC_Init(3,3,I2C1_EV_IRQn,2);
       
        len_iic|=0x80;                                                                                                                                                              
        I2C1->CR1|=0X0100;                 g=0;                                //起始信号       
        while(!(I2C1->SR1&(1<<0)));                        //等待起始信号发送完成
        I2C1->DR=0XA0+(ReadAddr/256<<1);
        g=1;
        I2C1->CR2|=1<<10;                        //缓冲器中断使能
        I2C1->CR2|=1<<9;                        //事件中断使能

}

//***********************************************************************************************************************************************************************************
void I2C1_EV_IRQHandler(void)
{        u8 temp=0;                  
        if(I2C1->SR1&(1<<0))
        {        if (len_iic&(1<<0))
                {        I2C1->DR=0XA1;
                }else
                {        //I2C1->DR=iic[0];
                }       
        }
        if(I2C1->SR1&(1<<1))
        {        temp=I2C1->SR2;
                I2C1->DR=iic[g++];
                g=0;
        }
        if(I2C1->SR1&(1<<6))                                  //检测接收数据
        {        datatemp[g++]=I2C1->DR;               
        }
        if(I2C1->SR1&(1<<7))
        {        I2C1->CR1|=0X0100;                        //起始信号
                len_iic|=0x40;               
        }
        temp=len_iic&0x3f;
        if (g==temp-1)               
        {        I2C1->CR1&=~0X0400;                                                 //关闭应答
                I2C1->CR1|=0X0200;                                                 //产生停止信号
        }
        temp++;
        temp=I2C1->SR1;
        temp=I2C1->SR2;
}
//***********************************************************************************************************************************************************************************
现程序运行结果正常,
如果将下划线那部分的语句功能,也用中断方式来运行,
(中断程序内下划线部分)
结果却不正确。没有规律。



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


关闭

原子哥极力推荐上一条 /1 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2026-3-10 20:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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