当前位置:文档之家› MPU6050数据读取I2C程序

MPU6050数据读取I2C程序

MPU6050数据读取I2C程序

//这是在WHILE中运行的部分需要先初始化

//Y轴加速度

y10=(int8)mma7455_read_reg(0x3D);

y11=(int8)mma7455_read_reg(0x3E);

y13=(y10<<8)+y11;

y03=y13-210; //纠正0偏

//X轴角速度

x20=(int8)mma7455_read_reg(0x43);

x21=(int8)mma7455_read_reg(0x44);

基于MSP430的I2C模拟总线程序讲解

程序和流程图: IIC.h void Init_IIC(void); void EEPROM_ByteWrite(unsigned char nAddr,unsigned char nVal); unsigned char EEPROM_RandomRead(unsigned char nAddr); unsigned char EEPROM_CurrentAddressRead(void); void EEPROM_AckPolling(void); void Init_CLK(void); void Init_IIC_Port(void); Main.C /******************************************* IIC for AT24c16 OR AT24CXXX 系列 只要控制好IICRM IICSTP IICSTT 其硬件会自动完成 SCL SDA的一系列时序只要注意各个发送与接收的控制标志位. ******************************************/ #include #include "IIC.h" volatile unsigned char Data[6]; void main(void) { //volatile unsigned char Data[6];

//停止看门狗 WDTCTL = WDTPW+WDTHOLD; //初始化端口 Init_IIC_Port(); //初始化时钟 Init_CLK(); //I2C初始化 Init_IIC(); //置传输方式及控制方式 //打开中断 _EINT(); //写入数据 EEPROM_ByteWrite(0x0000,0x12); //等待写操作完成 EEPROM_AckPolling(); //写入数据 EEPROM_ByteWrite(0x0001,0x34); //等待写操作完成 EEPROM_AckPolling(); //写入数据 EEPROM_ByteWrite(0x0002,0x56); //等待写操作完成

I2C总线读写程序通用

//==========================头文件加载=============================== #include //加载52系列单片机头文件 //===========================端口声明================================ sbit CLK=P3^6; //74hc574时钟信号线 sbit G=P2^4; //74hc574使能 sbit IIC_SDA=P2^6; //声明IIC总线的数据线接在单片机的P2.5端口。 sbit IIC_SCL=P2^5; //声明IIC总线的时钟线接在单片机的P2.7端口。 unsigned char tabl[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x0BF,0x8C}; //0,1,2,3,4,5,6,7,8,9,-,P //===========================函数声明================================ void display(unsigned char aa); void delay(unsigned int t); void delay_IIC(void); void IIC_Init(void); void IIC_start(void); void IIC_stop(void); bit IIC_Tack(void); void IIC_single_byte_write(unsigned char Daddr,unsigned char Waddr,unsigned char Data); unsigned char IIC_single_byte_read(unsigned char Daddr,unsigned char Waddr); void IIC_write_byte(unsigned char Data); unsigned char IIC_read_byte(void); //============================主函数================================= void main() //主函数 { unsigned char Data=2,addr=0x01; //---------------------------系统初始化-------------------------- IIC_Init();//初始化IIC总线。 //P1=0x7f;//LED8先亮。 while(1) //死循环 { IIC_single_byte_write(0xa0,0x02,Data);//保存LED的状态 delay(50000);//延时约0.5S Data=IIC_single_byte_read(0xa0,0x02);//读出LED的状态 if(Data<10) Data++; else

简单的I2C协议理解 i2c程序(调试通过)

简单的I2C协议理解 一. 技术性能: 工作速率有100K和400K两种; 支持多机通讯; 支持多主控模块,但同一时刻只允许有一个主控; 由数据线SDA和时钟SCL构成的串行总线; 每个电路和模块都有唯一的地址; 每个器件可以使用独立电源 二. 基本工作原理: 以启动信号START来掌管总线,以停止信号STOP来释放总线; 每次通讯以START开始,以STOP结束; 启动信号START后紧接着发送一个地址字节,其中7位为被控器件的地址码,一位为读/写控制位R/W,R /W位为0表示由主控向被控器件写数据,R/W为1表示由主控向被控器件读数据; 当被控器件检测到收到的地址与自己的地址相同时,在第9个时钟期间反馈应答信号; 每个数据字节在传送时都是高位(MSB)在前; 写通讯过程: 1. 主控在检测到总线空闲的状况下,首先发送一个START信号掌管总线; 2. 发送一个地址字节(包括7位地址码和一位R/W); 3. 当被控器件检测到主控发送的地址与自己的地址相同时发送一个应答信号(ACK); 4. 主控收到ACK后开始发送第一个数据字节; 5. 被控器收到数据字节后发送一个ACK表示继续传送数据,发送NACK表示传送数据结束; 6. 主控发送完全部数据后,发送一个停止位STOP,结束整个通讯并且释放总线; 读通讯过程: 1. 主控在检测到总线空闲的状况下,首先发送一个START信号掌管总线; 2. 发送一个地址字节(包括7位地址码和一位R/W); 3. 当被控器件检测到主控发送的地址与自己的地址相同时发送一个应答信

号(ACK); 4. 主控收到ACK后释放数据总线,开始接收第一个数据字节; 5. 主控收到数据后发送ACK表示继续传送数据,发送NACK表示传送数据结束; 6. 主控发送完全部数据后,发送一个停止位STOP,结束整个通讯并且释放总线; 四. 总线信号时序分析 1. 总线空闲状态 SDA和SCL两条信号线都处于高电平,即总线上所有的器件都释放总线,两条信号线各自的上拉电阻把电平拉高; 2. 启动信号START 时钟信号SCL保持高电平,数据信号SDA的电平被拉低(即负跳变)。启动信号必须是跳变信号,而且在建立该信号前必修保证总线处于空闲状态; 3. 停止信号STOP 时钟信号SCL保持高电平,数据线被释放,使得SDA返回高电平(即正跳变),停止信号也必须是跳变信号。 4. 数据传送 SCL线呈现高电平期间,SDA线上的电平必须保持稳定,低电平表示0(此时的线电压为地电压),高电平表示1(此时的电压由元器件的VDD决定)。只有在SCL线为低电平期间,SDA上的电平允许变化。 5. 应答信号ACK I2C总线的数据都是以字节(8位)的方式传送的,发送器件每发送一个字节之后,在时钟的第9个脉冲期间释放数据总线,由接收器发送一个ACK(把数据总线的电平拉低)来表示数据成功接收。 6. 无应答信号NACK 在时钟的第9个脉冲期间发送器释放数据总线,接收器不拉低数据总线表示一个NACK,NACK有两种用途: a. 一般表示接收器未成功接收数据字节; b. 当接收器是主控器时,它收到最后一个字节后,应发送一个NACK信号,以通知被控发送器结束数据发送,并释放总线,以便主控接收器发送一个停止信号STOP。 五. 寻址约定

DSP28335 I2C接口应用

DSP I2C 应用说明 1.示例程序中几种状态 第一次看i2c_eeprom示例程序,对程序中的MsgStatus信息状态切换非常懵懂,为什么要有这几个状态?状态切换顺序如何安排?一大堆的状态,让人有些摸不着头脑。先把程 序中的头文件涉及的7种状态分析一下。 // I2C Message Commands for I2CMSG struct #define I2C_MSGSTAT_INACTIVE 0x0000//未激活状态:一般成功发送数据或者//接受数据后可以设置信息状态为此状态,告诉用户可进行下一次的写数据或读数据。 #define I2C_MSGSTAT_SEND_WITHSTOP 0x0010 //发送带停止位数据:这是为写数据而设///的状态,写入地址和数据之后发个停止位告诉存储器数据写入完毕。 #define I2C_MSGSTAT_WRITE_BUSY 0x0011 //写数据忙状态:在将待写的数据放入//缓存后,就可以使能IIC传输数据了,然后把信息状态设为该状态,意在告诉用户:数据//已经在传送过程中。当然是否传送完毕,还需要通过查询SCD位来判断。 #define I2C_MSGSTAT_SEND_NOSTOP 0x0020//发送无停止位数据:这个状态是为了读//取数据而设的,有查阅过AT24C1024EEPROM存储器使用手册的读者知道,在读数据之前//要发送数据的地址,发完地址不能产生停止位,这是存储器硬件设计决定的。设为这个状//态意在告诉读者,可以发送要读取的数据的地址了。 #define I2C_MSGSTAT_SEND_NOSTOP_BUSY 0x0021//发送无停止位数据忙状态:这个状态是//为了读取数据而设的,似于I2C_MSGSTAT_WRITE_BUSY,说明地址数据已经在传送过程中。//传送是否成功,还要看ARDY的状态。 #define I2C_MSGSTAT_RESTART 0x0022//重发开始位状态:这个状态也是为读取////数据而设。我们知道,读取存储器数据主要分两个步骤:第一,发送START位+设备地址//+数据地址+无停止位。第二,再发START位+设备地址,紧接着存储器发送数据到IIC接收//缓存器(I2CDRR),接收到设定好的数据数量(I2CCNT值)时输出停止位STOP. //值得注意的是:理论上写完数据就能马上读取数据,但事实上EEPROM存储器仍需要一////定延时来存储数据,约有2ms左右。通过示波器可以观察到,写完数据后,并不能马上//成功读取数据,也就是说读数据的第一步骤要重复好几次(总线为50K时,大约要重复//8次)才能成功。 #define I2C_MSGSTAT_READ_BUSY 0x0023//读取数据忙状态:这个状态是为读取数//据而设。在读数据的第二步骤中,发完START位+设备地址后,就设为这一状态。意在说//明IIC开始等待接收固定数量(I2CCNT值)的数据。可以通过查询ARDY位判断。 //头文件中的其他定义应该没什么大问题了! 2.AT24C1024 EEPROM读写数据格式 1 0 1 0 0 A1 P0 R/W

I2C模拟程序

2.1 虚拟I2C总线汇编程序软件包 2.1.1 概述 为了非常方便地对I2C从器件进行快速的、正确的读写操作,我们为此而设计出虚拟I2C总线操作平台软件包。本软件包是主方式下的虚拟I2C总线软件包,只要用户给子程序提供几个主要的参数,即可轻松地完成任何I2C总线外围器件的应用程序设计。 2.1.2I2C串行总线 I2C总线是PHILIPS公司推出的芯片间串行数据传输总线,2根线(SDA、SCL)即可实现完善的全双工同步数据传送,能够十分方便地地构成多机系统和外围器件扩展系统。I2C器件是把I2C的协议植入器件的I/O接口,使用时器件直接挂到I2C总线上,这一特点给用户在设计应用系统带来了极大的便利。I2C器件无须片选信号,是否选中是由主器件发出的I2C从地址决定的,而I2C器件的从地址是由I2C总线委员会实行统一发配。我们推出的I2C总线的操作平台软件包,只要你给出器件从地址[,子地址(注:PCF8574无子地址)],即可进行字节读,字节写,多字节读,多字节写,能够非常方便地使用I2C器件,无须你介入底层的I2C操作协议。 2.1.3汇编软件包说明 此软件包是用在单主I2C总线上,硬件接口是SDA,SCL,使用MCU的I/O口来模拟SDA/SCL总线。设计有/无子地址的子程序是根据I2C器件的特点,目的在于将地址和数据彻底分开。软件包的接口界面为:IRDBYTE (无子地址)读单字节数据(现行地址读) IWRBYTE (无子地址)写单字节数据(现行地址写) IRDNBYTE (有子地址)读N字节数据 IWRNBYTE (有子地址)写N字节数据 说明:现行地址读/写即专指无子地址的器件,不给定子地址的读/写操作。 ;平台占用内部资源:R0,R1,R2,R3,ACC,Cy。 ;使用前须定义变量:SLA 器件从地址,SUBA器件子地址,NUMBYTE读/写的字节数,位变量ACK ;使用前须定义常量:SDA 、SCL 总线位,MTD 发送数据缓冲区首址,MRD 接收数据缓冲区首址;(※子程序出口参数ACK为0时表示从器件无应答) 2.1.4软件包清单 ;-------------------------------------------------------------------------------------------------------- ;VI2C_ASM.ASM ;I2C 软件包的底层子程序,使用前要定义好SCL和SDA。在标准80C51模式 ;(12 Clock)下,对主频要求是不高于12MHz(1个机器周期1us);若Fosc>12MHz ;则要增加相应的NOP指令数。在使用本软件包时,请在你的程序的未尾加入 ;$INCLUDE (VI2C_ASM.ASM)即可。 ;-------------------------------------------------------------------------------------------------------- ;启动I2C总线子程序 START: SETB SDA

DSP2808中i2c实例分析

注意:本例分析基于DSP2808中的i2c_eeprom示例程序和AT24C1024 EEPROM存储器。当然,在学IIC之前要了解一下IIC工作流程,知道AT24C1024存储芯片的使用方法。 现在按以下4部分来介绍这个示例。 1.示例程序中几种状态说明 第一次看i2c_eeprom示例程序,对程序中的MsgStatus信息状态切换非常懵懂,为什么要有这几个状态?状态切换顺序如何安排?一大堆的状态,让人有些摸不着头脑。先把程 序中的头文件涉及的7种状态分析一下。 // I2C Message Commands for I2CMSG struct #define I2C_MSGSTAT_INACTIVE 0x0000 //未激活状态:一般成功发送数据或者//接受数据后可以设置信息状态为此状态,告诉用户可进行下一次的写数据或读数据。 #define I2C_MSGSTAT_SEND_WITHSTOP 0x0010 //发送带停止位数据:这是为写数据而设///的状态,写入地址和数据之后发个停止位告诉存储器数据写入完毕。 #define I2C_MSGSTAT_WRITE_BUSY 0x0011 //写数据忙状态:在将待写的数据放入//缓存后,就可以使能IIC传输数据了,然后把信息状态设为该状态,意在告诉用户:数据//已经在传送过程中。当然是否传送完毕,还需要通过查询SCD位来判断。 #define I2C_MSGSTAT_SEND_NOSTOP 0x0020//发送无停止位数据:这个状态是为了读//取数据而设的,有查阅过AT24C1024EEPROM存储器使用手册的读者知道,在读数据之前//要发送数据的地址,发完地址不能产生停止位,这是存储器硬件设计决定的。设为这个状//态意在告诉读者,可以发送要读取的数据的地址了。 #define I2C_MSGSTAT_SEND_NOSTOP_BUSY 0x0021//发送无停止位数据忙状态:这个状态是//为了读取数据而设的,似于I2C_MSGSTAT_WRITE_BUSY,说明地址数据已经在传送过程中。//传送是否成功,还要看ARDY的状态。 #define I2C_MSGSTAT_RESTART 0x0022//重发开始位状态:这个状态也是为读取////数据而设。我们知道,读取存储器数据主要分两个步骤:第一,发送START位+设备地址//+数据地址+无停止位。第二,再发START位+设备地址,紧接着存储器发送数据到IIC接收//缓存器(I2CDRR),接收到设定好的数据数量(I2CCNT值)时输出停止位STOP. //值得注意的是:理论上写完数据就能马上读取数据,但事实上EEPROM存储器仍需要一////定延时来存储数据,约有2ms左右。通过示波器可以观察到,写完数据后,并不能马上//成功读取数据,也就是说读数据的第一步骤要重复好几次(总线为50K时,大约要重复//8次)才能成功。 #define I2C_MSGSTAT_READ_BUSY 0x0023//读取数据忙状态:这个状态是为读取数//据而设。在读数据的第二步骤中,发完START位+设备地址后,就设为这一状态。意在说//明IIC开始等待接收固定数量(I2CCNT值)的数据。可以通过查询ARDY位判断。 //头文件中的其他定义应该没什么大问题了! 2.AT24C1024 EEPROM读写数据格式

i2c通讯协议及程序

I2C通信协议简介 (2013-01-17 10:48:03) 转载▼ 分类:通讯协议 标签: 杂谈 ACK是acknowledge的意思,确认. 摒弃复杂的情况,这里只对I2C做简单的介绍。 一、I2C 总线的一些特征: ? 只要求两条总线线路一条串行数据线SDA一条串行时钟线SCL ? 每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机从机关系软件设定地址主机可以作为主机发送器或主机接收器? 它是一个真正的多主机总线如果两个或更多主机同时初始化数据传输可以通过冲突检测和仲裁防止数据被破坏 ? 串行的8 位双向数据传输位速率在标准模式下可达100kbit/s 快速模式下可达400kbit/s 高速模式下可达3.4Mbit/s ? 片上的滤波器可以滤去总线数据线上的毛刺波保证数据完整 ? 连接到相同总线的IC 数量只受到总线的最大电容400pF 限制 二、I2C总线在传送数据过程中共有三种类型信号:开始信号、结束信号和应答信号。 开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。 结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。 应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据 起始和结束:

bool I2C_Start(void) { SDA_H; SCL_H; I2C_delay(); if(!SDA_read)return FALSE; // SDA线为低电平则总线忙,退出 SDA_L; // 拉低SDA线(当SCL为高电平时,SDA由高电平向低电平跳变表示开始信号) I2C_delay(); if(SDA_read) return FALSE; // SDA线为高电平则总线出错,退出 SDA_L; //数据为准备好时,拉低SCL线 I2C_delay(); return TRUE; } 发出开始信号之后,设备在数据未准备好时,拉低SCL线,这样主设备可知从设备未发送数据,从设备在数据准备好,可以发送的时候,停止拉低SCL线,这时候才开始真正的数据传输 void I2C_Stop(void) { SCL_L; I2C_delay(); SDA_L; I2C_delay(); SCL_H; // SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据 I2C_delay(); SDA_H; I2C_delay(); }

I2C总线协议程序

C程序代码]I2C总线协议程序 程序代码 2009-10-11 14:05 阅读48 评论0 /**************************************************************** I2C总线协议程序 ****************************************************************/ #define NOP {_nop_();_nop_();_nop_();_nop_();} sbit SDA=P1^2; /*模拟I2C数据传送位*/ sbit SCL=P1^3; /*模拟I2C时钟控制位*/ bit ack; /*应答标志位*/ void Start_I2c() { SDA=1; NOP; SCL=1; NOP; SDA=0; NOP; SCL=0; NOP; } void Stop_I2c() { SDA=0; NOP;

SCL=1; NOP; SDA=1; NOP; } void Senduchar(uchar c) { uchar i; for(i=0;i<8;i++) { c<<=1; SDA=CY; NOP; SCL=1; NOP; SCL=0; NOP; } SDA=1; NOP; SCL=1; NOP; if(SDA==1) ack=0; else ack=1; SCL=0; NOP; } uchar Rcvuchar() {

uchar i,x=0; SDA=1; for(i=0;i<8;i++) { SCL=0; NOP; SCL=1; NOP; x=x<<1; if(SDA) x=x+1; NOP; } SCL=0; NOP; return(x); } void Ack_I2c(bit a) { SDA=a; NOP; SCL=1; NOP; SCL=0; NOP; } bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no) { uchar i;

I2C通信原理及程序详细讲解

I2C 通信: 起始条件:SCL为高电平,SDA电平从高变低,这一变化即完成了通信的起始条件。 起始条件和数据通信间,通常会有延时要求具体的指标见设备说明。 数据传输阶段:一字节需要9个时钟周期;且每一位需要一个时钟周期;如上图所示,ADDRESS为目标设备的地址,R/ w为通信的的方向位;"1"时表示读,即后续的数据由目标设备发出,主机进行接收;"0"时表示写,即后续的数据由主机发出目标设备进行接收。 当ACK信号为"0"时,说明接收成功;为"1"时,说明接收失败。 每个字节的传输都是由高位(MSB)到低位(LSB)依次进行传输。 在数据通信过程中,总是由数据接收方发出ACK信号。 终止阶段:当主机完成数据通信,并终止本次传输时会发出终止信号。当SCL 是高电平时,SDA电平由低变高,这个变化意味着传输终止。注:每个时钟周期的高电平期间,SDA的数据状态达到稳定。

下面给出了模拟I2C总线进行读写的伪代码,用以说明如何使用GPIO 实现I2C通信: int i2c_start() /* I2C起始条件*/ { //初始化GPIO口 set_gpio_direction(SDA, OUTP); //设置SDA方向为输出 set_gpio_direction (SCL, OUTP); //设置SCL方向为输出 set_gpio_value(SDA, 1); //设置SDA为高电平 set_gpio_value(SCL, 1); //设置SCL为高电平 delay(); //延时 //起始条件 set_gpio_value(SDA, 0); //SCL为高电平时,SDA由高变低delay(); //适当延时 } void i2c_stop() /* I2C终止条件*/ { set_gpio_value(SCL, 1); set_gpio_direction(SDA, OUTP); set_gpio_value(SDA, 0); delay(); set_gpio_value(SDA, 1); //SCL高电平时,SDA由低变高 } /* I2C读取ACK信号(写数据时使用)返回值:0表示ACK信号有效;非0表示ACK信号无效*/ unsigned char i2c_read_ack() { unsigned char r; set_gpio_direction(SDA, INP); //设置SDA方向为输入

51单片机I2C标准函数程序

51单片机I2C标准函数程序 #include #include #include typedef unsigned char uchar; typedef unsigned int uint; sbit SDA=P1^1; sbit SCL=P1^0; //===================================================== ========================= void Start()//开始信号 { SDA=1; SCL=1; _nop_(); _nop_(); SDA=0; _nop_(); _nop_(); SCL=0; } /************************************************************ ******************/ void Stop() //停止信号 { SDA=0; SCL=1; _nop_(); _nop_(); SDA=1; _nop_(); _nop_(); SDA=0; SCL=0; } /************************************************************ ******************/ void Ack()//应答信号

{ SDA=0; SCL=1; _nop_(); _nop_(); SCL=0; SDA=1; } /************************************************************ ******************/ void NoAck() //非应答信号 { SDA=1; SCL=1; _nop_(); _nop_(); SCL=0; SDA=0; } /************************************************************ ******************/ bit TestACk()//检查应答信号 { bit Cack=0; SDA=1; SCL=1; Cack=SDA; SCL=0; return(Cack); } /************************************************************ ******************/ void WriteByte(uchar input)//向I2C从设备中写入1字节 { uchar i; for(i=8;i!=0;i--) { SDA=(bit)(inupt&0x80); SCL=1; _nop_(); _nop_();

51单片机i2c协议示例程序

#include #include #define uint unsigned int #define uchar unsigned char sbit sda=P3^5; sbit scl=P3^4; void start_bit(); void stop_bit(); void slave_ack(); void no_ack(); void write_byte(uchar dat); uchar read_byte(); void write_date(uchar addr,uchar date); uchar read_date(uchar addr); void delay(uint x); void main() { uchar num; write_date(0x01,0xaa); delay(2); num=read_date(0x01); P0=num; while(1); } void start_bit() //开始位 { scl=1; _nop_(); sda=1; _nop_(); sda=0; _nop_(); scl=0; } void stop_bit() //停止位

{ sda=0; _nop_(); scl=1; _nop_(); sda=1; } void slave_ack() //应答信号 { _nop_(); _nop_(); scl=0; _nop_();; sda=1; _nop_(); _nop_(); scl=1; _nop_(); _nop_(); while(sda); //P0=0xfe; scl=0; } void no_ack() //无应答 { sda=1; _nop_(); scl=1; _nop_(); scl=0; } void write_byte(uchar dat) //写一个字节{ uchar i; scl=0; for(i=0;i<8;i++) { if(dat&0x80) sda=1; else sda=0;

MSP430的I2C程序

#include"MSP430G2553.h" #define TX_STATE 0 /*I2C发送状态*/ #define RX_STATE 1 /*I2C接收状态*/ //-----对SMCLK分频产生I2C通信波特率----- #define I2C_BAUDRATE_DIV 14 /*I2C波特率控制*/ #define SLA VE_ADDR 0x20 /*从机TCA6416A的地址*/ static unsigned char TxByteCnt=0; //剩余发送数据 static unsigned char RxByteCnt=0; //剩余接收数据 static unsigned char *pTxData; // 待发送TX 数据的指针 static unsigned char *pRxData; // Rx接收存放数据的指针 unsigned char I2C_State = 0; //收发状态指示变量 /****************************************************************************** ************************ * 名称:USCI_I2C_Init() * 功能:初始化USCI_B0模块为I2C模式 * 入口参数:无 * 出口参数:无 * 说明:I2C设为3线制主机状态,暂不使能Tx和Rx中断 * 范例:无 ******************************************************************************* ***********************/ void USCI_I2C_Init() { _disable_interrupts(); P1SEL |= BIT6 + BIT7; // GPIO 配置为USCI_B0功能P1SEL2|= BIT6 + BIT7; // GPIO 配置为USCI_B0功能 UCB0CTL1 |= UCSWRST; // 软件复位状态 UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; // 同步通信I2C主机状态 UCB0CTL1 = UCSSEL_2 + UCSWRST; // 使用SMCLK,软件复位状态 UCB0BR0 =I2C_BAUDRA TE_DIV ; // 除了分频系数,实际波特率还与SMCLK有关

PIC单片机的I2C应用程序1.

PIC单片机的I2C应用程序1 ; File: an734.asm; data: feb.23.2001; Functionality:;; This code implements the basic functions for an I2C slave device; using the SSP module. All I2C functions are handled in an ISR.; Bytes written to the slave are stored in a buffer. After a number; of bytes have been written, the master device can then read the; bytes back from the buffer.;; Variables and Constants used in the program:;; The st ; File: an734.asm ; data: feb.23.2001 ; Functionality: ; ; This code implements the basic functions for an I2C slave device ; using the SSP module. All I2C functions are handled in an ISR. ; Bytes written to the slave are stored in a buffer. After a number ; of bytes have been written, the master device can then read the ; bytes back from the buffer. ; ; Variables and Constants used in the program: ; ; The start address for the receive buffer is stored in the variable ; 'RXBuffer'. The length of the buffer is denoted by the constant ; value 'RX_BUF_LEN'. The current buffer index is stored in the ; variable 'Index'. ; ;-------------------------------------------------------------------- ; ; The following files should be included in the MPLAB project: ; ; an734.asm-- Main source code file ; ; 16f872.lkr-- Linker script file ; (change this file for the device ; you are using) ;--------------------------------------------------------------------- #include ; Change to device that you are using. ;--------------------------------------------------------------------- ;Constant Definitions ;--------------------------------------------------------------------

模拟I2C从机程序

SCL BIT P1.0 SDA BIT P1.1 ;---------------------------- ORG 0 RESET: SETB SCL SETB SDA CALL I2C_WAITSTART ;等待起始信号 CALL I2C_RXBYTE ;接收地址数据 CLR C CALL I2C_TXACK ;回应ACK SETB C ;读/写 IDATA[80H - FFH] RRC A ;读/写位->C MOV R0,A ;地址送入R0 JC READDATA ;C=1(读) C=0(写) WRITEDATA: CALL I2C_RXBYTE ;接收数据 MOV @R0,A ;写入IDATA INC R0 ;地址+1 CLR C CALL I2C_TXACK ;回应ACK CALL I2C_WAITSTOP ;等待停止信号 JMP RESET READDATA: MOV A,@R0 INC R0 CALL I2C_TXBYTE ;发送IDATA数据 CALL I2C_RXACK ;接收ACK CALL I2C_WAITSTOP ;等待停止信号 JMP RESET ;---------------------------- ;等待起始信号 ;---------------------------- I2C_WAITSTART: JNB SCL,$ ;等待时钟->高 JB SDA,$ ;等待数据线下降沿 JB SCL,$ ;等待时钟->低 RET ;---------------------------- ;等待结束信号 ;---------------------------- I2C_WAITSTOP: JNB SCL,$ ;等待时钟->高 JNB SDA,$ ;等待数据线上升沿 RET ;---------------------------- ;发送ACK/NAK信号 ;---------------------------- 第 1 页

I2C程序(AT24C1024)测试通过的

#include #include #define uchar unsigned char #define uint unsigned int sbit SCL=P0^0; //定义端口 sbit SDA=P0^1; //********************************************* //启动IIC总线程序 //********************************************* void start(void) { SDA=1; //发送起始条件数据信号_nop_(); SCL=1; //发送起始条件的时钟信号_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); //发送起始信号 SDA=0; _nop_(); _nop_(); _nop_(); _nop_(); SCL=0; _nop_(); } //********************************************* //停止IIC总线程序 //********************************************* void stop(void) { //发送停止条件的数据信号SDA=0; _nop_(); _nop_(); SCL=1; //发送停止条件的时钟信号_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); SDA=1; //发送I2C总线停止信号 _nop_(); _nop_();

_nop_(); _nop_(); } //********************************************* //从机接收一位数据应答0 //********************************************* void ACK(void) { SDA=0; _nop_(); _nop_(); _nop_(); SCL=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); SCL=0; _nop_(); _nop_(); _nop_(); SDA=1; _nop_(); } //********************************************* //从机接收到最后一位数据应答1 //********************************************* void NoACK(void) { SDA=1; _nop_(); _nop_(); _nop_(); SCL=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); SCL=0; _nop_();

(完整word版)24C02I2C驱动程序(详细全)

/*---------------------------------------24C02.h-----------------------------------*/ #ifndef _24C02_H #define _24C02_H /* Includes ----------------------------------------------------------------*/ #include "STC15F2K60S2.h" #include "stdbool.h" /* Define ------------------------------------------------------------------*/ #define WC24C02 0xa0 //器件地址写 #define RC24C02 0xa1 //器件地址读 #define MAXSIZE24C02 256 //AT24C02最多256个字节2K bits 32页 #define I2C_PAGESIZE 8 //AT24C02每页有8个字节 #define delayNOP() _nop_();_nop_();_nop_();_nop_() //延时 sbit SDA = P2^5; //定义数据线 sbit SCL = P2^6; //定义时钟线 /* Private ------------------------------------------------------------------*/ /* Public -------------------------------------------------------------------*/ uint idata ucSendBuffer[8]={0x01,0x02,0x04,0x08, 0x10,0x20,0x40,0x80}; uint idata ucReceData; uint idata ucReceiveBuffer[8]; //从器件中读出的多字节数据暂存区 /* Function Declaration -----------------------------------------------------*/ bool I2CStart(void); //启动I2C void I2CStop(void); //停止I2C void I2CAck(void); //应答信号 void I2CNoAck(void); //发送非应答信号 bool I2CWaitAck(void); //检测应答位 void I2CSendByte(u8 demand);

相关主题
相关文档 最新文档