OpenEdv-开源电子网

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

还是坑爹的I2C问题

[复制链接]

3

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2015-8-14
在线时间
7 小时
发表于 2015-8-14 16:00:13 | 显示全部楼层 |阅读模式
5金钱
STM8S003F3P6芯片
使用了硬件I2C,程序经常死机,偶尔才正常,一直死在I2C_CheckEvent函数里面,或者在死循环
求大神解救,程序如下:
#define I2C_Speed              100000
#define I2C1_SLAVE_ADDRESS7    0xA0
GPIO_Init(GPIOB, GPIO_PIN_4, GPIO_MODE_OUT_OD_HIZ_FAST);//PB4 I2C_SCL 功能引脚,总线的时钟脚,设为高速开漏高阻输出。
GPIO_Init(GPIOB, GPIO_PIN_5, GPIO_MODE_OUT_OD_HIZ_FAST);//PB5 I2C_SDA 功能引脚,总线的数据脚,设为高速开漏高阻输出

/*********************************************
I2C总线写一个字节
**********************************************/
void I2C_Write(unsigned char ADDR,unsigned char Wdata)
{
 ITStatus it_status;
FlagStatus flag_status;

I2C_GenerateSTART(ENABLE);

//I2C启动  /* Send STRAT condition */
/* Test on EV5 and clear it */
//while(!I2C_CheckEvent(I2C_EVENT_MASTER_START_SENT));
    while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT ));
 
 I2C_Send7bitAddress(ADDR, I2C_DIRECTION_TX);   //写I2C从器件地址和写方式
/* Test on EV6 and clear it */
    //while(!I2C_CheckEvent(I2C_EVENT_MASTER_ADDRESS_ACKED)); 
while(!I2C_CheckEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
 
 I2C_SendData(Wdata); //写数据到器件相应寄存器
/* Test on EV8 and clear it */
    while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTING));

 /* Send STOP condition */
    I2C_GenerateSTOP(ENABLE);
}

/*********************************************
I2C总线读一个字节
返回:16位数值
**********************************************/
unsigned int I2C_Read(unsigned char ADDR)
{
   unsigned int temp;
unsigned char tmp1,tmp2;
 /* While the bus is busy */
while(I2C_GetFlagStatus(I2C_FLAG_BUSBUSY));

I2C_GenerateSTART(ENABLE);

//I2C启动 /* Generate start & wait event detection */
 /* Test on EV5 and clear it */
//while (!I2C_CheckEvent(I2C_EVENT_MASTER_START_SENT));
    while (!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));
   
I2C_Send7bitAddress(ADDR, I2C_DIRECTION_RX);   //写I2C从器件地址和写方式
/* Test on EV6 and clear it */
    //while (!I2C_CheckEvent(I2C_EVENT_MASTER_ADDRESS_ACKED));
while (!I2C_CheckEvent(I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
//I2C_ClearFlag(I2C_FLAG_ADDRESSSENTMATCHED);
/* 2 variables are used to avoid any compiler optimization */
      /* Read the SR1 register */
      tmp1 = I2C->SR1;
      /* Read the SR3 register */
      tmp2 = I2C->SR3;

while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_RECEIVED));
 temp = I2C_ReceiveData();//启动主I2C读方式
                    //读取I2C接收数据 第一字节 
/* Disable Acknowledgement */
I2C_AcknowledgeConfig(I2C_ACK_NONE);

  
while (!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_RECEIVED));
 temp = (temp<<8)+I2C_ReceiveData();        //读第二字节 合成16位数值
I2C_GenerateSTOP(ENABLE);                      //I2C停止
I2C_AcknowledgeConfig(I2C_ACK_CURR);   //启动主

I2C读方式,结果应答NO_ACK

 return temp;
}

最佳答案

查看完整内容[请看2#楼]

解决了,及时清除标志位,然后加入超时保护之后就可以很稳定了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2015-8-14
在线时间
7 小时
 楼主| 发表于 2015-8-14 16:00:14 | 显示全部楼层
解决了,及时清除标志位,然后加入超时保护之后就可以很稳定了。
回复

使用道具 举报

81

主题

1004

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2015-8-14 17:32:39 | 显示全部楼层
调用函数的地方判断返回值,一旦陷入死循环超过n次,你就返回一个固定值a。
调用处判断返回值是a时,就执行iic初始化。直到返回值不是a。
小小蜗牛
回复

使用道具 举报

39

主题

598

帖子

0

精华

高级会员

Rank: 4

积分
875
金钱
875
注册时间
2013-12-18
在线时间
41 小时
发表于 2015-8-14 20:56:56 | 显示全部楼层
帮顶,没用过硬件的IIC的小白路过
回复

使用道具 举报

2

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2014-4-28
在线时间
5 小时
发表于 2015-8-14 22:43:53 | 显示全部楼层
刚好才用103RC调了24C256,不过我是模拟的,没有用硬件IIC
回复

使用道具 举报

22

主题

180

帖子

1

精华

高级会员

Rank: 4

积分
616
金钱
616
注册时间
2015-6-29
在线时间
101 小时
发表于 2015-8-15 09:57:24 | 显示全部楼层
当初学STM32的时候用硬件I2C调通了AT24C02后,再也没用过硬件I2C了,不怎么会用
我是菜鸟
回复

使用道具 举报

15

主题

406

帖子

0

精华

高级会员

Rank: 4

积分
795
金钱
795
注册时间
2015-3-26
在线时间
151 小时
发表于 2015-9-2 20:52:31 | 显示全部楼层
stm32f1硬件i2c有bug
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2019-3-11
在线时间
2 小时
发表于 2019-3-12 09:31:02 | 显示全部楼层
及时清除标志位,然后加入超时保护加在那个地址啊》?
回复

使用道具 举报

3

主题

1906

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4095
金钱
4095
注册时间
2018-8-14
在线时间
694 小时
发表于 2019-3-12 11:26:14 | 显示全部楼层
这算是给说st的II2硬件不稳定的谣言最好的回应了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-5-29 04:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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