7 2 i2c扩展接口案例2学时_第1页
7 2 i2c扩展接口案例2学时_第2页
7 2 i2c扩展接口案例2学时_第3页
7 2 i2c扩展接口案例2学时_第4页
7 2 i2c扩展接口案例2学时_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第10章 I2C总线接口及应用案例-GPIO软件模拟I2C协议10.1 I2C总线规范10.2 应用案例(一):GPIO模拟I2C总线协议1)2)3)4)硬件驱动程序分层模型I2C总线应用开发主要工作内容I2C接口功能芯片GPIO模拟I2C电路实例5) 软件模拟I2C协议代码详解10.3 GPIO应用案例(二):STM32片内I2C接口应用10.3.1 STM32 I2C接口控制器概述10.3.2 STM32 I2C控制器寄存器10.3.3 STM32 I2C控制器库函数10.3.4 STM32 I2C接口应用案例10.1I2C总线协议规范I2C总线I2C接口是Philips推出的一种串行总线

2、方式,用于IC器件之间的通信。它通过SDA(串行数据线)和SCL(串行时钟线)两根线在连到总 线上的器件之间传送信息,并通过软件寻址识别每个器件,而不需要 片选线。I2C接口的标准传输速率为100Kbit/s,最高传输速率可达400Kbit/s。VDD主控制器件(RTC)从控制器件(LCD)R1R2SDABUSSCL从控制器件(ADC)主控制器件(MCU)从控制器件(EEPROM)从控制器件(SRAM)I2C电气连接I2C总线接口均为开漏或开集电极输出,因此需要为总线增加上拉电阻Rp。总线速率越高,总线上拉电阻VDDRpRp就越小,100Kbit/s总线速率, 通常使用5.1K欧姆的上拉电阻I

3、2C BUSSDASDA SCLSCLSCL出SDA出器件1器件2SCL入SDA入I2C总线时序在数据传送过程中,必须确认数据传送的开始和结束,这通过起始和结束信号识别。发送起始信号后传送的第一字节数据具有特别的意义,其中前七位为从机地址,最后一位为读写方向位(0表示写,1表示读)。第一字节从器件地址R/WSSDA SCLS P起始信号结束信号 I2C总线时序I2C总线数据传送时,每传送一个字节数据后都必须有应答信号(A)。主控器接收数据时,如果要结束通信时,将在停止位之前发送非应答信号(A)。SDASCLAA应答信号非应答信号I2C的一个完整帧结构停止信号起始信号STOPSTART.B0AB

4、7SDASCL . 9 1 8 I2C时序各种帧结构STM32在I2C通信中可以配置为主控器也可以作为被控器,那么它就具有4种操作模式:主发送模式、主接收模式、从发送模式和从接收模式。主机到从机A = 应答(SDA为低)S = 起始信号主机到从机A = 非应答(SDA为高)P = 停止信号RS = 重复起始信号从发送模式:PA数据A数据A从器件地址RS从接收模式:A/AP/RS数据A数据A从器件地址WS主接收模式:PA数据A数据A从器件地址RS主发送模式:PA/A数据A数据A从器件地址WS10.2 GPIO软件模拟I2C协议1) 硬件驱动程序分层模型图10-2-1 协议驱动软件分层模型(1)应

5、用软件层协议时序/信号功能测试软件、EEPROM特定应用功能软件等;SDA(2)高层协议实现层指定存储单元字节数据读写函数、数据块读写函数;(3)低层协议实现层(S)、(P)、(A)、( )等信号的产生与发送、BIT位传送、数据帧传送等功能函数;(4) 硬件驱动层SCL、SDA输出高、低电平函数,读入SDA总线状态函数,GPIO端口初始化函数。GPIO硬件SCL2) 软件编写主要工作:(1) 硬件抽象层代码编写(基本I/O操作,与硬件实现有 关)(2) 协议底层功能函数编写(基本I2C信号 实现)(3) 协议高层函数编写 (字节读写)(4) 数据块读写高层接口函数读写(数据块读写)3) I2C

6、接口功能芯片带I2C从控制器的功能芯片比较多,比如I2C-EEPROM、I2C-ADC 、I2C-RFID阅读器芯片、I2C-RTC,.,等。8-lead SOICA0 A1 A2GNDVDD WPSCL SDA图10-2-2 AT24C01引脚功能182736454) GPIO模拟I2C电路实例5) 硬件抽象层主要需要实现下列9个函数,实现之后就基本可屏蔽MCU的硬件细节:delay5us(),延时基准函数,400kbps,约5us传输1比特,若对速度要求不高,不需要很精确,软件延时即可; I2C_Init(),I2C/GPIO端口引脚初始化函数; SET_SDA(),在SDA总线上输出数据

7、“1”函数; CLR_SDA(),在SDA总线上输出数据“0”函数; IN_SDA(), 读 入 数 据 线 状 态 函 数 ; SET_SCL(),在SCL总线上输出高电平函数; CLR_SCL(),在SCL总线上输出低电平函数; SET_SDA_OUT_MODE(),设置SDA为输出数据模式;SET_SDA_IN_MODE(),设置SDA为输入数据模式。01/STM32基本定义02#include stm32f10x.h03/根据字地址转定义IO寄存器04#define MEM_ADDR_TO_IO_REG(addr)05/字地址转位地址计算公式06#define WORD_ADDR_TO

8、_BIT_ADDR(waddr, bitnum).0708/根据位地址定义位IO寄存器09#define BIT_IO_REG(waddr, bitnum) .1011/计算ODR、IDR绝对地址12#define GPIOC_ODR_Addr(GPIOC_BASE+12)13#define GPIOC_IDR_Addr(GPIOC_BASE+8)14/定义输入输出宏15#define PCout(n)BIT_IO_REG(GPIOC_ODR_Addr,n)/定义位输出宏16#define PCin(n)BIT_IO_REG(GPIOC_IDR_Addr,n)/定义位输入宏17/GPIOI2C

9、硬件抽象层代码18/引脚定义19#define SCLPCout(0)/PC0 SCL_out20#define SDAPCout(1)/ PC1SDA_out21/延时函数定义,可软件不精确实现或定时器精确实现22void delay5us()char i;for(i=20;i0;i-) i=i;23void delay1ms(int n) for(n=n*200;n;n-) delay5us();24/基本IO操作25#defien SET_SDA()SDA=126#define CLR_SDA()SDA=027#define SET_SCL()SCL=128#define CLR_SCL

10、()SCL=029int IN_SDA(void)SDA=1; return ( PCin(1) ); 30void I2C_Init(void) 31/(1)令GPIOC端口时钟使能32RCC-APB2ENR |= (1APB2ENR-GPIOC口时钟。33/(2)清除PC0、PC1 模式位34GPIOC-CRL &= ( 0x0FCRL &= ( 0x0FCRL |= (5CRL寄存器,3-0位=0101b,浮空开漏输出模式38GPIOC-CRL |= (5CRL &= ( 0x0FCRL |= (8CRL &= ( 0x0FCRL |= (54*1);52SDA=1;/关闭SDA的OD输

11、出门,由上拉驱动5354556)I2C协议底层信号要实现下列7个函数start() stop()ack()nack() getAck() sendByte() recvByte()void start() /START 信号SET_SDA();delay5us(); SET_SCL();delay5us(); CLR_SDA();delay5us(); CLR_SCL();/SDA = 1;/SCL = 1;/SDA = 0;/SDA/SCL = 0;void stop()/STOP信号/SDA = 0;CLR_SDA();delay5us(); SET_SCL();delay5us();SE

12、T_SDA();delay5us(); CLR_SCL();/SCL = 1;/SDA = 1;/SDA = 0;void ack() /主器件发应答信号CLR_SDA(); SET_SCL();delay5us(); CLR_SCL(); SET_SDA();/SDA = 0;/SCL = 1;/SCL = 0;/SDA = 1;void nack() /主器件发非应答信号SET_SDA();/SDA = 1;delay5us(); SET_SCL();/SCL = 1;delay5us(); CLR_SCL(); /SCL = 0;unsigned char getAck()unsigne

13、d char flag,i; delay5us();/获取从器件应答信号SET_SDA_IN_MODE();delay5us(); SET_SCL();for(i=0;i10;i+)delay5us();flag = IN_SDA(); if(flag=0) break;/SCL = 1;CLR_SCL();delay5us(); ack_flag=flag; return flag;/SCL = 0;unsigned char sendByte(unsigned char dat)unsigned char i; for(i = 0; i 8; i+)delay5us();if( dat&0

14、x80 )else delay5us(); SET_SCL();delay5us(); CLR_SCL();dat = dat 1; SET_SDA(); CLR_SDA(); /SCL = 1;/SCL = 0;return getAck();在时钟上升沿前输出SDA数据unsigned char recvByte()unsigned char i, tmp, dat; SET_SDA_IN_MODE();for(i = 0; i 8; i+)delay5us(); SET_SCL();delay5us(); if(IN_SDA() = 1)tmp = 1; else tmp = 0;dat

15、 = (dat 1) | tmp; CLR_SCL();return dat;在时钟下降沿前取样SDA7)主控制器高层I2C协议实现writeByte(),读指定存储单元数据readByte(),写指定存储单元数据writeBlock(),读指定位置数据块readBlock(),写指定位置数据块#define #define #defineSLAVE_ADDR 0xA0 CMD_WRITE 0x00 CMD_READ 0x01/ AT24C02 /AT24C02 EEPROMvoid writeByte(unsigned char addr,unsigned char dat)start();

16、 SendByte(SLAVE_ADDR|CMD_WRITE);/delay2Ms();sendByte(addr); /写地址计数器/delay2Ms();sendByte(dat); stop();/delay2Ms();/写存储数据主发送模式:PA/A数据A数据A从器件地址WSunsigned char readByte(unsigned char addr)unsigned char dat; start();sendByte(SLAVE_ADDR|CMD_WRITE);sendByte(addr); stop();start();/写AT24C02地址计数器sendByte(SLAV

17、E_ADDR|CMD_READ); dat = recvByte();nack();stop(); return dat;主接收模式:PA数据A数据A从器件地址RSvoid writeBlock( unsigned char addr, unsigned char * dats, unsigned char length)unsigned char i;start(); sendByte(SLAVE_ADDR|CMD_WRITE); sendByte(addr);start(); sendByte(SLAVE_ADDR|CMD_WRITE);for(i = 0; i length; i+) s

18、top();delay10Ms();sendByte(datsi);主发送模式:PA/A数据A数据A从器件地址WSvoid readBlock( unsigned char addr,unsigned char * buffer, unsigned char size) int i; start();int count = size - 1;sendByte(SLAVE_ADDR|CMD_WRITE); sendByte(addr);stop();start(); sendByte(SLAVE_ADDR|CMD_READ);for(i = 0; i count; i+) bufferi = recvByte(); buffercount = recvByte();nack

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论