新手上路
- 积分
- 37
- 金钱
- 37
- 注册时间
- 2026-2-9
- 在线时间
- 16 小时
|
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;
}
//***********************************************************************************************************************************************************************************
现程序运行结果正常,
如果将下划线那部分的语句功能,也用中断方式来运行,
(中断程序内下划线部分)
结果却不正确。没有规律。
|
|