下载
加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 I2C 24LC02 C读写例程(PIC单片机) - Read

I2C 24LC02 C读写例程(PIC单片机) - Read.doc

I2C 24LC02 C读写例程(PIC单片机) - Read

NARUTO-Lee君
2017-11-20 0人阅读 举报 0 0 暂无简介

简介:本文档为《I2C 24LC02 C读写例程(PIC单片机) - Readdoc》,可适用于IT/计算机领域

ICLCC读写例程(PIC单片机)ReadICLCC读写例程(PIC单片机)IC总线特点IC总线最主要的优点是其简单性和有效性。由于接口直接在组件之上因此IC总线占用的空间非常小减少了电路板的空间和芯片管脚的数量降低了互联成本。总线的长度可高达英尺并且能够以Kbps的最大传输速率支持个组件。IC总线的另一个优点是它支持其中任何能够进行发送和接收的设备都可以成为主总线。一个主控多主控(multimastering)能够控制信号的传输和时钟频率。当然在任何时间点上只能有一个主控。IC总线工作原理IC总线上的数据稳定规则SCL为高电平时SDA上的数据保持稳定SCL为低电平时允许SDA变化。如果SCL处于高电平时SDA上产生下降沿则认为是起始位SDA上的上升沿认为是停止位。通信速率分为常规模式(时钟频率kHz)和快速模式(时钟频率kHz)。同一总线上可以连接多个带有IC接口的器件每个器件都有一个唯一的地址既可以是单接收的器件也可以是能够接收发送的器件。每次数据传输都是以一个起始位开始而以停止位结束。传输的字节数没有限制。最高有效位将首先被传输接收方收到第位数据后会发出应答位。数据传输通常分为两种:主设备发送从设备接收和从设备发送主设备接收。这两种模式都需要主机发送起始位和停止位应答位由接收方产生。从设备地址一般是或个字节用于区分连接在同一IC上的不同器件。IC总线在传送数据过程中共有三种类型信号它们分别是:开始信号、结束信号和应答信号。开始信号:SCL为高电平时SDA由高电平向低电平跳变开始传送数据。结束信号:SCL为低电平时SDA由低电平向高电平跳变结束传送数据。应答信号:接收数据的IC在接收到bit数据后向发送数据的IC发出特定的低电平脉冲表示已收到数据。CPU向受控单元发出一个信号后等待受控单元发出一个应答信号CPU接收到应答信号后根据实际情况作出是否继续传递信号的判断。若未收到应答信号由判断为受控单元出现故障。在IC总线中只有主发送和主接收两种操作方式。在系统初始化时由指令控制CPU送出相关的数据经接口送到IC寄存器内。通过初始化这些寄存器可以实现IC总线的主模式控制以及实现IC总线上的从设备读写。当主设备和其中的一个从设备交换数据时主设备首先发出一个启动Start信号这个信号被所有的从设备接收。即从设备准备接收CPU的信号然后主设备再发出它要通信的从设备地址。接下来所有的从设备将收到的这个地址和它们自己的地址进行比较。如果收到的地址和它们自己的地址不同则什么都不做只是等待主设备发出停止stop信号如果收到的地址和它自己的地址相同它就发出一个信号给主设备这个信号称为应答Acknowledge信号。当主设备收到应答信号后它就开始向从设备发送数据或者从从设备接收数据。当所有操作都进行完毕时主设备发出一个Stop信号通信完毕释放IC总线然后所有的从设备都等待下一次Start信号的到来。总线基本操作IC规程运用主从双向通讯。器件发送数据到总线上则定义为发送器器件接收数据则定义为接收器。主器件和从器件都可以工作于接收和发送状态。总线必须由主器件(通常为微控制器)控制主器件产生串行时钟(SCL)控制总线的传输方向并产生起始和停止条件。SDA线上的数据状态仅在SCL为低电平的期间才能改变SCL为高电平的期间SDA状态的改变被用来表示起始和停止条件。控制字节在起始条件之后必须是器件的控制字节其中高四位为器件类型识别符(不同的芯片类型有不同的定义EEPROM一般应为)接着三位为片选最后一位为读写位当为时为读操作为时为写操作。(写过程()上电后等待一个延时(ms)。()器件寻址给一个起始信号(SCL为高电平时SDA给一个下降沿)。发送从器件地址高位为然后根据AA(如果和器件的地址相同则那个器件会应答)进行读写控制(O为读)。()应答器件在SCL的第个周期时SDA给出一个低电平作为应答信号。()开始写有两种模式:字节写模式和页写模式。字节模式:给出A,A应答给出A,A应答然后给出DATA和停止信号(SCL为高电平时SDA给出一个上升沿)接着要等待一个擦写时间。页写模式:给出地址以后连续给出个数据。如果多于个数据则地址计数器自动翻转。(如果少于昵估计是没有问题的但是需要实验验证。)()判断擦写操作是否完毕的一个方法(应答查询)如果器件还处于擦写状态则不会应答器件寻址如果有应答则说明擦写完毕。(读过程()上电以后等待一个延时(lms)。()器件寻址。()应答。()开始读有三种模式:立即当前地址读、选择随机读、连续读。立即当前地址读:如果上次读写的操作地址为N则现在是N。不需要ACK但是需要Stop信号。选择随机读:先伪写(用于给出一个地址)然后再次启动读取数据。连续读:读取一个以后给一个应答这样器件会再给出下一个地址的数据内容。()开始数据传输Start后、停止数据传输Stop前SCL高电平期间SDA上为有效数据。*******************************************************************一、程序说明:,LC器件地址是RW,数组写入LC采取页写方式,数组code从LC读出时采取自由读方式,采用M晶体。采用软件IC。二、硬件连接:n(当然你可以任意选择脚位)SDA>pi,SCL>Pin(当然你可以任意选择脚位)PORTD>外接个LED显示读出的数据在这里读出的刚好是一个闪动的流水灯状态。*******************************************************************,include"pich"#defineucharunsignedchar#definenop()asm("nop"#defineSCLTRISC#defineSDATRISCvoidstartic()voidstopic()voidsendbyte(ucharc)ucharreceivebyte()voidIsendstr(ucharsla,ucharsuba,uchar*s,ucharno)voiddelayms()voidicerror()ucharcode={x,x,x,x,xf,xf,xf,xf,xff}ucharno,ack,c,datavoidmain(void){uchariTRISC=XffC口设为输入RC为SCL线RC为SDA线。PORTC=XTRISD=XD口为输出显示ICLC中读出的内容PORTD=X初始显示全亮Isendstr(xa,x,code,)页写入code数组到LC,器件地址为Xa,子地址为X共个数。delayms()开始读出到D口进行显示,根据Randomread时序图。while(){for(i=xi<xi){startic()sendbyte(xa)发送器件地址即DEVICEADDRESS。if(ack==)icerror()如果LC无应答。则进入ICERROR错误指示。sendbyte(i)发送字地址即WORDADDRESS。D口显示数组。if(ack==)icerror()startic()重新启动总线。sendbyte(xa)发送读命令和器件地址DEVICEADDRESS。if(ack==)icerror()data=receivebyte()stopic()PORTD=datadelayms()}}}*******************************************************************起动总线函数函数原型:voidstartic()Function:startontheICbus*******************************************************************voidstartic(){SDA=发送启始条件的数据信号nop()SCL=nop()nop()nop()nop()nop()LC要求建立时间大于SSDA=发送起始信号nop()nop()nop()nop()nop()SCL=钳住IC总线准备发送数据或接收数据nop()nop()}*******************************************************************停止总线函数函数原型:voidstopic()Function:stoptheICbus*******************************************************************voidstopic(){SDA=发送结束条件的数据信号nop()SCL=nop()nop()nop()nop()nop()SDA=nop()nop()nop()nop()}*=================================================================字节数据传送函数函数原型:voidsendbyte(ucharc)Function:将数据C发送出去可以是地址也可以是数据发完后等待回应并对此状态位进行操作(不应答或非应答都使ack=)发送数据正常ack=ack=表示被控器无应答或损坏。==================================================================*voidsendbyte(ucharc){ucharbitcountfor(bitcount=bitcount<bitcount){if((c<<bitcount)x){SDA=}else{SDA=}nop()SCL=nop()nop()nop()nop()nop()SCL=}nop()nop()SDA=nop()nop()SCL=nop()nop()nop()if(RC==)ack=elseack=用ASK=为有应答信号SCL=nop()nop()}*==================================================================字节数据接收函数函数原型:ucharreceivebyte()FUNCTION:用来接收从器件传来的数据并判断总线错误(不发应答信号)发完后请用应答函数。===================================================================*ucharreceivebyte(){ucharretc,bitcountretc=SDA=for(bitcount=bitcount<bitcount){nop()SCL=nop()nop()nop()nop()nop()SCL=nop()nop()retc=retc<<if(RC==)retc=retcnop()nop()}SCL=nop()nop()return(retc)}*================================================================向有子地址器件发送多字节数据函数函数原型:bitIsendstr(ucharsla,ucharsuba,uchar*s,ucharno)Function:从启动总线到发送地址数据结束总线的全过程从器件地址sla。如果返回表示操作成功否则操作有误。=================================================================*voidIsendstr(ucharsla,ucharsuba,uchar*s,ucharno){ucharistartic()sendbyte(sla)if(ack==)icerror()sendbyte(suba)if(ack==)icerror()for(i=i<noi){sendbyte(*s)if(ack==)icerror()s}stopic()return()}*****************************************************************延时函数函数原型:voiddelayms()FUNCTION:延明ms*****************************************************************voiddelayms(){unsignedintd=while(d)}*****************************************************************总线错误函数函数原型:voidicerror()Function:通过RD闪动次表示总线操作失败一次报警。*****************************************************************voidicerror(){ucharifor(i=i<i){RD=delayms()RD=delayms()}}**********END**************

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/11

I2C 24LC02 C读写例程(PIC单片机) - Read

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利