单片机通信-IIC

IIC 基本工作原理

在这里插入图片描述

在这里插入图片描述

依次从高位 7 到低位0 开始发送数据进行通讯
随后从机立即发送一个应答信号

IIC 软件模拟函数

  • 启动部分函数
    在这里插入图片描述
  • 启动部分时序图
    1.tCHDX 最小值为4.7微秒
    2.tDLCL 最小值为4 微秒
void start()
{
SCL = 1;
SDA = 1;
Delay5us();
SDA = 0;
Delay5us();
}

在SCL高电平期间 SDA高低电平应该保持不变 。

  • 接受数据部分函数

在这里插入图片描述

数据部分时序图

  • 1.tCHCL 最小值为4微秒 :
    让SCL为高电平时间比4微妙大即可 。
  • 2.tCLCH 最小值为4.7 微秒:
    让SCL为低电平时间比4.7微妙大即可。
  • 3.tCLDX 最小值为0 微妙:
    表示在SCL改变后 SDA电平可立即改变。
  • 4.tDXCX 最小值为250 微妙 :
    表示在SDA改变后250微妙 SCL电平才可改变。
void send_data(char temp)
{
uint8 i;
SCL = 0;
for(i=0;i<8;i++)
{
	if(temp & 0x80)
	SDA = 1;
	else
	SDA = 0;
	temp = temp<<1;
	Delay5us():
	SCL=1;
	Delay5us();
	SCL=0;
}

}
  • 应答信号的函数

在第九个时钟周期时 应将SDA信号拉到高电平,来接受应答位
当器件收到应答信号后就会将SDA信号拉为低电平,此时用单片机信号判断SDA的电平即可。

先把SCL拉低,然后将SDA拉高,之后将tCLCH时间(也就是5微秒),然后再拉高SCL延时tCHCL(5微秒),while循环读取SDA电平是否被拉低。

void rec_data()
{
SCL = 0;
SDA = 1;  //即为释放总线
Delay5us(); //此时从机将会主动拉低 SDA 电平
SCL = 1Delay5us();
while(SDA == 1)
{
;;
}
SCL=0; //为以一个发送数据周期做准备

led=0;

}
  • 停止函数
    在这里插入图片描述

即为,在SCL高电平时间,SDA出现上升沿

void stop()
{
SCL = 1;
SDA = 0;
Delay5us();
SDA = 1;
Delay5us();
}

封装

void IIC_write(unsigned char dev_addr, unsigned char addr, unsigned chari) 
 start();
 send data (dev_addr);//寻址字节
 rec_data ();
 send data ( addr);//储存单元地址
 rec_data ();
 send data(i);//发送的数据
 rec_data ();
 stop();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值