教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 法律文档 >

IO口中断模拟I2C通信方式

来源:网络收集 时间:2026-05-20
导读: 一种IO口中断模拟I2C 通信的方法 单片机与单片机之间的通信方式 Jonney.Peng 2016/8/17 更可靠,效率更高的模拟I2C通信方式,主从机都可模拟 目录 一、 I2C通信原理 ........................................................................ 3 二、 利用I

一种IO口中断模拟I2C

通信的方法

单片机与单片机之间的通信方式

Jonney.Peng 2016/8/17

更可靠,效率更高的模拟I2C通信方式,主从机都可模拟

目录

一、 I2C通信原理 ........................................................................ 3 二、 利用IO口模拟I2C的优势 .................................................. 3 三、 利用IO口模拟I2C的原理 .................................................. 3 2、 中断接收数据函数 ............................................................ 4 3、 读指令函数 ........................................................................ 5 4、 发送一个字节函数 .................................................................. 6 5、 发送指令函数 .................................................................... 7 五、 源代码共享地址 ................................................................... 7

一、 I2C通信原理

I2C

总线系统是由SCL(串行时钟)和SDA(串行数据)两

根总线构成的。该总线有严格的时序要求,总线工作时,由串行时钟线SCL传送时钟脉冲,由串行数据线SDA传送数据。

二、 利用IO口模拟I2C的优势

简单的通过单片机IO模拟I2C通信,我们会发现数据接收不正常或者接收错误的情况,同时接收速率比较低,实时性比较差。最重要的是只能模拟主机通信,今天我所介绍的适用于所有单片机与单片机的通信,既可以接收数据也可以发送数据。只需要两个IO口,其中包含一个IO口中断,可以解决串口,I2C和SPI都不够用的问题。

三、 利用IO口模拟I2C的原理

传统的I2C通信方式,SCL负责传送信号脉冲,SDA负责传

送数据,SCL为低时,允许传送数据。通过中断方式实现I2C也是遵循了这个原理。与传统I2C的区别在于,当SCL电平变化时,只传送一位数据,所以接收完一个字节数据时,SCL需由高到低

变化八次。 四、 源代码分析

1、 初始化I2C函数

功能:将SDA与SCL电平置高,SDA可以为任何IO口,

SCL必须为带有中断的IO口。

void I2C_INIT() {

SDA=1; delays(2); SCL=1; delays(2); }

2、 中断接收数据函数

功能:实现数据的接收 变量名含义:

注:此接收函数根据通信协议可以适当调整,我的通信 协议格式是: 包头:00 地址:00-0XFF 包长度:命令+参数+结束位 命令:0X00-0XFF 参数:0X00-0XFF 结束位:0xFF INTTemp:接收数据变量,每一位都存入INTTemp

clk_over_timer:接收超时时基,用于复位相应标志位,后面会介

绍。

INT_i2c:中断标志位

F_INT_read:读数据标志位 F_read_ok:接收完数据标志位 INTnum:中断次数标志位 INTre[]:接收数据缓存区

INTbyteflag:接收字节个数标志位 F_long:接收的指令长度

void I2cRead() interrupt 0

{

INTTemp=INTTemp<<1; INTTemp=INTTemp|SDA; clk_over_timer=0; INT_i2c=1; F_INT_read=0; F_read_ok=0; INTnum++;

if(INTnum==8) //若INTnum为8,说明接收完一个字节的数据,

将数据存入INTre[]

{

INTnum=0;

INTre[INTbyteflag]=INTTemp;

减1,直到F_long=0,说明一条指令接收完毕

}

if(INTbyteflag==3) // INTbyteflag为3时说明长度位已接收完毕 {

值给F_long

}

}

F_long=INTre[2];

if(INTre[0]!=0x00) //包头不对,标志位复位,重新接收

INTbyteflag=0; F_long=32;

{ }

F_long--;

if(INTbyteflag>=3) //当接收数据位后面的数据时,长度标志位相应

INTbyteflag++;

If(INTre[0]==0x00&&INTre[1]==0x01) //包头和地址位接收正确,将长度为赋

{

}

if(INTre[1]!=0x01) //地址位不对,标志位复位,重新接收 INTbyteflag=0; F_long=32; {

}

3、 读指令函数

功能:判断指令接收完毕,当F_long=0说明指令已接收完毕,可以

根据指令处理相应事件。若20ms内没接收完数据,说明数据接收不正常,复位相应标志位。

void Read_ok()

…… 此处隐藏:355字,全部文档内容请下载后查看。喜欢就下载吧 ……
IO口中断模拟I2C通信方式.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/435229.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)