51单片机模拟I2C协议

什么是I2C

首先需要知道什么是I2C协议。I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息(摘自百度百科)。I2C主要有两条线,一条SDA数据线,一条SCL时钟线。由于I2C支持主机与多从机之间的通信,所以在传输数据之前先进行寻址操作,才能与对应的从机建立通信。多从机的存在可能出现多个从机同时需要占用总线的情况,这时候就要通过总线仲裁来选择与某个从机进行通信了。每次通信发送或接收的数据为8位一个字节。

I2C时序图详解及通信协议程序

空闲时的SCL和SDA两条线都为高电平,每次通信结束后都需要释放总线,将SCL和SDA拉高。

起始信号和结束信号

起始信号和结束信号时序图如下:
在这里插入图片描述可以看到起始信号是这样产生的:先将SDA数据总线拉低,再将SCL时钟线拉低;而结束信号与其实信号相反,先把SCL时钟线拉高后再将SDA数据总线拉高。
程序代码如下:

//起始信号
void I2C_start()
{
   
    I2C_SCL_1;
    I2C_SDA_1;
    I2C_Delay();
    I2C_SDA_0;
    I2C_Delay();
    I2C_SCL_0;
}
//结束信号
void I2C_stop()
{
   
    I2C_SDA_0;
	I2C_SCL_1;
	I2C_Delay();
	I2C_SDA_1;
}

数据传输

在这里插入图片描述I2C要求在SCL高电平期间数据线保持稳定,在低电平期间SDA可以产生电平跳变和数据变化。
发送数据代码如下:

void I2C_sendbyte(uint8_t send_data)
{
   
    uint8_t i;
    for(i=0;i<8;i++)
    {
   
        if(send_data&(0X80>>i)) 
            I2C_SDA_1; 
        else 
            
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值