OpenEdv-开源电子网

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

IIC学习

[复制链接]

7

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2014-2-19
在线时间
0 小时
发表于 2014-2-28 22:01:33 | 显示全部楼层 |阅读模式
#include "iic.h"
#include "delay.h"

void IIC_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructer;

    //使能IIC端口的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);   

//初始化IO端口
GPIO_InitStructer.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11; //时钟线SCL为PB10,数据线SDA为PB11
GPIO_InitStructer.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructer.GPIO_Mode = GPIO_Mode_Out_PP;   //推挽输出
GPIO_Init(GPIOB,&GPIO_InitStructer);
GPIO_SetBits(GPIOB,GPIO_Pin_10 | GPIO_Pin_11);   //输出高电平
}

/******************************************************************
** 函数名称 : IIC_Start 
** 函数功能 : 发送启动信号
** 入口参数 : 无
** 出口参数 : 无
** 函数说明 : 首先SCL和SDA都为高电平,然后在SCL为高电平的期间拉低SDA
******************************************************************/
void IIC_Start(void)
{
SDA_OUT();
IIC_SCL = 1;
IIC_SDA = 1;
delay_us(4);
IIC_SDA = 0;
delay_us(4);
}

/*******************************************************************
** 函数名称 : IIC_Stop
** 函数功能 : 发送停止信号
** 入口参数 : None
** 出口参数 : None
** 函数说明 : 刚开始的时候SDA为低电平,然后拉高SCL,在SCL为高电平的
 情况下拉高SDA
*******************************************************************/
void IIC_Stop(void)
{
SDA_OUT();
IIC_SDA = 0;
delay_us(2);
IIC_SCL = 1;
delay_us(2);
IIC_SDA = 1;
delay_us(4);
}

/********************************************************************
** 函数名称 : IIC_Wait_Ack
** 函数功能 : 等待应答
** 入口参数 : None
** 出口参数 : 1:表示产生应答 0:表示没有产生应答
** 函数说明 : 刚开始的时候SCL和SDA都为高电平,然后判断在第九个周期的时候
 SDA线是否被拉低,如果被拉低则成功写入
********************************************************************/
u8 IIC_Wait_Ack(void)
{
u8 temp = 0;
SDA_IN();
IIC_SCL = 1;
IIC_SDA = 1;
while(READ_SDA)
{
temp++;
if(temp > 250)
{
IIC_Stop();
return 1;
}
}
IIC_SCL = 0;
return 0;
}

/***************************************************************
** 函数名称 : IIC_Response
** 函数功能 : 产生应答信号
** 入口参数 : None
** 出口参数 : None
** 函数说明 : 刚开始的时候SCL为低电平,SDA为高电平,然后拉低SDA
 然后拉高SCL,最后再拉低SCL
***************************************************************/
void IIC_Response(void)
{
SDA_OUT();
IIC_SCL = 0;
IIC_SDA = 1;
delay_us(2);
IIC_SDA = 0;
delay_us(2);
IIC_SCL = 1;
delay_us(2);
IIC_SCL = 0;
}

/***************************************************************
** 函数名称 : IIC_No_Response
** 函数功能 : 产生非应答信号
** 入口参数 : None
** 出口参数 : None
** 函数说明 : 刚开始的时候SCL为低电平,然后拉高SDA,然后再拉高SCL
 最后再拉低SCL
***************************************************************/
void IIC_No_Response(void)
{
SDA_OUT();
IIC_SCL = 0;
delay_us(2);
IIC_SDA = 1;
delay_us(2);
IIC_SCL = 1;
delay_us(2);
IIC_SCL = 0;
}

/***************************************************************
** 函数名称 : IIC_SendByte
** 函数功能 : 发送一字节的数据
** 入口参数 : None
** 出口参数 : None
** 函数说明 : 刚开始的时候SCL为低电平,然后拉高SDA最后再拉高SCL
***************************************************************/
void IIC_SendByte(u8 Dat)
{
u8 i;
SDA_OUT();
IIC_SCL = 0;   //SCL为低电平
for(i = 0;i < 8;i++)
{
if((Dat << i) & 0x80)   //如果数据左移一位然后与上0x80为真
 IIC_SDA = 1;
else IIC_SDA = 0;
IIC_SCL = 1;  
delay_us(2);
IIC_SCL = 0;
delay_us(2);
}
}

/***************************************************************
** 函数名称 : IIC_Read_Byte
** 函数功能 : 接收一字节的数据
** 入口参数 : Ack:1:发送应答
** 出口参数 : None
** 函数说明 : 读数据在数据稳定的时候读取即SCL为高电平的时候
***************************************************************/
u8 IIC_Read_Byte(unsigned char ack)
{
unsigned char i,receive=0;
SDA_IN();
for(i = 0;i < 8;i++)
{
IIC_SCL = 0;
delay_us(2);
IIC_SCL = 1;
receive <<= 1;
if(READ_SDA) receive++;
delay_us(1);
}
if (!ack)
        IIC_No_Response();//发送nACK
    else
        IIC_Response();   //发送ACK   
    return receive;
}
一步一步
学32..........

  

一代龙影-KPL
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13135
金钱
13135
注册时间
2012-11-26
在线时间
3814 小时
发表于 2014-2-28 22:07:15 | 显示全部楼层
不知道楼主要表达啥。。。
学无止境
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-2-28 22:16:41 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

7

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2014-2-19
在线时间
0 小时
 楼主| 发表于 2014-2-28 22:17:03 | 显示全部楼层
回复【2楼】jermy_z:
---------------------------------
啊啊 没啥 就是记录下自己 也希望大家觉得写的不好的地方可以指出 我好好好改正
一代龙影-KPL
回复 支持 反对

使用道具 举报

7

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2014-2-19
在线时间
0 小时
 楼主| 发表于 2014-2-28 22:17:54 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
像原子哥学习。。
一代龙影-KPL
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-3-1 08:41:03 | 显示全部楼层
回复【5楼】DDL-龙:
---------------------------------
不错
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

38

主题

2061

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
发表于 2014-3-1 09:37:46 | 显示全部楼层
帮顶下,继续努力哦
站在巨人的肩膀上不断的前进。。。
回复 支持 反对

使用道具 举报

7

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2014-2-19
在线时间
0 小时
 楼主| 发表于 2014-3-1 15:59:13 | 显示全部楼层
回复【6楼】Badu_Space:
---------------------------------
谢谢哦 继续努力
一代龙影-KPL
回复 支持 反对

使用道具 举报

7

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2014-2-19
在线时间
0 小时
 楼主| 发表于 2014-3-1 15:59:34 | 显示全部楼层
回复【7楼】xiaoyan:
---------------------------------
恩恩 得更加努力呢
一代龙影-KPL
回复 支持 反对

使用道具 举报

7

主题

170

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
230
金钱
230
注册时间
2013-8-9
在线时间
3 小时
发表于 2014-3-1 16:58:10 | 显示全部楼层
回复【5楼】DDL-龙:

回复【3楼】正点原子:
---------------------------------
像原子哥学习。。

---------------------------------
向,不是像,错别字
回复 支持 反对

使用道具 举报

7

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2014-2-19
在线时间
0 小时
 楼主| 发表于 2014-3-1 17:18:53 | 显示全部楼层
回复【10楼】mylsf:
---------------------------------
这。。。恩呢 得改
一代龙影-KPL
回复 支持 反对

使用道具 举报

11

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2013-5-4
在线时间
3 小时
发表于 2014-6-4 17:49:47 | 显示全部楼层
没事,帮顶~
回复 支持 反对

使用道具 举报

1

主题

215

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

使用道具 举报

1

主题

215

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2013-9-23
在线时间
4 小时
发表于 2014-12-16 18:00:06 | 显示全部楼层
楼主好, SDA一般不是只有在SCL位低电平的时候才能变化吗?为什么最后的读函数中是高电平读的呢?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-27 21:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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