280 likes | 502 Views
任务 6. MEGA16 模拟 I2C 总线开发. 任务内容. 1 、 I2C 总线概述. 2 、存储器 24c02 介绍. 3 、项目要实现的功能. 4 、系统硬件电路设计. 5 、驱动程序设计. 6 、功能验证. 1 、 I2C 总线概述. I2C ( Inter - Integrated Circuit )总线是由飞利浦公司开发的两线式串行总线,用于连接微控制器及其外围设备。是微电子通信控制领域广泛采用的一种总线标准。它是同步通信的一种特殊形式,具有接口线少,控制方式简单,器件封装形式小,通信速率较高等优点。. I2C 总线连接方式. 注意:总线需接上拉电阻.
E N D
任务6 MEGA16模拟I2C总线开发
任务内容 1、I2C总线概述 2、存储器24c02介绍 3、项目要实现的功能 4、系统硬件电路设计 5、驱动程序设计 6、功能验证
1、I2C总线概述 I2C(Inter-Integrated Circuit)总线是由飞利浦公司开发的两线式串行总线,用于连接微控制器及其外围设备。是微电子通信控制领域广泛采用的一种总线标准。它是同步通信的一种特殊形式,具有接口线少,控制方式简单,器件封装形式小,通信速率较高等优点。
I2C总线连接方式 注意:总线需接上拉电阻
I2C总线特征 1、只要求两条总线线路:一条串行数据线SDA,一条串行时钟线SCL; 2、每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机/从机关系软件设定地址,主机可以作为主机发送器或主机接收器; 3、它是一个真正的多主机总线,如果两个或更多主机同时初始化,数据传输可以通过冲突检测和仲裁防止数据被破坏; 4、串行的8 位双向数据传输位速率在标准模式下可达100kbit/s,快速模式下可达400kbit/s,高速模式下可达3.4Mbit/s; 5、连接到相同总线的IC 数量只受到总线的最大电容400pF 限制。
I2C总线停止与结束时序 起始:SCL 线是高电平时,SDA 线从高电平向低电平切换; 停止:SCL 线是高电平时,SDA 线由低电平向高电平切换。 起始和停止条件一般由主机产生,总线在起始条件后被认为处于忙的状态
起始和停止条件,在停止条件的某段时间后总线被认为再次处于空闲状态。起始和停止条件,在停止条件的某段时间后总线被认为再次处于空闲状态。 如果产生重复起始条件而不产生停止条件,总线会一直处于忙的状态,此时的起始条件(S)和重复起始条件(Sr) 在功能上是一样的。
I2C总线数据传输的有效性 在传输数据的时候,SDA线必须在时钟的高电平周期保持稳定,SDA的高或低电平状态只有在SCL 线的时钟信号是低电平时才能改变 。
I2C总线数据传输字节格式 发送到SDA 线上的每个字节必须为8 位,每次传输可以发送的字节数量不受限制。每个字节后必须跟一个响应位。首先传输的是数据的最高位(MSB),如果从机要完成一些其他功能后(例如一个内部中断服务程序)才能接收或发送下一个完整的数据字节,可以使时钟线SCL 保持低电平,迫使主机进入等待状态,当从机准备好接收下一个数据字节并释放时钟线SCL 后数据传输继续。
I2C总线数据传输响应 数据传输必须带响应,相关的响应时钟脉冲由主机产生。在响应的时钟脉冲期间发送器释放SDA 线(高)。 在响应的时钟脉冲期间,接收器必须将SDA 线拉低,使它在这个时钟脉冲的高电平期间保持稳定的低电平。
2、具有i2c总线接口的铁电存储器24c02介绍 • A0\A1\A2器件地址输入引脚 • SDA数据出/入 • WP写保护(可以写时接低电平) • SCL时钟 • GND地 • VCC接5V电源。
存储容量256*8位(2KBIT)、 • 自动递增地址,可页写; • 100万次读写次数; • 数据能保存100年; • 支持I2C总线协议、 • 1.8-5.5伏供电; • DIP8封装; • 5伏供电时钟1MHZ;
3、项目要实现的功能----数据存储系统设计 本项目用单片机采集PA端口的数据,然后写入到24C02的指定地址里,再然后从这个地址中读出数据送到PD口显示,使PD口的采集数据和PA口的显示数据吻合 ,验证时可以更改PA口所接拨码开关位置,检查数据的吻合度。
5、驱动程序设计( 准备动作) 把SDA\ACLK两根线端口输出寄存器设置为输出0, 并且这两根线都使用电源上拉电阻,这样就可以通过 设置端口方向寄存器点方向位使两根线分别为输出1和0.原理是:端口方向设置为1时,输出就是0,方向为0时内部为三态,但因为外部上拉了,因此输出就为1 #define scl_0 DDRB|=(1<<PB3) #define scl_1 DDRB&=~(1<<PB3) #define sda_0 DDRB|=(1<<PB4) #define sda_1 DDRB&=~(1<<PB4)
驱动程序设计(启功动作编程) /***************************************** SCL为高电平时,SDA由高向地电平跳变 ******************************************/ void i2c_start() { sda_1; delay(); scl_1; delay(); sda_0; delay(); }
停止动作编程 ///////////////////////////////////////////// //SCL高电平期间,SDA数据线由第到高点跳变 ///////////////////////////////////////////// void i2c_stop() { sda_0; delay(); scl_1; delay(); sda_1; delay(); }
判断从机响应动作编程 ////////////////////////////////////////// //从机应答,把SDA数据线拉低的过程 //////////////////////////////////////// void i2c_ack() { unsigned char i=0; scl_1; delay(); sda_1; delay(); while(((PINB&0X10)==0X10)&&(i<250))//等待从机拉低的时间内等待250US { i++;//如果还没有拉低响应,也继续往下运行 } scl_0; delay(); }
向存储器写一字节数据编程-----把8位二进制逐步移出向存储器写一字节数据编程-----把8位二进制逐步移出 void i2c_write_one_date(unsigned char date) { unsigned char i,temp; temp=date; for(i=0;i<8;i++) { scl_0;delay(); if((temp&0x80)==0x80) sda_1;elsesda_0; delay();scl_1;delay(); temp=temp<<1; } scl_0; delay(); sda_1; delay(); }
向存储器读一字节数据编程—把SDA线上的电平合成字节数据向存储器读一字节数据编程—把SDA线上的电平合成字节数据 unsigned char i2c_read_one_date() { unsigned char i,k; scl_0; delay(); sda_1; delay(); for(i=0;i<8;i++) { scl_1; delay(); k=((k<<1)|((PINB&0X10)>>4)); scl_0; delay(); } delay(); return k; }
24C02存储器的指令 • A2\A1\A0就是芯片接地与接高电平的方式,三个管脚共有8种接法。R/W是读写功能设定为,为1是读,为0是写。根据电路: READ 10100001B 读出 0XA1 WRITE 1010000B 写入 0XA0 我们可以在程序中使用这两个指令,对芯片操作。
向存储器的指定单元写入一个字节的数据 void i2c_write(unsigned char adress,unsigned char date) { i2c_start(); //启动 i2c_write_one_date(0xa0);//写入写指令 i2c_ack(); // 等待响应 i2c_write_one_date(adress);//写入指定地址单元 i2c_ack(); //等待响应 i2c_write_one_date(date); //写入指定数据 i2c_ack(); //等待响应 i2c_stop(); //停止 }
向存储器的指定单元读出一个字节的数据 unsigned char i2c_read(unsigned char adress) { unsigned char date; i2c_start(); //启动 i2c_write_one_date(0xa0); //写入写指令 i2c_ack(); //等待响应 i2c_write_one_date(adress); //写入要读的单元地址 i2c_ack(); //等待响应 i2c_start(); //重新启动 i2c_write_one_date(0xa1); //写入读指令 i2c_ack(); //等待响应 date=i2c_read_one_date(); //读出数据并保存到变量中 i2c_stop(); //停止 return date; }
void main() { DDRA=0x00; DDRD=0XFF; i2c_init(); while(1) { i2c_write(0x03,PINA); delaynms(20); PORTD=i2c_read(0x03); delaynms(20); } }
谢 谢! 我想·我能·我努力 WOXIANG WONENG WONULI