IIC总线时序

发布者:清新家园最新更新时间:2015-01-22 来源: 51hei关键字:IIC  总线时序 手机看文章 扫描二维码
随时随地手机看文章
最近做的项目中涉及了IIC总线的运用
 
IIC总线的运用范围十分广泛
 
写下博客记录

IIC总线延时 大于4.7us
 
#define Decoded_iic_delay() \
{\
 Decoded_iic_DELAY_TMP=Decoded_iic_DELAY_VALUE;\
 while(--Decoded_iic_DELAY_TMP);\
}
 
初始化
 
void Decoded_iic_init()
{
 Decoded_iic_SCL=1;
 Decoded_iic_delay();
 Decoded_iic_SDA=1;
 Decoded_iic_delay();
}
 
开始信号
 
void Decoded_iic_start()
{
 Decoded_iic_SDA=1; 
 Decoded_iic_delay();
 //Myputchar(Decoded_iic_SDA);
 
 Decoded_iic_SCL=1;
 Decoded_iic_delay();
 //Myputchar(Decoded_iic_SCL);
 
 Decoded_iic_SDA=0;
 Decoded_iic_delay();
 //Myputchar(Decoded_iic_SDA);
 
 Decoded_iic_SCL=0;
 Decoded_iic_delay();
 //Myputchar(Decoded_iic_SCL);
}
 
写时序
 
void Decoded_iic_write(uchar dat)
 uchar idata t=8;
 while(t--)
 {
  Decoded_iic_SDA=(bit)(dat&0x80);
  dat<<=1;
  Decoded_iic_SCL=1;
  Decoded_iic_delay();
  Decoded_iic_SCL=0;
  Decoded_iic_delay();
 }
}
 
读时序
 
uchar Decoded_iic_read()
{
 uchar dat=0;
 uchar t=8;
 
 //Myputchar(dat);
 
 Decoded_iic_SDA=1;读之前SDA拉高
 while(t--)
 {
  Decoded_iic_SCL=1;
  Decoded_iic_delay();
 
  dat <<= 1;一定要先移位后读 如果先读后移位会挤掉最高位
 
  if(Decoded_iic_SDA)
  {
   dat |= 0x01;
  }
 
  Decoded_iic_SCL=0;
  Decoded_iic_delay();
 }
 
 
 
 return dat;
}
 
获取ACK
 
bit Decoded_iic_getack()
{
 bit ack;
 Decoded_iic_SDA=1;SDA为高释放总线
 Decoded_iic_delay();
 Decoded_iic_SCL=1;
 Decoded_iic_delay();
 ack=Decoded_iic_SDA;
 
 Decoded_iic_SCL=0;
 Decoded_iic_delay();
 
 return ack;
}
 
发送ACK
 
void Decoded_iic_putack(bit ack)
{
 Decoded_iic_SDA=ack;
 Decoded_iic_SCL=1;
 Decoded_iic_delay();
 Decoded_iic_SCL=0;
 Decoded_iic_delay(); 
}
 
结束信号
 
void Decoded_iic_stop()
{
 uint t=Decoded_iic_WAIT_VALUE;
 Decoded_iic_SDA=0;
 Decoded_iic_delay();
 Decoded_iic_SCL=1;
 Decoded_iic_delay();
 Decoded_iic_SDA=1;
 Decoded_iic_delay();
 while(t--);
}
 
综合发送
 
bit Decoded_iic_puts(unsigned char SlaveAddr,uchar *dat,unsigned int Length)
{
 if ( Length == 0 ) return 0;
 
 Decoded_iic_start();
 
 Decoded_iic_write(SlaveAddr);发送地址
 
 if ( Decoded_iic_getack() )
 {
  Decoded_iic_stop();
  return 1;
 }
 
发送数据
 do
 {
  Decoded_iic_write(*dat++);
  if ( Decoded_iic_getack() )
  { 
   //Myputchar('c');
    break;
  }
 } while ( --Length != 0 );
 
 Decoded_iic_stop();
 
 if ( Length == 0 )
 {
  //Myputchar('a');
  return 0;
  
 }
 else
 {
  //Myputchar('b');
  return 1;
  
 }
}
 
综合接收数据
 
bit Decoded_iic_gets(unsigned char SlaveAddr,uchar *dat,unsigned int Length)
{
 if(!Length)
 return 0;
 
 Decoded_iic_start();
 Decoded_iic_write(SlaveAddr+1);发送地址+1  +1是读的意思
 
 if(Decoded_iic_getack())
 {
  Decoded_iic_stop();
  return 1; 
 }
 
 for (;;)
 {
  *dat++ = Decoded_iic_read();
  if ( --Length == 0 )
  {
   Decoded_iic_putack(1);发送非ACK
   break;
  }
  Decoded_iic_putack(0);发送ACK
 }
//接收完毕,停止I2C总线,并返回结果
 Decoded_iic_stop();
 return 0;
}
关键字:IIC  总线时序 引用地址:IIC总线时序

上一篇:十六进制数转BCD码显示
下一篇:c语言结构体的用法

推荐阅读最新更新时间:2024-03-16 13:51

STM32-IIC模拟从模式
这里是讲的模拟IIC,不是采用硬件IIC。为啥用软件模拟IIC而不用硬件IIC? 除了ST的IIC模块本身问题,还因为硬件IIC移植不方便,在不同的MCU中无法通用;而且有的项目需要在IIC主从模式切换。 网上的资料大部分都是模拟IIC主模式的,很少有资料告诉我怎么实现模拟IIC从模式。 因为特殊要求,我们在做汽车电容屏升级的时候,要扔掉原车屏的一个部件,即IIC从机部分,只保留IIC主芯片,并采用STM32替代被扔掉的IIC从机功能,而且在不同应用内容下,需要切换IIC的主从工作模式。 要实现IIC从机功能,最核心的部分就是如何精确的抓住IIC_SCL,也就是IIC主机发出来的时钟信号。只有抓住精确的时钟SCL,才能正确的读取到
[单片机]
基于STM32和HAL库创建一个IIC设备
1 简述 使用面向对象的编程思想封装IIC驱动,将IIC的属性和操作封装成一个库,在需要创建一个IIC设备时只需要实例化一个IIC对象即可,本文是基于STM32和HAL库做进一步封装的。 底层驱动方法不重要,封装的思想很重要。在完成对IIC驱动的封装之后借助继承特性实现AT24C64存储器的驱动开发,仍使用面向对象的思想封装AT24C64驱动。 2 IIC驱动面向对象封装 iic.h头文件主要是类模板的定义,具体如下: //定义IIC类 typedef struct IIC_Type { //属性 GPIO_TypeDef *GPIOx_SCL; //GPIO_SCL所属的GPIO组(如:GPIOA)
[单片机]
51单片机—IIC—EEPROM(CAT24WCXX)—03
今天没事做,突然想起来了IIC,所以决定回顾一下下,呵呵,忘记了不少,所以打算写出来,便于以后记忆。。。 ,这里的例子就拿CAT24WCXX的EEPROM来解释吧~~(我也是边写文章,边写代码~~~累啊) 一、IIC总线简介 1.IIC总线的主要特点 IIC总线是一种简单、双向二线制同步串行总线。 (1)总线只有两根线,既串行时钟线(SCL)和串行数据线(SDA),这在设计中大大减少了硬件接口 (2)每个连接到总线上的器件都有一个用于识别的器件地址,(注意,器件地址由芯片内部硬件电路和外部地址引脚同时决定,这样就避免了~~你懂得)从而建立了简单的主从关系,从而每个器件都可以作为发送器,也可以作为接收器。 (3)同步时钟允许
[单片机]
51单片机—<font color='red'>IIC</font>—EEPROM(CAT24WCXX)—03
基于IIC1.0的时钟芯片应用程序设计
摘要:在对串行实时时钟芯片X1203内部结构和工作特性作基本介绍的基础上,设计出用单片机的通用I/O口线虚拟I2C总线来实现与时钟芯片的串行接口电路以及利用虚拟I2C总线软件包VIIC设计时钟芯片1203的应用程序。 关键词:单片机 实时时钟 虚拟I2C总线 实时时钟是微机测控系统中的一个重要组成部分。美国Xicor公司推出的串行接口实时时钟芯片X1203提供备用电源输入引脚,使器件能用非可重新充电电池任务用电源。该芯片以其体积小、功耗低、使用简单、接口容易、与单片机连线少为主要特点,同时具有较高的精度,能很好满足微机测控系统的求。下面具体介绍该芯片的内部结构、工作特性、与51系列单片机接口设计实例以及如何利用虚拟I2C总线软件包
[单片机]
迪康将于2012IIC-China上展出最新产品
2012年2月17日星期五。派瑞特旗下品牌,数字电视与广播接收器件的领先提供商迪康,将于2月23-25日出席在深圳举行的2012年国际集成电路研讨会暨展览会(IIC-China),展出用于数字电视与广播的可编程接收芯片Octopus 2的最新版本。 Octopus 2是首款可同时接收CMMB和CTTB(或称DTMB)标准信号的芯片。这一新型方案可以有效满足中国汽车市场高速增长的需求(年均增速20%),而这一市场正在获得来自于对嵌入式多媒体,如广播电视应用强劲需求的支持。 通过调用相应的微码,可以接收特定标准的信号。因此,同一器件可以使用两组微码在中国各地接收CMMB或CTTB标准的数字电视信号。目前全国各地已有300多个城市开
[家用电子]
stm32专题十六:IIC(一)硬件结构框图
STM32的I2C特性及架构: 1 硬件实现协议: 由STM32的I2C片上外设专门负责实现I2C通讯协议,只要配置好该外设,它就会自动根据协议要求产生通讯信号,收发数据并缓存起来,CPU只要检测该外设的状态和访问数据寄存器,就能完成数据收发。这种由硬件外设处理I2C协议的方式减轻了CPU的工作,且使软件设计更加简单。 stm32的硬件IIC,在某些情况下会出现错误,但也没有必要去纠结这个问题。 2 软件模拟协议:使用CPU直接控制通讯引脚的电平,产生出符合通讯协议标准的逻辑。 STM32的I2C外设可用作通讯的主机及从机,支持100Kbit/s和400Kbit/s的速率,支持7位、10
[单片机]
stm32专题十六:<font color='red'>IIC</font>(一)硬件结构框图
STM32的IIC应用详解3
这两天将STM32的IIC按照原子哥的程序,大致走了一遍,多少对IIC不是那么地陌生了,也多少有了自己的一些感悟,在这里,将这两天的学习的一个大致步骤总结下,一来可以让自己形成一个清晰地思路,二来,希望能给一些新手一点启发。 首先IIC是一种通信协议,通信方式相对比较简单,主要有两条线,SDA,SCL。SDA是串行数据线,上面走命令和数据,而SCL只是一条时钟线,其保证数据是按照时钟节拍来进行传输。IIC上面可以外挂很多的IIC芯片,每一个芯片对应着不同的地址,通过地址来将不同的芯片进行分开,保证不同芯片之间的数据传输,由于每一个芯片都是可以独立地收发,故,每一个芯片都是主机/从机。接下来,就是数据的传输过程了, 大致的一个数
[单片机]
STM32的<font color='red'>IIC</font>应用详解3
Wireless Sound亮相IIC 2008
  提到无线音频传播,有人会很自然的想起蓝牙技术,但是Wireless Sound(Wireless Sound Solutions Pte Ltd)又给大家带来了另一种方式,这是一款基于全球公开授权的2.4/5 ISM频段的无线音频传播方案。该无线音频解决方案在IIC 2008位于深圳会展中心展览馆的2N45展台展示。   该STS 无线音频解决平台技术是来自荷兰,采用公开授权的2.4/5 ISM频段,藉由该平台可以实现无线传输未压缩的CD音质的音频流,可以具有多个接收端,并且只有很小的延迟。传输距离亦是非常的理想,在室内环境下最高可以达到50m(200m LoS),具有最高27Mbps的带宽,这样的特性从字面看来绝非蓝牙能够
[手机便携]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved