I2c通讯介绍及代码演示

Posted 一口Linux

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了I2c通讯介绍及代码演示相关的知识,希望对你有一定的参考价值。

I2c通讯介绍及代码演示

1.启动和停止波形图

2.程序

就SDA有区别

启动

停止

Sda=1

Sda=0

Scl=1

Scl=1

Sda=1

Sda=1

Scl=0

Scl=0

/*------------------------------------------------启动IIC总线
------------------------------------------------*/void Start(void){Sda=1;_nop_();Scl=1;_nop_();Sda=0;_nop_();Scl=0;}/*------------------------------------------------停止IIC总线
------------------------------------------------*/void Stop(void){Sda=0;_nop_();Scl=1;_nop_();Sda=1;_nop_();Scl=0;}

3.应答与非应答

应答

非应答

Sda=0

Sda=1

Scl=1

Scl=1

Scl=1

Scl=0

/*------------------------------------------------应答IIC总线
------------------------------------------------*/void Ack(void){Sda=0;_nop_();Scl=1;_nop_();Scl=0;_nop_();}/*------------------------------------------------非应答IIC总线
------------------------------------------------*/void NoAck(void){Sda=1;_nop_();Scl=1;_nop_();Scl=0;_nop_();}

4.发送与接收

发送数据

接收数据

Scl=0

Sda=1(执行1次)

数据

Scl=0

Scl=1(执行1次)

Scl=1

数据

/*------------------------------------------------发送一个字节
------------------------------------------------*/void Send(unsigned char Data){unsigned char BitCounter=8;unsigned char temp;do{temp=Data;Scl=0;_nop_();if((temp&0x80)==0x80)Sda=1;elseSda=0;Scl=1;temp=Data<<1;Data=temp;BitCounter--;}while(BitCounter);Scl=0;}/*------------------------------------------------读入一个字节并返回
------------------------------------------------*/unsigned char Read(void){unsigned char temp=0;unsigned char temp1=0;unsigned char BitCounter=8;Sda=1;do{Scl=0;_nop_();Scl=1;_nop_();if(Sda)temp=temp|0x01;elsetemp=temp&0xfe;if(BitCounter-1){temp1=temp<<1;temp=temp1;}BitCounter--;}while(BitCounter);return(temp);}

5.i2C总体程序

sbit Sda=P2^0; //定义总线连接端口sbit Scl=P2^1;/*------------------------------------------------启动IIC总线
------------------------------------------------*/void Start(void){Sda=1;_nop_();Scl=1;_nop_();Sda=0;_nop_();Scl=0;}/*------------------------------------------------停止IIC总线
------------------------------------------------*/void Stop(void){Sda=0;_nop_();Scl=1;_nop_();Sda=1;_nop_();Scl=0;}/*------------------------------------------------应答IIC总线
------------------------------------------------*/void Ack(void){Sda=0;_nop_();Scl=1;_nop_();Scl=0;_nop_();}/*------------------------------------------------非应答IIC总线
------------------------------------------------*/void NoAck(void){Sda=1;_nop_();Scl=1;_nop_();Scl=0;_nop_();}/*------------------------------------------------发送一个字节
------------------------------------------------*/void Send(unsigned char Data){unsigned char BitCounter=8;unsigned char temp;do{temp=Data;Scl=0;_nop_();if((temp&0x80)==0x80)Sda=1;elseSda=0;Scl=1;temp=Data<<1;Data=temp;BitCounter--;}while(BitCounter);Scl=0;}/*------------------------------------------------读入一个字节并返回
------------------------------------------------*/unsigned char Read(void){unsigned char temp=0;unsigned char temp1=0;unsigned char BitCounter=8;Sda=1;do{Scl=0;_nop_();Scl=1;_nop_();if(Sda)temp=temp|0x01;elsetemp=temp&0xfe;if(BitCounter-1){temp1=temp<<1;temp=temp1;}BitCounter--;}while(BitCounter);return(temp);}/*------------------------------------------------写入DA数模转换值
------------------------------------------------*/void DAC(unsigned char Data){Start();Send(AddWr); //写入芯片地址Ack();Send(0x40); //写入控制位,使能DAC输出Ack();Send(Data); //写数据Ack();Stop();}/*------------------------------------------------读取AD模数转换的值,有返回值
------------------------------------------------*/unsigned char ReadADC(unsigned char Chl){unsigned char Data;Start(); //写入芯片地址Send(AddWr);Ack();Send(0x40|Chl);//写入选择的通道,本程序只用单端输入,差分部分需要自行添加//Chl的值分别为0、1、2、3,分别代表1-4通道Ack();Start();Send(AddRd); //读入地址Ack();Data=Read(); //读数据Scl=0;NoAck();Stop();return Data; //返回值}

拿去套用就行

i2C总流程

/*------------------------------------------------写入DA数模转换值
------------------------------------------------*/void DAC(unsigned char Data){Start();Send(AddWr); //写入芯片地址Ack();Send(0x40); //写入控制位,使能DAC输出Ack();Send(Data); //写数据Ack();Stop();}/*------------------------------------------------读取AD模数转换的值,有返回值
------------------------------------------------*/unsigned char ReadADC(unsigned char Chl){unsigned char Data;Start(); //写入芯片地址Send(AddWr);Ack();Send(0x40|Chl);//写入选择的通道,本程序只用单端输入,差分部分需要自行添加//Chl的值分别为0、1、2、3,分别代表1-4通道Ack();Start();Send(AddRd); //读入地址Ack();Data=Read(); //读数据Scl=0;NoAck();Stop();return Data; //返回值}

这个是我ad四路扫描程序部分

end

以上是关于I2c通讯介绍及代码演示的主要内容,如果未能解决你的问题,请参考以下文章

详细介绍GPIOI2CSPI通讯原理以及物理层原理

详细介绍GPIOI2CSPI通讯原理以及物理层原理

一文详细介绍GPIOI2CSPI通讯原理以及物理层原理

两个51单片机如何通过i2c通讯?

Android课程---Android Studio使用小技巧:提取方法代码片段

STM32 i2c通讯失败复位方法