OpenEdv-开源电子网

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

一个很诡异的I2C问题,求教。。

[复制链接]

2

主题

6

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2014-7-28
在线时间
1 小时
发表于 2014-7-28 12:16:15 | 显示全部楼层 |阅读模式
5金钱
我用的是stm32f103,和温度传感器TC74通过I2C通信,程序一直运行到从温度传感器读数据那点就出错了,我用keil查看I2C的DR,有两个值,一个是正确的,一个是错误的,调了两天也没弄好。。很郁闷,不知道为啥两个值会不一样。。求大神小神们帮帮忙。。


这是两个DR的地址:

这是值位FF的

这是值为1A的
每次调取读指令读取DR的话,读取的值是FF

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2014-7-28
在线时间
1 小时
 楼主| 发表于 2014-7-28 12:29:58 | 显示全部楼层
程序很简单,只是一般的I2C通信程序而已,不明白哪里出错了。。

void I2C_TC74_Init(void){
GPIO_InitTypeDef GPIO_InitStructure;
I2C_InitTypeDef I2C_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
//GPIOB periph clock enable
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOB, ENABLE);
// open I2C1 clock
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);

  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7;  //??I2C1??PB6,PB7
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;  //?????????
  GPIO_Init(GPIOB, &GPIO_InitStructure);
/*
// init for led
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 
| GPIO_Pin_12 |GPIO_Pin_13 |GPIO_Pin_14 |GPIO_Pin_15;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
*/
I2C_DeInit(I2C1);
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;   //???I2C??,???SMBus??
  I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; //??I2C????Tlow / Thigh = 2
  I2C_InitStructure.I2C_OwnAddress1 = 0x00;  //??I2C??????,????STM32?I2C????,??0
  I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;  //??ACK???
  I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;  //??7???,??????
  I2C_InitStructure.I2C_ClockSpeed = 200000;  //??I2C????
  I2C_Init(I2C1, &I2C_InitStructure);
I2C_ITConfig(I2C1, I2C_IT_EVT|I2C_IT_ERR, ENABLE);

I2C_Cmd(I2C1, ENABLE);
/*
 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

    NVIC_InitStructure.NVIC_IRQChannel = I2C1_EV_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
    NVIC_InitStructure.NVIC_IRQChannel = I2C1_ER_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
*/
}

s8 Read_Temp(u8 TC74A5_Addr){
s8 result, result2;
I2C_AcknowledgeConfig(I2C1, ENABLE);
I2C_GenerateSTART(I2C1, ENABLE);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)){  /*  wait EV5 */
  }

I2C_Send7bitAddress(I2C1, TC74A5_Addr, I2C_Direction_Transmitter);

//while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)){ /* EV6 */
//
//}

I2C_SendData(I2C1, 0x00);   // indicate which register to read
// while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)){ /* EV8 */
//
  //}
// recieve temp
I2C_GenerateSTOP(I2C1,ENABLE);
I2C_GenerateSTART(I2C1, ENABLE);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)){  /* EV5 */
  }
I2C_Send7bitAddress(I2C1, TC74A5_Addr, I2C_Direction_Receiver);

result =  I2C_ReceiveData(I2C1);
I2C_GenerateSTOP(I2C1,ENABLE);
return result;
}


回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-7-28 12:58:52 | 显示全部楼层
你用F10X系列的硬件IIC???建议你还是放弃吧,用IO模拟算了
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2014-7-28
在线时间
1 小时
 楼主| 发表于 2014-7-28 13:07:39 | 显示全部楼层
回复【3楼】Badu_Space:
---------------------------------
如果能放弃我就放弃了,这个是任务,郁闷。。。
回复

使用道具 举报

9

主题

126

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
226
金钱
226
注册时间
2014-4-3
在线时间
18 小时
发表于 2014-7-28 13:14:48 | 显示全部楼层
模拟IO口做IIC通信不行吗?非要用硬件有BUG的做?这任务是故意要做砸才算对吗?
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-7-28 13:34:53 | 显示全部楼层
回复【4楼】allpl:
---------------------------------
你老大要被坑惨才肯放弃的,那就没办法了
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2014-7-28
在线时间
1 小时
 楼主| 发表于 2014-7-28 13:43:20 | 显示全部楼层
回复【5楼】dixdsqaid:
---------------------------------
回复【6楼】Badu_Space:
---------------------------------
现在想起来,他给我的任务是只最后能显示出温度就行了,我一开始只想到了用自带的I2C。。。好吧,难道真要重新写用IO来模拟了。。。最烦这些时序什么的了。。模拟I2C,我试试吧,不知道会咋样
回复

使用道具 举报

9

主题

126

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
226
金钱
226
注册时间
2014-4-3
在线时间
18 小时
发表于 2014-7-28 15:10:20 | 显示全部楼层
很简单的,完全比它那难用的硬件IIC简单,预祝你成功
回复

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2014-7-28
在线时间
1 小时
 楼主| 发表于 2014-7-28 19:20:37 | 显示全部楼层
回复【8楼】dixdsqaid:
---------------------------------
为啥要用模拟I2C,不是说这是板子的硬件问题吗,用模拟的就好用的话,那就是软件库的问题了,这公司干嘛不写个好点的I2C库,非要大家这么麻烦?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-7-28 23:57:22 | 显示全部楼层
回复【9楼】allpl:
---------------------------------
这你得问ST了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-7-29 12:53:40 | 显示全部楼层
回复【7楼】allpl:
---------------------------------
用过模拟的IIC之后你就知道这个硬件的有多难用了,呵呵
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-4 16:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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