帮我看看STM32的硬件I2C问题,一直处于busy状态,但为什么手动将SR2的bit1置0没效果?

MTSXC 2012-06-14 02:16:11
SR2一直为0x0003,即bit1一直为busy,所以我添加了I2Cx->SR2&=flag1;(flag1=0xfffd)但为什么执行了这句以后SR2的值不变化呢?还是0x0003;请帮忙看看什么问题啊??


/************************************************************************************
**函 数 名: static void I2C_AcknowledgePolling(I2C_TypeDef *I2Cx,unsigned char I2C_Addr)
**功 能: 等待获取I2C总线控制权
**入口参数: I2C_TypeDef *I2Cx,STM32 的I2C 寄存器基址,从器件地址
**
**出口参数: 无
************************************************************************************/
static void I2C_AcknowledgePolling(I2C_TypeDef *I2Cx,unsigned char I2C_Addr)
{
u16 flag1=0xfffd;
u16 flag2=0x0002;
do{
I2C_GenerateSTART(I2Cx,ENABLE);
I2C_ReadRegister(I2Cx,I2C_Register_SR1);//对于主模式SCR1的bit1为0表示没有结束地址传输,为1表示结束地址传输,读并清除ADDR位
I2C_ReadRegister(I2Cx,I2C_Register_SR2);
I2C_Send7bitAddress(I2Cx,I2C_Addr,I2C_Direction_Transmitter);
I2Cx->SR2&=flag1;
I2C_delay();//发送地址后,不能马上收到ACK,需延时等待。收到ACK后这一位置1

}while(!(I2C_ReadRegister(I2Cx,I2C_Register_SR1)&flag2));//对7位寻址这一位在地址字节的ACK 之后置1,即本语句等待收到ACK

I2C_ClearFlag(I2Cx,I2C_FLAG_AF);
}
...全文
624 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
lbing7 2012-06-14
  • 打赏
  • 举报
回复
同上,我之前用的STM32也不给力。最后还是被迫改模拟IIC了
dsoyy 2012-06-14
  • 打赏
  • 举报
回复
我记得是库函数关于I2C部分有问题,很多人都是自己模拟I2C来实现的,google 一下,代码、案例很多

27,382

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧