历史上的今天
今天是: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;
}
下一篇:单片机中的几种通信方式
史海拾趣
|
名机的电路具有优良的特性,如果仿制上有错误的话,结果很可能还不如一般电路。本文就是要将众多成熟机型中的成熟技术作个介绍,让发烧友少走些弯路。 首先,元件的布置是很重要的,这是作好一台放大器的前提条件。普通使用的电子管放大器大都采用 ...… 查看全部问答> |
|
本书讲述模拟与数字锁相环及频率合成器的理论,组成,性能测试和设计,对单环数字式频率合成器,集成电路频率合成器,微计算机控制的频率合成器等作了详细的 阐述. 本书供各类高校本科生作专业课教材用.… 查看全部问答> |
|
我想实现在驱动中发送自定义消息。为什么总是无法接收到,也不知道是否发送。 使用SendMessage()函数。 SendMessage(HWND_BROADCAST,WM_COPYDATA ,(WPARAM)(&g_KeyCode),(LPARAM)(&g_KeyCode)); WM_COPYDATA的响应函数根本记不响应。 难道win ...… 查看全部问答> |
|
在宿主机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写了一个网站。在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 ,在调试串口1的ISP。 一次也没连上。 描述一下状况:0)系统电源波形稳定 1)外围电路除串口1全部去掉,外部晶振去掉,外部加一个复位芯片   ...… 查看全部问答> |




