当前位置:首页 > 单片机 > 单片机
[导读]UART 属于异步通信,比如电脑发送给单片机,电脑只负责把数据通过TXD 发送出来即可,接收数据是单片机自己的事情。而 I2C 属于同步通信, SCL 时钟线负责收发双方的时钟节拍, SDA 数据线负责传输数据。 I2C 的发送方和接收方都以 SCL 这个时钟节拍为基准进行数据的发送和接收。I2C总线包括SCL,SDA 两根信号线,其中SCL是时钟线,SDA是数据线。

UART 属于异步通信,比如电脑发送给单片机,电脑只负责把数据通过TXD 发送出来即可,接收数据是单片机自己的事情。而 I2C 属于同步通信, SCL 时钟线负责收发双方的时钟节拍, SDA 数据线负责传输数据。 I2C 的发送方和接收方都以 SCL 这个时钟节拍为基准进行数据的发送和接收。

I2C总线包括SCL,SDA 两根信号线,其中SCL是时钟线,SDA是数据线。

 

1、起始信号

UART 通信是从一直持续的高电平出现一个低电平标志起始位;而 I2C 通信的起始信号的定义是 SCL 为高电平期间, SDA 由高电平向低电平变化产生一个下降沿,表示起始信号。

2、数据传输

UART 是低位在前,高位在后;而 I2C 通信是高位在前,低位在后。UART 通信数据位是固定长度,波特率分之一,一位一位固定时间发送完毕就可以了。而 I2C 没有固定波特率,但是有时序的要求,要求当 SCL 在低电平的时候, SDA 允许变化。

3、停止信号

UART 通信的停止位是一位固定的高电平信号; 而 I2C 通信停止信号的定义是 SCL 为高电平期间, SDA 由低电平向高电平变化产生一个上升沿,表示结束信号。

4、写完从器件之后等待从器件的应答

在主器件完成对从器件的写操作时候(每次会有一个字节的数据),主器件会等待从器件发送指示信号,这个指示信号是说从器件已经接受到了主器件的数据,这是由从器件的硬件来完成的,不需要主器件来软件操作,只需要等待;

5、主器件读完数据后向从器件发送应答信号

这其实包括两种情况,一种是主器件读完后还要继续读就要发送一个继续读的信号(其实就是发送0),另一种就是不再继续读了,就要发送停止读信号(其实就是发送1)。

6、I2C寻址模式

I2C 通信的起始信号(Start)后,首先要发送一个从机的地址,这个地址一共有 7位,紧跟着的第 8 位是数据方向位(R/W),“ 0”表示接下来要发送数据(写),‘“ 1”表示接下来是请求数据(读)。第九位 ACK应答。

#include

#include

#define I2CDelay() {_nop_();_nop_();_nop_();_nop_();}

sbit I2C_SCL = P3 ^ 7;

sbit I2C_SDA = P3 ^ 6;

/* 产生总线起始信号 */

void I2CStart()

{

I2C_SDA = 1; //首先确保SDA、SCL都是高电平

I2C_SCL = 1;

I2CDelay();

I2C_SDA = 0; //先拉低SDA

I2CDelay();

I2C_SCL = 0; //再拉低SCL

}

/* 产生总线停止信号 */

void I2CStop()

{

I2C_SCL = 0; //首先确保SDA、SCL都是低电平

I2C_SDA = 0;

I2CDelay();

I2C_SCL = 1; //先拉高SCL

I2CDelay();

I2C_SDA = 1; //再拉高SDA

I2CDelay();

}

/* I2C总线写操作,dat-待写入字节,返回值-从机应答位的值 */

bit I2CWrite(unsigned char dat)

{

bit ack; //用于暂存应答位的值

unsigned char mask; //用于探测字节内某一位值的掩码变量

for (mask = 0x80; mask != 0; mask >>= 1) //从高位到低位依次进行

{

if ((mask & dat) == 0) //该位的值输出到SDA上

{

I2C_SDA = 0;

}

else

{

I2C_SDA = 1;

}

I2CDelay();

I2C_SCL = 1; //拉高SCL

I2CDelay();

I2C_SCL = 0; //再拉低SCL,完成一个位周期

}

I2C_SDA = 1; //8位数据发送完后,主机释放SDA,以检测从机应答

I2CDelay();

I2C_SCL = 1; //拉高SCL

ack = I2C_SDA; //读取此时的SDA值,即为从机的应答值

I2CDelay();

I2C_SCL = 0; //再拉低SCL完成应答位,并保持住总线

return (~ack); //应答值取反以符合通常的逻辑:

//0=不存在或忙或写入失败,1=存在且空闲或写入成功

}

/* I2C总线读操作,并发送非应答信号,返回值-读到的字节 */

unsigned char I2CReadNAK()

{

unsigned char mask;

unsigned char dat;

I2C_SDA = 1; //首先确保主机释放SDA

for (mask = 0x80; mask != 0; mask >>= 1) //从高位到低位依次进行

{

I2CDelay();

I2C_SCL = 1; //拉高SCL

if(I2C_SDA == 0) //读取SDA的值

{

dat &= ~mask; //为0时,dat中对应位清零

}

else

{

dat |= mask; //为1时,dat中对应位置1

}

I2CDelay();

I2C_SCL = 0; //再拉低SCL,以使从机发送出下一位

}

I2C_SDA = 1; //8位数据发送完后,拉高SDA,发送非应答信号

I2CDelay();

I2C_SCL = 1; //拉高SCL

I2CDelay();

I2C_SCL = 0; //再拉低SCL完成非应答位,并保持住总线

return dat;

}

/* I2C总线读操作,并发送应答信号,返回值-读到的字节 */

unsigned char I2CReadACK()

{

unsigned char mask;

unsigned char dat;

I2C_SDA = 1; //首先确保主机释放SDA

for (mask = 0x80; mask != 0; mask >>= 1) //从高位到低位依次进行

{

I2CDelay();

I2C_SCL = 1; //拉高SCL

if(I2C_SDA == 0) //读取SDA的值

{

dat &= ~mask; //为0时,dat中对应位清零

}

else

{

dat |= mask; //为1时,dat中对应位置1

}

I2CDelay();

I2C_SCL = 0; //再拉低SCL,以使从机发送出下一位

}

I2C_SDA = 0; //8位数据发送完后,拉低SDA,发送应答信号

I2CDelay();

I2C_SCL = 1; //拉高SCL

I2CDelay();

I2C_SCL = 0; //再拉低SCL完成应答位,并保持住总线

return dat;

}

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

采用51单片机最小开发板,由8位自制独立按键控制。单片机芯片为STC89C52RC,晶振为@12.000 mhz。8X8LED点阵屏模块由MAX7219驱动,MAX7219包含一个自动扫描电路。你只需要把要显示的数据发送...

关键字: 51单片机 MAX7219 寄存器

在嵌入式系统开发的广阔领域,51单片机和STM32无疑是两种极具代表性的微控制器。对于初学者而言,选择学习路径时往往会面临一个抉择:是直接跨越51单片机,挑战更高层次的STM32,还是从51开始,逐步进阶?本文旨在探讨直...

关键字: 51单片机 STM32

在嵌入式系统开发中,特别是在使用8051系列单片机(简称C51)进行编程时,数据类型的选择与定义对程序的性能和可读性至关重要。C51语言在标准C语言的基础上进行了扩展,以适应单片机特有的硬件结构和操作需求。本文将深入探讨...

关键字: C51数据 51单片机

在嵌入式系统领域,51单片机作为一种经典的微控制器,广泛应用于各种自动化控制系统中。其外部引脚作为单片机与外界交互的接口,承载着数据传输、控制信号输出等重要功能。本文将通过对51单片机外部引脚的案例分析,结合实际代码,深...

关键字: 51单片机 单片机

在电子技术的浩瀚星空中,LED(发光二极管)以其独特的魅力成为了一颗璀璨的明星。而结合51单片机这一经典的嵌入式开发平台,LED的应用更是被赋予了无限可能,其中,花样流水灯便是一个生动而富有创意的实例。本文将带您深入探索...

关键字: 51单片机 LED

在现代嵌入式系统设计中,51单片机作为一种经典的微控制器,凭借其丰富的功能和广泛的应用领域,仍然受到工程师们的青睐。定时器中断是51单片机中一个非常实用的功能,它可以在特定的时间间隔内自动触发中断,执行预设的操作,从而提...

关键字: 51单片机 定时器

STM32与51单片机之间有什么差异呢?两者可以说是一场科技与性能的较量了。在科技飞速发展的今天,微控制器(MCU)已广泛应用于各类电子设备和系统中,发挥着举足轻重的作用。其中,STM32和51单片机作为两种常见的微控制...

关键字: STM32 51单片机 MCU

51单片机将是下述内容的主要介绍对象,通过这篇文章,小编希望大家可以对51单片机的相关情况以及信息有所认识和了解,详细内容如下。

关键字: 单片机 51单片机

在嵌入式系统开发中,单片机是不可或缺的重要组成部分。其中,STM32单片机和51单片机是两种常见的单片机芯片。本文将对比分析这两种单片机的区别,并探讨STM32单片机的优势。

关键字: stm32单片 51单片机

51单片机是指由美国INTEL公司生产的一系列单片机的总称,这一系列单片机包括了许多品种,如8031,8051,8751,8032,8052,8752等,其中8051是最早最典型的产品,该系列其它单片机都是在8051的基...

关键字: 51单片机 串行通信
关闭