IIC通信基础

想掌握IIC通信,就要掌握它的特性。
首先要知道IIC协议就是是由数据线 SDA 和时钟 SCL 构成的串行总线,可发送和接收数据。在 CPU 与被控 IC 之间、IC 与 IC 之间进行双向传送,高速 IIC 总线一般可达 400kbps 以上。
I2C 总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。
开始信号:SCL 为高电平时,SDA 由高电平向低电平跳变,开始传送数据。

//产生 IIC 起始信号
void IIC_Start(void)
{
SDA_OUT(); //sda线输出
IIC_SDA=1; 
IIC_SCL=1;
delay_us(4);
IIC_SDA=0; //在SCL为高时SDA拉低
delay_us(4);
IIC_SCL=0; //SCL拉低,准备发送或接收数据
}

结束信号:SCL 为高电平时,SDA 由低电平向高电平跳变,结束传送数据。

//产生 IIC 停止信号
void IIC_Stop(void)
{
SDA_OUT(); //sda 线输出
IIC_SCL=0;
IIC_SDA=0; 
delay_us(4);
IIC_SCL=1; 
IIC_SDA=1; //发送 I2C 总线结束信号
delay_us(4); 
}

在使用过程中要特别注意其有效性,只有在SCL为高电平时,SDA上的数据必须要保持不变才算有效数据。SDA只可以在SCL为低电平时改变。
每当主机向从机发送完一个字节的数据,主机总是需要等待从机给出一个应答信号,以确认从机是否成功接收到了数据,从机应答主机所需要的时钟仍是主机提供的,应答出现在每一次主机完成8个数据位传输后紧跟着的时钟周期,低电平0表示应答,1表示非应答。

//等待应答信号到来
//返回值:1,接收应答失败
// 0,接收应答成功
u8 IIC_Wait_Ack(void)
{
	u8 time=0;
	SDA_IN(); //SDA 设置为输入 
	IIC_SDA=1;delay_us(1); 
	IIC_SCL=1;delay_us(1);
	while(READ_SDA)
	{ 
		time++;
		if(time>250)
		{ 	
			IIC_Stop();
			return 1;
		} 
	}
	IIC_SCL=0; //时钟输出 0 
	return 0; 
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值