- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
IIC_重点详解_个人总结
单片机的重点知识1IIC协议:
1、IIC协议说明:
I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。
AT24C02的芯片地址如下图,1010为固定,A0,A1,A2正好与芯片的1,2,3引角对应,为当前电路中的地址选择线,三根线可选择8个芯片同时连接在电路中,当要与哪个芯片通信时传送相应的地址即可与该芯片建立连接,我所使用的实验板上三根地址线都为0。最后一位R/W为告诉从机下一字节数据是要读还是写,0为写入,1为读出。
AT24C02的芯片地址(0xa0为写,0xa1为读)
任一地址写入格式
任一地址读取数据格式
2、程序详解IO口模拟IIC:
起始和终止信号 :SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号;SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。
void start()//起始信号
{
SDA=1;
Delay_us(10);
SCL=1;
Delay_us(10);
SDA=0;
Delay_us(10);
}
Void stop()//终止信号
{
SDA=0;
Delay_us(10);
SCL=1;
Delay_us(10);
SDA=1;
Delay_us(10);
}
数据传送格式(1)字节传送与应答
每一个字节必须保证是8位长度。数据传送时,先传送最高位(MSB),每一个被传送的字节后面都必须跟随一位应答位(即一帧共有9位)。如果一段时间内没有收到从机的应答信号,则自动认为从机已正确接收到数据。
Void ack()//应答信号
{
uchar i;
SCL=1;
Delay_us(10);
While((SDA==1)(i==250)) i++;//如果SDA=0则表示已经应答或者等待一会,就默认已经应答
SCL=0;
Delay();
}
Void noack()//非应答信号
{
SDA=1;
Delay();
SCL=1;
Delay();//SCL有变化时,SDA保持不变,即非应答
SCL=0;
Delay();
}
void init()//初始化信号
{
scl=1;
sda=1;
}
/////////////////////写一个字节//////////////////////
void iicwr_byte(uchar dat)
{
uchar i;
scl=0; //只有在时钟线上的信号为低电平时,数据线上的高电平或低电平才允许变化(补:时钟线为高电平时,才能进行读写)
delay();
for(i=0;i8;i++)//每一个字节,必须保持8位的数据长度
{
if(dat0x80)//数据传送时,先传送最高位MSB
{
sda=1;
}
else
{
sda=0;
}
dat=dat1;//左移
delay();
scl=1; //时钟线为高电平时,才能进行读写
delay();
scl=0; //进行数据读写时,拉低时钟线,以保持数据稳定,有效
delay();
}
sda=1; //每传送完一位就将数据线释放,以便下一位数据的传送;
delay();
}
//////////////////////读一个字节//////////////////////
uchar iicre_byte()
{
uchar i,dat;
scl=0;
delay();
sda=1; //数据线释放
delay();
for(i=0;i8;i++)
{
scl=1; //时钟线为高电平时,才能进行读写
delay();
dat=dat1;//判断8次,移位7次
if(sda==1)
{
dat++;//自增,个位加1
}
scl=0;//拉低时钟线,以保证数据的稳定,和读出数据的正确性
delay();
}
return dat;
}
//////////////////////写操作/////////////////////
void write_byte(uchar address,uchar dat)//指定地址写一个字节数据
{
init(); //初始化
start();
iicwr_byte(0xa0);//写器件地址(a是地址固定部分(1010),0的前三位是选择位,第四位0为写;若第四位为1,则是读;)
ack();
iicwr_byt
您可能关注的文档
最近下载
- 医疗器械维修保密及免责协议.doc VIP
- CJJT 286-2018土壤固化剂应用技术标准.doc
- STEM教育理念在初中数学教学中的应用研究教学研究课题报告.docx
- (高清版)B-T 24353-2022 风险管理 指南.pdf VIP
- 【事业单位考试真题】浙江省杭州市余杭区综合基础知识真题汇总2008年-2018年详细解析版(附答案解析).docx
- 松下洗碗机NP-TCM1使用说明书.pdf VIP
- 政府采购评审专家考试试题.pdf VIP
- 苏科版数学(2025)七年级下册第一次月考试题(培优)(含答案).docx VIP
- 《用样本估计总体》实验说课.pptx
- 半导体生产项目供应链管理方案.docx VIP
文档评论(0)