I2C总线学习--实例代码

发布者:和谐共存最新更新时间:2017-01-17 来源: eefocus关键字:I2C总线  实例代码 手机看文章 扫描二维码
随时随地手机看文章

以三轴加速度传感器MMA7660为例:

#define MMA7660_SDA   GPIO_Pin_10  // PC10 //IIC数据线接口

#define MMA7660_SCL   GPIO_Pin_15  // PA15 //IIC时钟线接口

#define MMA7660_INT   GPIO_Pin_14  // PA14 

  1 /*

  2  *=========================================================

  3  * 函数功能:IIC总线初始化信号

  4  * 参数:无

  5  * 函数返回值:无 

  6  * SDA    ---

  7  *           |________

  8  * SCL ----------

  9  *               |____  

 10  *=========================================================   

 11  */

 12 void I2C_Start(void)

 13 {

 14   MMA7660_SCL_H;

 15   MMA7660_SDA_H;

 16   Delayus(1);

 17   MMA7660_SDA_L;

 18   Delayus(1);  

 19 } 

 20 

 21 /*

 22  *=========================================================

 23  * 函数功能:IIC总线停止信号

 24  * 参数:无

 25  * 函数返回值:无 

 26  * SDA        ---------

 27  *      ______|

 28  * SCL   ---------

 29  *                |___

 30  *=========================================================   

 31  */

 32 void I2C_Stop(void)

 33 {

 34   MMA7660_SCL_H;

 35   MMA7660_SDA_L;

 36   Delayus(1);

 37   MMA7660_SDA_H;

 38   Delayus(1);

 39 }

 40 /*

 41  *=========================================================

 42  * 函数功能:接收由从机向主机发起的ACK信号。

 43  * 参数:     ACKBIT

 44  *          

 45  * 函数返回值:MMA_ERROR/MMA_OK   

 46  *=========================================================   

 47  */

 48 unsigned char I2C_SlaveAck(void)

 49 {

 50   unsigned char ts=0;

 51   MMA7660_SCL_L;

 52   MMA7660_SDA_H;

 53   

 54   MMA_SDA_IOIN();                    //SDA设为输入

 55   Delayus(1);

 56   MMA7660_SCL_H;

 57   

 58   while(MMA7660_SDA_D!=0)

 59   {

 60       ts++;

 61     if(ts>200)

 62     {

 63         MMA_SDA_IOOUT();            //SDA设为输出

 64         MMA7660_SCL_L;

 65         return MMA_ERROR;            //返回错误    

 66     }

 67   }

 68   MMA7660_SCL_L;

 69   MMA_SDA_IOOUT();                    //SDA设为输出

 70   //MMA7660_SDA_H;

 71   Delayus(1);

 72   return MMA_OK;                    //返回错误      

 73 }

 74 

 75 /*

 76  *=========================================================

 77  * 函数功能:IIC写一个字节数据

 78  * 参数:      a:需要写入的一个字节数据

 79  * 函数返回值:无

 80  *=========================================================   

 81  */

 82 void I2C_WriteByte(unsigned char a) 

 83 {

 84     unsigned char i; 

 85     for(i=0; i<8; i++)

 86     {          

 87         MMA7660_SCL_L;

 88         if((a&0x80)!=0) MMA7660_SDA_H;

 89         else MMA7660_SDA_L;

 90         a <<= 1;

 91         Delayus(1);

 92         MMA7660_SCL_H;

 93         Delayus(1);

 94     }   

 95    MMA7660_SCL_L;  

 96    if(I2C_SlaveAck()==MMA_ERROR)        //等待从机的ACK信号。

 97    {

 98    return ;

 99    }

100 }

101 

102 /*

103  *=========================================================

104  * 函数功能:IIC读一个字节数据

105  * 参数:无

106  * 函数返回值:返回读出的一个字节数据

107  *=========================================================   

108  */

109 unsigned char I2C_ReadByte(void)

110 {

111     unsigned char a =0;

112     unsigned char i;

113     MMA_SDA_IOIN();                    //SDA设为输入    

114     for(i=0; i<8; i++)

115     {

116          a <<= 1;  

117         MMA7660_SCL_H;

118         Delayus(1);

119         if(MMA7660_SDA_D==1) a |= 0x01;

120         Delayus(1);

121         MMA7660_SCL_L;

122           Delayus(2);       

123     }

124     return a;

125 }

126 

127 /*

128  **********************************************************

129  *

130  * MMA7660相关函数

131  *

132  **********************************************************

133  */

134 /*

135  *=========================================================

136  * 函数功能:写MAA7660寄存器

137  * 参数:     

138  *       Regs_Addr - 寄存器地址

139  *       Regs_Data - 寄存器值

140  * 函数返回值:

141  *=========================================================   

142  */

143 void MMA7660_WriteReg(unsigned char Regs_Addr,unsigned char Regs_Data) 

144 {  

145    I2C_Start();

146    I2C_WriteByte(MMA7660_DEV_WRITE);     //先写Slave地址,并配置成写模式

147    I2C_WriteByte(Regs_Addr);            //写寄存器地址

148    I2C_WriteByte(Regs_Data);            //写寄存器内容

149    I2C_Stop();                          //结束本段IIC进程

150 }

151 

152 /*

153  *=========================================================

154  * 函数功能:读MAA7660单字节

155  * 参数

156  *       Regs_Addr - 寄存器地址

157  * 函数返回值:寄存器值

158  *=========================================================   

159  */

160 unsigned char MMA7660_ReadReg(unsigned char Regs_Addr) 

161 {

162    unsigned char ret;

163    

164    I2C_Start();

165    

166    I2C_WriteByte(MMA7660_DEV_WRITE);     //先写Slave地址,并配置成写模式

167    I2C_WriteByte(Regs_Addr);            //写寄存器地址

168    

169    I2C_Start();

170    I2C_WriteByte(MMA7660_DEV_READ);      //写Slave地址,并配置成读模式

171    ret=I2C_ReadByte();                    //从传感器中读出数据

172    I2C_SlaveAck();

173    I2C_Stop();                          //结束本段IIC进程 

174    

175    return ret;

176 

177 } 



关键字:I2C总线  实例代码 引用地址:I2C总线学习--实例代码

上一篇:单片机超声波测距模块学习笔记_发射端学习
下一篇:I2C总线学习(四)--读写过程

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

I2C总线键盘电路以及驱动程序设计
一、概述   本文介绍一种采用MAX7348 的串行I2C 总线的键盘电路以及驱动程序的设计。   I2C 需要连线少,仅需一条串行时钟线和一条串行数据线。允许多主机控制,具有裁决和同步功能,可随意添加或摘除总线上的子器件等诸多优点,所以已经被广泛应用。   二、MAX7348   MAX7348 是美国MAXIM 公司生产的2 线接口、低EMI 键盘开关和发声控制器,可监控多达40 个按键,可对按键去抖并保存在FIFO 中,去抖时间用户可在9 ~ 40ms 之间任意设置,MAX7348 自带的音调发生器在控制器的作用下可自动发出按键声和报警声,在发声期间,输出还可以设置为高电平或低电平,以驱动电子发声器、继电器或指示灯。
[电源管理]
<font color='red'>I2C总线</font>键盘电路以及驱动程序设计
MAX517与单片机的I2C总线数据通信
1 I2C总线的特点及基本通信协议 I2C总线是Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线?串行数据线和串行时钟线?即可使连接于总线上的器件之间实现信息传送,同时可通过对器件进行软件寻址,而不是对硬件进行片选寻址的方式来节约通信线数目,从而减少了硬件所占空间。因为总线已集成在片内,所以大大缩短了设计时间,此外,在从系统中移去或增加集成电路芯片时,对总线上的其它集成芯片没有影响。 1.1 I2C总线的主要特点 I2C总线通常由两根线构成:串行数据线(SDA)和串行时钟线(SCL);总线上所有的器件都可以通过软件寻址,并保持简单的主从关系,其中主器件既可以作为发送器,又可以作为接收器; I
[嵌入式]
基于I2C总线的串行键盘电路设计
一、概述 本文介绍一种采用MAX7348 的串行I2C 总线的键盘电路以及驱动程序的设计。 I2C 需要连线少,仅需一条串行时钟线和一条串行数据线。允许多主机控制,具有裁决和同步功能,可随意添加或摘除总线上的子器件等诸多优点,所以已经被广泛应用。 二、MAX7348 MAX7348 是美国MAXIM 公司生产的2 线接口、低EMI 键盘开关和发声控制器,可监控多达40 个按键,可对按键去抖并保存在FIFO 中,去抖时间用户可在9 ~ 40ms 之间任意设置,MAX7348 自带的音调发生器在控制器的作用下可自动发出按键声和报警声,在发声期间,输出还可以设置为高电平或低电平,以驱动电子发声器、继电器或指示灯。 芯
[嵌入式]
基于I2C总线的MSP430单片机应用系统设计
串行护展总线技术是新一代单片机技术发展的一个显著特点。其中PHILIPS公司推出的I2C总线最为著名,它包括一个两端接口,通过一个带有缓冲区的接口,数据可以被I2C发送或接收,控制和状态信息则通过一套内存映射寄存器来传送。与并行扩展总线相比,串行扩展总线有突出的优点:电路结构简单,程序编写方便,易于实现用户系统软硬件的模块化、标准化等。本文是把I2C总线应用到MSP430单片机温度控制系统中的一个典型实例。 I2C总线是用2根双向I/O信号线(串行时钟线SCL和串行数据线SDA)把多种器件连接起来,并实现器件之间的串行通讯。 MSP430是TI公司一种具有超低功耗的功能强大的16位单片机,MSP430F169是该系列中的一
[单片机]
基于<font color='red'>I2C总线</font>的MSP430单片机应用系统设计
PCF8591 I2C总线接口的A/D芯片及其应用
1 引言 I2C总线是Philips公司推出的串行总线,整个系统仅靠数据线(SDA)和时钟线(SCL)实现完善的全双工数据传输,即CPU与各个外围器件仅靠这两条线实现信息交换。I2C总线系统与传统的并行总线系统相比具有结构简单、可维护性好、易实现系统扩展、易实现模块化标准化设计、可靠性高等优点。 在一个完整的 单片机 系统中,A/D转换芯片往往是必不可少的。PCF8591是一种具有I2C总线接口的A/D转换芯片。在与CPU的信息传输过程中仅靠时钟线SCL和数据线SDA就可以实现。 2 芯片介绍 PCF8591是具有I2C总线接口的8位A/D及D/A转换器。有4路A/D转换输入,1路D/A模拟输出。这就是说,它既
[单片机]
PCF8591 <font color='red'>I2C总线</font>接口的A/D芯片及其应用
STM32中I2C总线上数据的读、写。
/** * @brief 从I2C1总线上的某一器件的某一起始地址中读取一定字节的数据到数组中 * @param driver_Addr:I2C器件地址 * @param start_Addr:起始字节地址 * @param number_Bytes:要读取的字节数量(小于一页) * @param read_Buffer:存放读取数据的数组指针 * @retval 是否读取成功 */ u8 I2C1_Read_NBytes(u8 driver_Addr, u8 start_Addr, u8 number_Bytes, u8 *read_Buffer) { uint8_t read_Num; u8 I2C_Tim
[单片机]
虚拟I2C总线串行显示电路介绍
本文主要介绍了虚拟I2C总线串行显示电路,其中包括SAA1064引脚功能介绍、硬件电路设计、片内可编程功能以及程序举例。    1.SAA1064引脚功能   ① VDD、VEE:电源、接地端。电源4.5~15V;   ② P1~P16:段驱动输出端。分为两个8位口:   P1~P8;P9~P16。P8、P16为高位。口锁存器具有反相功能,置1时,端口输出0。   ③ MX1、MX2:位码驱动端。静态显示驱动时,一片SAA1064可驱动二位LED数码管;动态显示驱动时,按图9-10连接方式,一片SAA1064可驱动四位LED数码管;   ④ SDA、SCL:I2C总线数据端、时钟端;   ⑤ CEXT:时钟振荡器外接
[模拟电子]
虚拟<font color='red'>I2C总线</font>串行显示电路介绍
基于DSP与CPLD的I2C总线接口的设计与实现
摘要:介绍了一种使用CPLD完成DSP芯片I2C总线接口的设计和实现方案,重点叙述了I2C核的设计思想。 关键词:PWM SG3524 控制器 带有I2C总线接口的器件可以十分方便地将一个或多个单片机及外围器件组成单片机系统。尽管这种总线结构没有并行总线那样大的吞吐能力,但由于连接线和连接引脚少,因此其构成的系统价格低、器件间总线连接简单、结构紧凑,而且在总线上增加器件不影响系统的正常工作,系统修改和可扩展性好。即使有不同时钟速度的器件连接到总线上,也能很方便地确定总线的时钟。 如今,为了提高系统的数据处理精度和处理速度,在家用电器、通讯设备及各类电子产品中已广泛应用DSP芯片。但大多数的尚未提供I2C总线接口,本文将介绍
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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