历史上的今天
返回首页

历史上的今天

今天是:2025年07月14日(星期一)

正在发生

2018年07月14日 | 关于单片机IIC总线的理解

2018-07-14 来源:eefocus


#include

 

void delay10us(void){//误差 0us

    unsigned char a,b;

    for(b=1;b>0;b--)

        for(a=2;a>0;a--);

}

 

void iicStart(){

SDA = 1;

delay10us();

SCL = 1;

delay10us();

SDA = 0;

delay10us();

SCL = 0;//SCL=0时,SDA状态允许变化

delay10us();

 

}

 

unsigned char iicSendDate(unsigned char dat){

unsigned char i,a;

for(i=0;i<8;i++){

SDA = dat>>7;

dat>>=1;

SCL = 1;

delay10us();

SCL = 0;

delay10us();

}

//等待应答. SCL、SDA释放   等待应答时,SCL=1,SDA=1,应答后,SDA=0

SDA = 1;

delay10us();

SCL = 1;

//delay10us();  不需要延时,后面通过a++延时,来判断是否发送成功

//应答与否—————_是否发送成功

while(SDA){//若应答,则SDA=0,从而结束循环,返回1.

  a++;

  delay10us();

  if(a>200){

             SCL = 0;

             delay10us();

            return 0;

  }

  

}

SCL = 0;//SCL=0时,允许SDA状态发生变化,为了下一次发送

delay10us();

return 1;

}

//读取过程,主机先发送从机器件地址,要读取的地址,后要重复一次起始信号并发出器件地址和读取方向1 (发送函数包含等待从机应答过程即等待 SDA=0的过程)

//发送完后,scl = 0; 才开始读取数据过程——iicReadDate()函开始数执行

unsigned char iicReadDate(){

unsigned char i,dat = 0;

//scl =0;之前已经等于0了,不用写

SDA = 1;//读取字节前,先释放SDA,SDA=1不是将端口固定位高电平,而是关闭单片机

       //内部下MOG管,让SDA线的电平由信号决定。

delay10us();//等待SDA为状态的更新

for(i=0;i<8;i++){//接受8个字节

SCL = 1;//SDA为高电平时,数据是稳定的

delay10us();

dat<<=1;//iic是串行传输的,只能一位一位传输,并且最高位在前

dat |=SDA;//将dat左移一位,然后将SDA位的状态放到dat的最后一位,赋值给dat,循环8次,依次写到dat的8个位中。dat的最初的首位被移出,

delay10us();

SCL = 0;//SCL=0时,SDA状态才允许发生变化。为后续的终止信号做准备。

delay10us();

}

return dat;

 

}

void iccStop(){

SDA = 0;

delay10us();

SCL = 1;  //释放

delay10us();

SDA = 1;  //释放

delay10us();

 

}

//iic总线  相当于数据线,由单片机模拟。

 

//往24c02的一个地址写入数据

void at24co2WriteDate(unsigned char addr,unsigned char dat){

iicStart();//开始

 

iicSendDate(0xa0);//发送写器件地址 1010 000 0

iicSendDate(addr);//发送该器件的存储区的首地址

iicSendDate(dat);//发送数据

 

iicStop();//停止

}

 

//从24c02内读取数据

unsigned char at24c02ReadDate(unsigned char addr ){ //addr:器件的存储区的首地址。器件的地址已知

unsigned char num;

iicStart();//开始

 

iicSendDate(0xa0);//发送器件地址+0

iicSendDate(addr);//发送该器件的存储区的首地址

iicStart();

iicSendDate(0xa1);

 

num = iicReadDate();

 

iicStop();//结束

return num;

}


推荐阅读

史海拾趣

Directed Energy Inc公司的发展小趣事

Directed Energy Inc公司自创立之初,就致力于在电子行业中推动技术创新。公司投入大量研发资源,开发出一系列高性能的脉冲式激光二极管驱动器和高压脉冲模块,这些产品凭借其卓越的性能和稳定性,迅速在市场上获得了认可。随着技术的不断迭代和升级,Directed Energy Inc逐渐在电子行业中树立了技术领先的形象,吸引了众多行业内的设计师和工程师的关注。

国炬(GOOGLL)公司的发展小趣事
静态工作点的设置对功放电路的性能有重要影响。需要确保静态工作点稳定且适当,以避免出现交越失真等问题。
Danube Enterprise Co Ltd公司的发展小趣事

随着数字技术的快速发展,Danube也紧跟时代步伐,积极推进数字化转型。他们引入了先进的生产管理系统和供应链管理系统,实现了生产流程的自动化和智能化。同时,Danube还加强了与互联网企业的合作,利用大数据、云计算等技术手段提升产品的智能化水平。这些努力让Danube在电子行业中保持了领先地位,并引领了行业变革的方向。随着数字化转型的深入推进,Danube的未来发展将更加值得期待。

Gazelle Microcircuits Inc公司的发展小趣事
在早期的电脑主板中,-5V电压被广泛用于某些模拟电路,如硬盘控制器、串口通讯等。然而,随着技术的进步和元件的更新换代,-5V电压的需求已经大大减少,甚至在一些新的主板设计中已经不再提供-5V输出。尽管如此,在一些老旧的设备或特定应用中,-5V电压仍然可能被需要。
台湾美丽微(FMS)公司的发展小趣事

近年来,FTDI通过战略并购进一步拓展了其业务领域。例如,电连技术通过发行股份及支付现金的方式收购了FTDI的控股权,这一举措不仅使电连技术在产品和客户层面实现了更完整的布局,也增强了其在汽车电子、物联网、工业产品、医疗设备等多个领域的市场竞争力。FTDI凭借其在USB桥接芯片领域的深厚积累和技术优势,为电连技术的业务扩展提供了有力支持,共同推动了公司在全球电子元件产业的持续发展。

Enable Semiconductor Corp公司的发展小趣事

在半导体产业链中,Enable Semiconductor Corp公司注重与上下游企业的合作。公司与多家芯片设计公司、封装测试企业建立了紧密的合作关系,共同开发新产品、新技术。这种合作模式不仅降低了公司的研发成本,也加快了产品上市的速度。同时,通过与合作伙伴的资源共享和优势互补,Enable Semiconductor Corp公司在市场上形成了强大的竞争力。

问答坊 | AI 解惑

自制扩音机的结构设计

名机的电路具有优良的特性,如果仿制上有错误的话,结果很可能还不如一般电路。本文就是要将众多成熟机型中的成熟技术作个介绍,让发烧友少走些弯路。 首先,元件的布置是很重要的,这是作好一台放大器的前提条件。普通使用的电子管放大器大都采用 ...…

查看全部问答>

菜农星期公式揭秘及蔡勒公式推想

http://blog.ednchina.com/hotpower/158297/message.aspx…

查看全部问答>

ARM教材(浙江大学)

这绝对是内部资料,分享下…

查看全部问答>

【藏书阁】锁相与频率合成技术

本书讲述模拟与数字锁相环及频率合成器的理论,组成,性能测试和设计,对单环数字式频率合成器,集成电路频率合成器,微计算机控制的频率合成器等作了详细的 阐述. 本书供各类高校本科生作专业课教材用.…

查看全部问答>

wince 驱动如何发送自定义消息??

我想实现在驱动中发送自定义消息。为什么总是无法接收到,也不知道是否发送。 使用SendMessage()函数。 SendMessage(HWND_BROADCAST,WM_COPYDATA ,(WPARAM)(&g_KeyCode),(LPARAM)(&g_KeyCode)); WM_COPYDATA的响应函数根本记不响应。 难道win ...…

查看全部问答>

把iptables移植到linux内核

在宿主机Red Hat Linux 9.0上安装iptables-1.3.6是可以用的,但我修改了内核路径和可执行文件路径到ARM文件系统后烧到板子(内核是Linux-2.6.8.1)上,使用iptables命令时出现bash: /sbin/iptables: cannot execute binary file,我想知道为什么在宿主机 ...…

查看全部问答>

cgi+sqlite移植问题,

我最近用cgi+sqlite写了一个网站。在linux上运行正常,apache,sqlite移植2410成功,在arm上,运行apache+cgi测例成功,运行c+sqlite也成功,但是运行apache+cgi+sqlite网页出错,认为他不是正常的cgi程序,-I/usr/local/sqlite/include -L/usr/loc ...…

查看全部问答>

紧急求助:pxa270下SDIO wifi模组的驱动 Marvell 8686

请问谁能发给我一份在PXA270下可以使用的SDIO WIFI模组的驱动,模组型号是USI的WM-G-MR-09,模组使用的芯片是Marvell 8686. 我手里有厂商给的驱动,名称是:SD-8686-WM60-ARMV4I-9.70.3.p23-38.p44.CAB,但是这份是基于PXA310和wince6.0的驱动,我 ...…

查看全部问答>

STM32F105RCT6串口1ISP连不上

目前在用STM32F105RCT6 ,在调试串口1的ISP。 一次也没连上。 描述一下状况:0)系统电源波形稳定               1)外围电路除串口1全部去掉,外部晶振去掉,外部加一个复位芯片   ...…

查看全部问答>