IO口中断模拟I2C通信方式_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
IO口中断模拟I2C通信方式
上传于||文档简介
&&适用于多个单片机之间的通信,节省串口。
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩4页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢MCU 51(42)
下面给出了模拟I2C总线进行读写的伪代码,用以说明如何使用GPIO实现I2C通信:
#define SDA 254&&&&&&&&&&&&&&&&&&&&&&&& //定义SDA所对应的GPIO接口编号&
#define SCL 255&&&&&&&&&&&&&&&&&&&&&&&& //定义SCL所对应的GPIO接口编号&
#define OUTP 1&&&&&&&&&&&&&&&&&&&&&&&&& //表示GPIO接口方向为输出&
#define INP 0&&&&&&&&&&&&&&&&&&&&&&&&&& //表示GPIO接口方向为输入&
/* I2C起始条件 */&
int i2c_start()&
//初始化GPIO口&
set_gpio_direction(SDA, OUTP);&&&&&&&&& //设置SDA方向为输出&
set_gpio_direction (SCL, OUTP);&&&&&&&& //设置SCL方向为输出&
&&&&&&&& set_gpio_value(SDA, 1);&&&&&&&&&&&&&&& //设置SDA为高电平&
set_gpio_value(SCL, 1);&&&&&&&&&&&&&&&& //设置SCL为高电平&
delay();&&&&&&&&&&&&&&&&&&&&&&&&&&& //延时&
//起始条件&
set_gpio_value(SDA, 0);&&&&&&&&&&&&&&&& //SCL为高电平时,SDA由高变低&
/* I2C终止条件 */&
void i2c_stop()&
set_gpio_value(SCL, 1);&
set_gpio_direction(SDA, OUTP);&
set_gpio_value(SDA, 0);&
set_gpio_value(SDA, 1);&&&&&&&&&&&& //SCL高电平时,SDA由低变高&
I2C读取ACK信号(写数据时使用)&
返回值 :0表示ACK信号有效;非0表示ACK信号无效&
unsigned char i2c_read_ack()&
set_gpio_direction(SDA, INP);&&&&&&&&&& //设置SDA方向为输入&
set_gpio_value(SCL,0);&&&&&&&&&&&&& // SCL变低&
r = get_gpio_value(SDA);&&&&&&&&&&&&&&& //读取ACK信号&
set_gpio_value(SCL,1);&&&&&&&&&&&&& // SCL变高&
/* I2C发出ACK信号(读数据时使用) */&
int i2c_send_ack()&
set_gpio_direction(SDA, OUTP);&&&&&&&&& //设置SDA方向为输出&
set_gpio_value(SCL,0);&&&&&&&&&&&&& // SCL变低&
set_gpio_value(SDA, 0);&&&&&&&&&&&& //发出ACK信号&
set_gpio_value(SCL,1);&&&&&&&&&&&&& // SCL变高&
/* I2C字节写 */&
void i2c_write_byte(unsigned char b)&
set_gpio_direction(SDA, OUTP);&&&&&&&&& //设置SDA方向为输出&
for (i=7; i&=0; i--) {&
set_gpio_value(SCL, 0);&&&&&&&&&&&& // SCL变低&
set_gpio_value(SDA, b & (1&&i));&&&&&&& //从高位到低位依次准备数据进行发送&
set_gpio_value(SCL, 1);&&&&&&&&&&&& // SCL变高&
i2c_read_ack();&&&&&&&&&&&&&&&& //检查目标设备的ACK信号&
/* I2C字节读 */&
unsigned char i2c_read_byte()&
unsigned char r = 0;&
set_gpio_direction(SDA, INP);&&&&&&&&&& //设置SDA方向为输入&
for (i=7; i&=0; i--) {&
set_gpio_value(SCL, 0);&&&&&&&& // SCL变低&
r = (r &&1) | get_gpio_value(SDA);&&&&& //从高位到低位依次准备数据进行读取&
set_gpio_value(SCL, 1);&&&&&&&& // SCL变高&
i2c_send_ack();&&&&&&&&&&&&&&&& //向目标设备发送ACK信号&
I2C读操作&
addr:目标设备地址&
buf:读缓冲区&
len:读入字节的长度&
void i2c_read(unsigned char addr, unsigned char* buf, int len)&
i2c_start();&&&&&&&&&&&&&&&&&&&&&&& //起始条件,开始数据通信&
//发送地址和数据读写方向&
t = (addr && 1) | 1;&&&&&&&&&&&&&&&&&&& //低位为1,表示读数据&
i2c_write_byte(t);&
//读入数据&
for (i=0; i& i++)&
buf[i] = i2c_read_byte();&
i2c_stop();&&&&&&&&&&&&&&&&&&&& //终止条件,结束数据通信&
I2C写操作&
addr:目标设备地址&
buf:写缓冲区&
len:写入字节的长度&
void i2c_write (unsigned char addr, unsigned char* buf, int len)&
i2c_start();&&&&&&&&&&&&&&&&&&&&&&& //起始条件,开始数据通信&
//发送地址和数据读写方向&
t = (addr && 1) | 0;&&&&&&&&&&&&&&&&&&& //低位为0,表示写数据&
i2c_write_byte(t);&
//写入数据&
for (i=0; i& i++)&
i2c_write_byte(buf[i]);&
i2c_stop();&&&&&&&&&&&&&&&&&&&& //终止条件,结束数据通信&
在上面的代码中,i2c_read和i2c_write这两个函数可以实现GPIO接口对I2C总线的模拟读写。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:656942次
积分:9418
积分:9418
排名:第1515名
原创:208篇
转载:587篇
评论:59条