【奔跑的FPGA】part nine IIC协议代码解析
来源:互联网 发布:c语言竖线是什么符号 编辑:程序博客网 时间:2024/04/30 15:46
在MCU与外设通信过程中,iic协议是最经常用到的数据传输方法,数据传输速度快,出错概率低,操作简便,即使没有iic模块的mcu,用普通的io口模拟iic协议也是很简便的一件事。接下来结合代码简答 解析一下iic协议的常用用法。
一、iic_start开始信号的产生
void IIC_start(void){//IIC总线产生起始信号函数 IIC_SDA=1;//拉高数据线 IIC_SCL=1;//拉高时钟线 delay_IIC(); IIC_SDA=0;//在时钟线为高电平时,拉低数据线,产生起始信号。 delay_IIC(); IIC_SCL=0;//拉低时钟线}
起始信号的产生条件:时钟线为高电平的时候拉低数据线。
二、IIC_stop结束信号的产生
void IIC_stop(void) {//IIC总线产生停止信号函数 IIC_SDA=0;//拉低数据线 delay_IIC(); IIC_SCL=1;//拉高时钟线。 delay_IIC(); IIC_SDA=1;//时钟时线为高电平时,拉高数据线,产生停止信号。 delay_IIC();}
结束信号的产生条件:时钟线为高电平时拉高数据线。
三、i2c_write写数据的时序
void IIC_write_byte(unsigned char Data){//向IIC总线写入一个字节的数据函数 unsigned char i; for(i=0;i<8;i++)//有8位数据 { IIC_SDA=Data&0x80;//写最高位的数据 delay_IIC(); IIC_SCL=1; //拉高时钟线,将数写入到设备中。 delay_IIC(); IIC_SCL=0;//拉低时钟线,允许改变数据线的状态 delay_IIC(); Data=Data<<1;//数据左移一位,把次高位放在最高位,为写入次高位做准备 }}向iic设备写入一个byte数据的时序信号为拉高数据线将一个bit数据写入,拉低时序信号时准备下一个将要发送的bit
四、IIC_read_byte读取数据的时序
unsigned char IIC_read_byte(){//从IIC总线读取一个字节的数据函数 unsigned char i; unsigned char Data; //定义一个缓冲寄存器。 for(i=0;i<8;i++)//有8位数据 { IIC_SCL=1;//拉高时钟线,为读取下一位数据做准备。 delay_IIC(); Data=Data<<1;//将缓冲字节的数据左移一位,准备读取数据。 delay_IIC(); if(IIC_SDA)//如果数据线为高平电平。 Data=Data|0x1;//则给缓冲字节的最低位写1。 IIC_SCL=0;//拉低时钟线,为读取下一位数据做准备。 delay_IIC(); } return Data;//返回读取的一个字节数据。}从一个iic设备读入数据的时序为:时钟线拉高时读取新的bit到缓冲区,时钟线拉低时准备接受下一个bit数据。
五、IIC读取一个Byte的逻辑顺序
unsigned char IIC_single_byte_read(unsigned char Daddr,unsigned char Waddr){//从任意地址读取一个字节数据函数 unsigned char Data;//定义一个缓冲寄存器。 IIC_start();//产生起始信号 IIC_write_byte(Daddr);//写入设备地址(写) IIC_Tack();//等待设备的应答 IIC_write_byte(Waddr);//写入要操作的单元地址。 IIC_Tack();//等待设备的应答。 IIC_start();//产生起始信号 IIC_write_byte(Daddr+1);//写入设备地址(读)。 IIC_Tack();//等待设备的应答。 Data=IIC_read_byte();//写入数据。 IIC_stop();//产生停止符号。 //-------------------返回读取的数据-------------------- return Data;//返回读取的一个字节数据。}
注意两次写入的设备地址不一样,前一个是写数据的设备地址,后一个是读取数据的设备地址。
六、IIC写入一个字节数据逻辑顺序
void IIC_single_byte_write(unsigned char Daddr,unsigned char Waddr,unsigned char Data){//向任意地址写入一个字节数据函数 IIC_start();//产生起始信号 IIC_write_byte(Daddr);//写入设备地址(写) IIC_Tack();//等待设备的应答 IIC_write_byte(Waddr);//写入要操作的单元地址。 IIC_Tack();//等待设备的应答。 IIC_write_byte(Data);//写入数据。 IIC_Tack();//等待设备的应答。 IIC_stop();//产生停止符号。}七、设备应答信号ACK
bit IIC_Tack(void){//接收应答信号函数 bit ack;//定义一个位变量,来暂存应答状态。 IIC_SDA=1;//释放数据总线,准备接收应答信号。 delay_IIC(); IIC_SCL=1;//拉高时钟线。 delay_IIC(); ack=IIC_SDA;//读取应答信号的状态。 delay_IIC(); IIC_SCL=0;//拉低时钟线。 delay_IIC(); return ack;//返回应答信号的状态,0表示应答,1表示非应答。}
实际应用中总是要做一些判断时代码更加完善健壮,比如(六)中等待设备应答是需要通过返回值判断是否有应答的。
1 0
- 【奔跑的FPGA】part nine IIC协议代码解析
- 【奔跑的FPGA】part five TestBench的编写规范
- 【奔跑的FPGA】part one--ip核仿真流程
- 【奔跑的FPGA】part three DE1开发板初探
- 【奔跑的FPGA】part six VerilogHDL语言规范
- 【奔跑的FPGA】part four 我的第一个FPGA工程
- 【奔跑的FPGA】part two ip核仿真遇到的问题以及解决办法
- 【奔跑的FPGA】part eight Qsys工具的使用方法简明手册
- 【奔跑的FPGA】part seven DE1-SOC引脚分配与导入方法
- FPGA基础设计(四):IIC协议
- c8051单片机和AT24c1024B的通信(IIC协议)代码
- FPGA做过IIC的请进
- IIC协议的那些事儿
- FPGA协议的写法
- IIC协议
- IIC协议
- IIC协议
- IIC协议
- JavaWeb工作原理
- React教程
- 理解PHP依赖注入容器(dependency injection container)系列(三) Symfony服务容器介绍
- Led灯
- HDU 2824 The Euler function【欧拉函数入门题】
- 【奔跑的FPGA】part nine IIC协议代码解析
- Caused by: Parent package is not defined: json-default - [unknown location]
- 关于page,request,session,application在jsp页面中的作用域
- poj--1330 Nearest Common Ancestors(LCA/Tarjan)
- 正则表达式在OC编程中的运用
- 仿购物车CheckBox的全选反选ListView中的checkbox
- DS1302
- Android学习笔记之RecyclerView详解
- Vue.js学习