OpenEdv-开源电子网

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

硬件IIC测试成功!!给大家分享一下

[复制链接]

9

主题

38

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
268
金钱
268
注册时间
2013-10-19
在线时间
23 小时
发表于 2013-11-20 10:26:27 | 显示全部楼层 |阅读模式
昨天花了一天时间,寻寻觅觅找代码,测试了好多都败了,上午终于找到一个成功的!
已经在mini板上测试过了,给大家分享一下


/**********************************************************************/
/*IIC配置                                      */
/*

 */
/**********************************************************************/
void Iic_Init()
{
GPIO_InitTypeDef GPIO_InitStructure;

I2C_InitTypeDef I2C_InitStructure;
 
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
/* Configure IO connected to IIC*********************/
GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
  I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
  I2C_InitStructure.I2C_OwnAddress1 = 0xa0;  //这里是eeprom地址  
  I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
  I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
  I2C_InitStructure.I2C_ClockSpeed = 200000;
 
I2C_Cmd(I2C2, ENABLE);   

I2C_Init(I2C2, &I2C_InitStructure);
}
/**********************************************************************/
/*IIC写一个字节                                      */
/* id:eeprom地址   write_address:要写入的地址   byte:写入的数据

 */
/**********************************************************************/
void I2C_WriteByte(unsigned char id,unsigned char write_address,unsigned char byte)   
{
I2C_GenerateSTART(I2C2,ENABLE);
//产生起始条件
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
//等待ACK
I2C_Send7bitAddress(I2C2,id,I2C_Direction_Transmitter);
//向设备发送设备地址
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
//等待ACK
I2C_SendData(I2C2, write_address);
//寄存器地址
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
//等待ACK
I2C_SendData(I2C2, byte);
//发送数据
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
//发送完成
I2C_GenerateSTOP(I2C2, ENABLE);
//产生结束信号
}
/**********************************************************************/
/*IIC读数据                                        */
/*

 */
/**********************************************************************/
unsigned char I2C_ReadByte(unsigned char  id, unsigned char read_address)
{  
unsigned char temp;

while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY));
  //等待I2C
  I2C_GenerateSTART(I2C2, ENABLE);
  //产生起始信号
  while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
    //EV5
  I2C_Send7bitAddress(I2C2, id, I2C_Direction_Transmitter);
//发送地址
  while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
  //EV6
  I2C_Cmd(I2C2, ENABLE);
  //重新设置可以清楚EV6
  I2C_SendData(I2C2, read_address);  
//发送读得地址
  while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
  //EV8 
  I2C_GenerateSTART(I2C2, ENABLE);
//重新发送
  while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
  //EV5
  I2C_Send7bitAddress(I2C2, id, I2C_Direction_Receiver);
  //发送读地址
  while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
  //EV6  
    I2C_AcknowledgeConfig(I2C2, DISABLE);
    I2C_GenerateSTOP(I2C2, ENABLE);
//关闭应答和停止条件产生
    while(!(I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_RECEIVED)));
     
    temp = I2C_ReceiveData(I2C2);
   
  I2C_AcknowledgeConfig(I2C2, ENABLE);

return temp;
}




 

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-11-20 10:34:07 | 显示全部楼层
回复 支持 反对

使用道具 举报

53

主题

608

帖子

0

精华

高级会员

Rank: 4

积分
890
金钱
890
注册时间
2013-3-29
在线时间
18 小时
发表于 2013-11-20 18:53:34 | 显示全部楼层
回复【楼主位】sakura:
---------------------------------
jihao
学电子,学音乐!!
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2013-11-21 12:18:41 | 显示全部楼层
回复【楼主位】sakura:
---------------------------------
顶。。。楼主的学习精神不错

一般情况下我都是用GPIO模拟的,这样代码量少很多,看起来也爽,呵呵
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13122
金钱
13122
注册时间
2012-11-26
在线时间
3813 小时
发表于 2013-11-21 17:18:24 | 显示全部楼层
mark
回复 支持 反对

使用道具 举报

27

主题

308

帖子

1

精华

高级会员

Rank: 4

积分
774
金钱
774
注册时间
2012-6-19
在线时间
19 小时
发表于 2013-11-21 17:32:21 | 显示全部楼层
谢谢楼主! 当年搞了一下硬件IIC,觉得太恶心就没搞了。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2013-11-24
在线时间
0 小时
发表于 2013-11-24 14:16:40 | 显示全部楼层
I2C_InitStructure.I2C_OwnAddress1 = 0xa0;  //这里是eeprom地址    
这里的地址没有什么限制吧,我调IIC的时候,选用不用的器件可以使用同一个地址,貌似也没什么影响。
回复 支持 反对

使用道具 举报

5

主题

48

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2013-8-10
在线时间
0 小时
发表于 2013-11-24 16:26:31 | 显示全部楼层
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
/* Configure IO connected to IIC*********************/
GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7;


I2C_Cmd(I2C2, ENABLE);   

I2C_Init(I2C2, &I2C_InitStructure);



为什么一时是I2C1  一时是I2C2  的
谢谢分享
机会,抓住一次就够了
回复 支持 反对

使用道具 举报

9

主题

38

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
268
金钱
268
注册时间
2013-10-19
在线时间
23 小时
 楼主| 发表于 2013-11-25 10:56:03 | 显示全部楼层
回复【8楼】iDream:
---------------------------------
大意了,sorry!!!
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2013-11-8
在线时间
4 小时
发表于 2013-12-24 10:35:44 | 显示全部楼层
感谢楼主分享
回复 支持 反对

使用道具 举报

3

主题

222

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
355
金钱
355
注册时间
2012-8-13
在线时间
32 小时
发表于 2013-12-24 11:48:08 | 显示全部楼层
回复【6楼】602647310:

谢谢楼主! 当年搞了一下硬件IIC,觉得太恶心就没搞了。

---------------------------------
硬件IIC有个好处就是少占用MCU时间,如果MCU比较忙的话,应该是硬件IIC首选,否则软件实现也是很不错的.我也经常用软件实现,必要的时候也会用硬件.
个人小店,弄了些大人玩具,希望各位老小玩童们喜欢。 http://autocute.taobao.com/
回复 支持 反对

使用道具 举报

1

主题

215

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2013-9-23
在线时间
4 小时
发表于 2014-12-16 15:30:53 | 显示全部楼层
好的, 学习学习
回复 支持 反对

使用道具 举报

11

主题

94

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2015-6-7
在线时间
39 小时
发表于 2016-3-3 08:19:54 | 显示全部楼层
谢谢分享,这个有寄存器版的吗?
回复 支持 反对

使用道具 举报

10

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
301
金钱
301
注册时间
2016-1-6
在线时间
84 小时
发表于 2016-6-29 10:18:04 | 显示全部楼层
楼主,我用了你的代码,没调通,你用的是I2C1还是I2C2? 在mini板子上这俩个总线是否都连接到24C02,原子的模拟IIC代码和你的代码引脚配置都不一样。
回复 支持 反对

使用道具 举报

6

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2015-12-28
在线时间
30 小时
发表于 2016-6-29 17:17:16 | 显示全部楼层
八度空间 发表于 2013-11-21 12:18
回复【楼主位】sakura:
---------------------------------
顶。。。楼主的学习精神不错

一般情况下我都是 ...

我前段时间用软件模拟做PCF8563时钟芯片的驱动,没搞出来,后来用硬件IIC搞出来了
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-13 17:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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