模拟I2C程序设计

发布者:会弹琴的鲸鱼3312最新更新时间:2016-09-25 来源: eefocus关键字:模拟I2C  程序设计 手机看文章 扫描二维码
随时随地手机看文章
#include 

#include

#define uchar unsigned char
#define DELAY5US   _nop_(); _nop_(); _nop_(); _nop_();   //延时5us
#define WriteDeviceAddress   0xa0   //写I2C外围器件的寻址地址
#define ReadDeviceAddress   0xa1   //读I2C外围器件的寻址地址
           //注:写I2C外围器件的寻址地址为器件的地址,读为器件地址加1
uchar E0;    //非应答信号标志位
uchar NACK=0;    //错误标志位

//**************************修改硬件时要修改的部分********************************

sbit SDA    = P1^0;   //模拟数据线
sbit SCL    = P1^1;   //模拟时钟线

void Start(void)    //启动I2C总线子函数
{
   SDA=1;
SCL=1;
DELAY5US
SDA=0;
DELAY5US
SCL=0;
}

void Stop(void)    //停止I2C总线数据传送子函数
{
   SDA=0;
SCL=1;
DELAY5US
SDA=1;
DELAY5US
SCL=0;
}

void Ack(void)    //发送应答位子程序
{
   SDA=0;
   SCL=1;
   DELAY5US
   SCL=0;
   SDA=1;
}

void NoAck(void)   //发送非应答位子程序
{
   SDA=1;
   SCL=1;
   DELAY5US
   SCL=0;
   SDA=0;
}

void TestAck(void) //应答位检查子程序,若检测不到非应答信号,置位E0
{
   SDA=1;
   SCL=1;
   E0=0;
   _nop_(); //短延时
   if(SDA==1) //如果SDA为1,表明非应答,置位非应答标志E0
      E0=1;
   SCL=0;
}

void Write8Bit(uchar n) //写一个字节数据子程序,n为待发送的数据
{
   uchar i;
   for(i=8;i>0;i--)
   {
      SDA=(bit)(n&0x80);
   SCL=1;
   DELAY5US
   SCL=0;
   SDA=0;
   n=n<<1;
   }
}

void WriteI2C(uchar *Wdata,uchar RomAddress,uchar number) // 写n个字节数据子程序
{     //*Wdata为待发送数据的首地址,RomAddress为待I2C外围器件的数据写入首地址,number为写字节的个数
Start(); //启动
Write8Bit(WriteDeviceAddress); //写入器件的寻址地址
TestAck();    //应答检查
if(E0==1)
{
    NACK=1;   //若非应答表明器件错误或已坏,置错误标志位NACK
    return;
}
Write8Bit(RomAddress); //写入I2C器件的数据存储首地址
TestAck();    //应答检查
if(E0==1)
{
    NACK=1;   //若非应答表明器件错误或已坏,置错误标志位NACK
    return;
}
for(;number!=0;number--)   //循环,逐个字节发送
{
    Write8Bit(*Wdata); //写一个字节
    TestAck();    //应答检查
    if(E0==1)
    {
       NACK=1;   //若非应答表明器件错误或已坏,置错误标志位NACK
       return;
    }
    Wdata++;         //指针增加,指向下一个数据
}
Stop();     //全部发送完则停止
}

uchar Read8Bit(void)   //读一个字节数据子程序
{
    uchar temp,rbyte=0;
for(temp=8;temp>0;temp--)
{
    SDA=1;
    SCL=1;
    _nop_(); //短延时
       rbyte=rbyte<<1;
    rbyte=rbyte|((uchar)(SDA));
    SCL=0;
}
return(rbyte);
}

void ReadI2C(uchar *RamAddress,uchar RomAddress,uchar bytes) // 读n个字节数据子程序
{   //RamAddress为接收数据缓冲区的首地址,RomAddress为待I2C外围器件的数据读取首地址,bytes为写字节的个数
   Start(); //启动
Write8Bit(WriteDeviceAddress); //写入器件的寻址地址
TestAck();    //应答检查
if(E0==1)
{
    NACK=1;   //若非应答表明器件错误或已坏,置错误标志位NACK
    return;
}
Write8Bit(RomAddress); //写入I2C器件内部数据的读取首地址
TestAck();    //应答检查
if(E0==1)
{
    NACK=1;   //若非应答表明器件错误或已坏,置错误标志位NACK
    return;
}
Start(); //重新启动
Write8Bit(ReadDeviceAddress); //写入器件的寻址地址
TestAck();    //应答检查
if(E0==1)
{
    NACK=1;   //若非应答表明器件错误或已坏,置错误标志位NACK
    return;
}
while(bytes!=1)     //循环读入字节数据
{
    *RamAddress=Read8Bit(); //读入一个字节
    Ack();                //应答
    RamAddress++;      //地址指针递增
    bytes--;     //待读入数据个数递
}
*RamAddress=Read8Bit(); //读入最后一个字节数据
NoAck();   //非应答
Stop();    //停止
}

关键字:模拟I2C  程序设计 引用地址:模拟I2C程序设计

上一篇:I2S总线原理及其实例
下一篇:可移植程序的探讨

推荐阅读最新更新时间:2024-03-16 15:11

面向AWorks框架时间管理程序设计
实际应用中,时间管理往往是必不可少的。例如:定时完成某件事情、周期性地触发某一动作、测量评估程序运行时间等。AWorks提供了一系列时间相关的服务,包括标准时间和定时器等,用户可以据此实现灵活的时间相关应用。 本文为《面向AWorks框架和接口的编程(上)》第三部分软件篇——第8章时间管理——第1~5小节:时间的表示形式、RTC通用接口、系统时间、系统节拍和软件定时器。 8.1  时间的表示形式 在AWorks中,时间有3种表示形式:细分时间、日历时间和精确日历时间。 8.1.1  细分时间 细分时间包含年、月、日、时、分、秒等信息。在AWorks中,细分时间使用aw_tm_t类型表示,该类型的具体定义详见程序清单8
[网络通信]
基于ATmega16单片机控制液晶显示屏的程序设计
在掌握了对LCD的控制显示之后,我们需要将LCD综合入密码保管箱,使之成为一个独立工作的系统。 在本期配刊光盘中有上一期用ATmega16控制液晶显示屏的源程序,将其中的ICd.c和lod.H拷贝到第7期例程psmanager的目录里,并用ICCAVR打开工程psrnanager,然后分别将Icd.c和Icd.h加入工程,如下图所示。 在Icd.c中去掉以下代码: /*时钟为8MHz*/ void delay_1us(void) { asm(“nod”); } void delay_us(unsigned int itimes) { unsigned int itemp; for(itemp=0;itemp { delay_1
[单片机]
基于ATmega16单片机控制液晶显示屏的<font color='red'>程序设计</font>
基于PLC和计算机的汽车同步器测试系统
    在汽车的传动系统中,若采用机械式手动变速器,一般都配有同步器,其主要功能是:使接合套与待接合齿圈两者之间能迅速同步,阻止在同步之前齿轮进行啮合,防止产生接合齿圈之间的冲击,缩短换档时间,迅速完成换档操作,并延长齿轮寿命。同步器的性能指标直接影响变速器的效能表现,从而影响车辆的操控性,所以要在安装前对其技术性能和寿命进行一系列相关测试。     研制基于PLC的变速器同步器测试系统,可以对同步器换挡过程中的关键参数进行实时准确的测试记录,通过对比分析处理,从而对被试同步器的性能与寿命作出客观准确的评价。因为PLC具有体积小、功能强、可靠性高等特点,所以采用PLC作为整个测试系统的控制核心,通过驱动电机模拟换挡过程,并且控制二个
[嵌入式]
28课:单片机音乐程序设计
利用单片机(或单板机)奏乐大概是无线电爱好者感兴趣的问题之一。本文从单片机的基本发间实验出发,谈谈音乐程序的设计原理,并给出具体实例,以供参考。 单片机的基本发音实验 我们知道,声音的频谱范围约在几十到几千赫兹,若能利用程序来控制单处机某个口线的“高”电平或低电平,则在该口线上就能产生一定频率的矩形波,接上喇叭就能发出一定频率的声音,若再利用延时程序控制“高”“低”电平的持续时间,就能改变输出频率,从而改变音调。 例如,要产生200HZ的音频信号,按图1接入喇叭(若属临时实验,也可将喇叭直接接在P1口线上),实验程序为: 其中子程序DEL为延时子程序,当R3为1时,延时时间约为20us,R3中存放延时常数,对200HZ音频
[单片机]
28课:单片机音乐<font color='red'>程序设计</font>
51单片机的程序设计中的C语言
在实际工程应用中,51单片机的程序设计一般都是采用C语言编写,通过相应的编译器,得到可执行代码,以提高程序开发效率。但由于单片机的内部资源有限,并结合单片机的特点(如位操作),与标准C语言相比,有所不同,称为C51程序。 C语言的特点 语言简洁、紧凑,使用方便、灵活。 运算符丰富。 数据结构丰富。具有现代化语言的各种数据结构。 可进行结构化程序设计。 可以直接对计算机硬件进行操作。 生成的目标代码质量高,程序执行效率高。 可移植性好。 C语言程序采用函数结构,每个C语言程序由一个或多个函数组成,在这些函数中至少应包含一个主函数main(),也可以包含一个main()函数和若干个其它的功能函数。不管main()函数放于
[单片机]
LabVIEW程序设计模式(四)—状态机和事件结构的结合
上两节分别解决了基本状态机的第(1~5)个问题,但是是否具备一种模式能够综合队列型状态机模式和用户界面事件型模式的优点呢?这样可以同时避免基本状态机的第(1~5)个问题。答案是肯定的,本节将介绍如何将状态机与事件结构结合起来形成一种新的、稳定的模式。 状态机模式的基本构成元素是while循环和case结构,而事件结构模式的基本构成元素是while循环和event结构,因此新的模式应该由while循环、case结构和event结构组成。而while循环的目的是为了保证程序的持续运行,因此必须在最外层,这样就只剩下了图 20所示的两种组合方式。 在第一种方式中,每次循环的运行需要经过一个事件结构才能够实现case中各个分支的运行,那么到
[测试测量]
LabVIEW<font color='red'>程序设计</font>模式(四)—状态机和事件结构的结合
STM32F103程序设计-9-USB转TTL串口(收发)
在上一个例程USB转TTL串口(printf)的基础上进行修改。主要修改了以下几点内容: 1.由于不要使用printf了,所以把PUTCHAR_PROTOTYPE的定义部分去掉。 2.从官网例程中找到串口收发数据的代码,并融合到新定义的串口收、发数据的函数中。 例程中串口发数据的代码(已进行细微改动): /* Send one byte from USARTy to USARTz */ USART_SendData(USART1, data); /* Loop until USARTy DR register is empty */ while(USART_GetFlagStatus(USART1, USART_FLAG_TX
[单片机]
基于VC的USB接口通信程序设计
   0 引言   随着信息技术的迅速发展,数据采集和处理技术广泛应用于雷达、通信、遥测、遥感等领域。而在早期的计算机系统上通常使用串口或并口来发送数据,每个接口都需要占用计算机内部很多的资源,传统的接口一般采用PCI总线或RS-232串行总线。PCI总线有较高的传输速率,可达132 Mbit/s,也可以即插即用,但是它们的扩充槽有限且插拔不方便;RS-232串行总线连接比较方便,但是传输速率太慢,不易用于高速传送数据和传送大量数据。USB(通用串行总线)集中了PCI和RS-232串行总线的优点,具有方便的即插即用和热插拔特性以及较高的传输速率,因此,将USB技术应用于数据采集是非常合适的,可以达到数据采集系统的高速度处理。目前
[工业控制]
基于VC的USB接口通信<font color='red'>程序设计</font>
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

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

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

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