文档库 最新最全的文档下载
当前位置:文档库 › the_driver_for_TWI(I2C)_in_AVR

the_driver_for_TWI(I2C)_in_AVR

the_driver_for_TWI(I2C)_in_AVR
the_driver_for_TWI(I2C)_in_AVR

悠景OLED (STM8S)I2C驱动

/******************************************************* ******************** * 文件名:oled.c * 描述:SSD1306 OLED 驱动IC驱动代码 * 驱动方式:I2C * i_restart@https://www.wendangku.net/doc/3b7225726.html, DB.Yan * 最后修改:2013-12-03 * *硬件连接图 |----------------------------------------------------------------| | SCL---PB4 | | SDA---PB5 | | RST---PD7 | ******************************************************************************/ #include "oled.h" #include "stdlib.h" #include "font.h" //OLED的显存 //存放格式如下. //Page[0]0 1 2 3 (127) //Page[1]0 1 2 3 (127) //Page[2]0 1 2 3 (127) //Page[3]0 1 2 3 (127) //Page[4]0 1 2 3 (127) //Page[5]0 1 2 3 (127) //Page[6]0 1 2 3 (127) //Page[7]0 1 2 3 (127) uint8_t OLED_GRAM[128][8]; #define SCL PB_ODR_ODR4 #define SDA PB_ODR_ODR5 #define SDAM PB_IDR_IDR5 #define RST PD_ODR_ODR7 #define SET_SCL_OUT() {PB_DDR_DDR4=1; PB_CR1_C14 = 1; PB_CR2_C24 = 0;} #define SET_SDA_OUT() {PB_DDR_DDR5=1; PB_CR1_C15 = 1; PB_CR2_C25 = 0;} #define SET_SDA_IN() {PB_DDR_DDR5=0; PB_CR1_C15 = 0; PB_CR2_C25 = 0;} #define SET_RST_OUT() {PD_DDR_DDR7=1;PD_CR1_C17 = 1;PD_CR2_C27 = 0;} //-------------------------------------------------------------- // Prototype : void I2C_Init(void) // Calls :

实验八 IIC通信协议

实验八I2C通信协议 一、实验目的: 1、培养学生阅读资料的能力; 2、加深学生对I2C总线通信协议的理解; 3、加强学生对模块化编程的理解; 二、实验环境: 1、硬件环境:PC机一台、单片机实验板一块、母头串口交叉线、USB电源线; 2、软件环境:keil uVision2集成开发环境; STC-ISP下载上位机软件; 三、实验原理: 要学会I2C通信协议的编程,关键是要看懂并掌握其时序图,理解对I2C通信协议相关子程序的实验编写。I2C通信协议的总线时序图如下所示: I2C总线时序图 I2C相关子程序的详细介绍 1、起始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。 2、结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。 起始信号和结束信号的时序图如下所示: 起始信号和结束信号的时序图 起始信号的流程如下:

1、SCL和SDA拉高,保持时间约为0.6us-4us; 2、拉低SDA,保持时间为约为0.6us-4us; 3、拉低时钟线 结束信号的流程如下: 1、SCL置高电平,SDA置低电平,保持时间约为0.6us-4us 2、SDA拉高,保持时间约为1.2-4us; 应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。 若未收到应答信号,由判断为受控单元出现故障。应答信号的时序图如下所示: 应答时序图 发送时的应答信号 ;**********应答信号********** ACK: SETB SDA ;数据线置高 SETB SCL ;时钟线置高 ACALL DELAY JB SDA,$ ;等待数据线变低 ACALL DELAY CLR SCL ;时钟线置低 RET 注意:这里如果数据线一直为高将进入死循环,所以一般我们都会在这做一个容错的处理。具体的程序如下: ACK: MOV R4,#00H SETB SDA SETB SCL LOP0: JNB SDA,LOP DJNZ R4,LOP0 ;循环255次 LOP: ACALL DEL CLR SCL RET 接收时的应答信号

Linux下I2C驱动介绍

1、I2C概述 I2C是philips公司提供的外设总线,I2C有两条数据线,一条是串行数据线SDA、一条是时钟线SCL,使用SDA和SCL实现了数据的交换,便于布线。I2C总线方便用在EEPROM、实时钟、小型LCD等与CPU外部的接口上。 2、Linux下的驱动思路 Linux系统下编写I2c驱动主要有两种方法:一种是把I2C当做普通字符设备来使用;另一种利用Linux下驱动的体系结构来实现。 第一种方法: 优点:思路比较直接,不用花费大量时间去了解Linux系统下I2C体系结构 缺点:不仅对I2C设备操作要了解,还有了解I2C的适配器操作 不仅对I2C设备器和设备操作需要了解,编写的驱动移植性差,内核 提供的I2C设备器都没有用上。 第二种方法: 第一种的优点就是第二种的缺点,第一种的缺点就是第二种的优点。 3、I2C框架概述 Linux的I2C体系结构分为3部分: 1)I2C核心I2C核心提供了I2C总线驱动和设备驱动的注册和注销的方法,I2C 通信方法(algorithm)上层,与具体适配器无关的代码,检测设备上层的代 码等。 2)I2C总线驱动I2C总线驱动是对I2C硬件体系结构中适配器端的实现,适配器可以直接受CPU来控制。 3)I2C设备驱动I2C设备驱动是对I2C硬件体系结构中设备端的实现,设备端挂在受CPU控制的适配器上,通过I2C适配器与CPU交换数据。 Linux下的I2C体系结构: 1)Linux下的I2C体系结构 4、I2C设备驱动编写方法 首先让我们明白适配器驱动的作用是让我们能够通过它发出标准的I2C时序,在linux

内核源代码中driver/I2C/buss包含一些适配器的驱动,例如s3c2410的驱动I2C-s3c2410.c,适配器被加载到内核中,接下的任务就是实现设备驱动的编写。编写设备驱动的方法主要分为两种方法: 第一种:利用设备提供的I2C-dev.c来实现I2C适配器设备文件,然后通过上层应用程序来操作I2C设备器来控制I2C设备。 第二种:为I2C设备独立编写一个设备驱动 注意:第二种方法不能用设备提供的I2C-dev.c 5、I2C系统下的文件架构 在linux下driver下面有个I2C目录,在I2C目录下包含以下文件和文件夹 1)I2C-core.c 这个文件实现I2C核心功能以及/proc/bus/I2C*接口 2)I2C-dev.c 实现I2C适配器设备文件的功能,每个I2C适配器被分配一个设备,通过 适配器访问设备的时候,主设备号是89,此设备号是0-255. I2C-dev.c并没有针对特定设备而设计,只提供了read() write()和ioctl()等接口,应用层可以通过这些接口访问挂在适配器上的I2C设备存储空间和寄存器,并控制I2C设备的工作方式。 3)Chips 这个文件下面包含特定的I2C设备驱动。 4)Busses 这个文件包含一些I2C总线驱动。 5)Algos文件夹下实现了I2C总线适配器的algorithm 6、重要结构体 1)在内核中的I2C.h这个头文件中对I2C_driver;I2C_client;I2C_adapter和I2C_algorithm 这个四个结构体进行了定义。理解这4个结构体的作用十分关键。 i2c_adapter结构体 struct i2c_adapter { struct module *owner; //所属模块 unsigned int id; //algorithm的类型,定义于i2c-id.h, unsigned int class; const struct i2c_algorithm *algo; //总线通信方法结构体指针 void *algo_data;//algorithm数据 struct rt_mutex bus_lock; //控制并发访问的自旋锁 int timeout; int retries; //重试次数 struct device dev; //适配器设备 int nr; char name[48]; //适配器名称 struct completion dev_released; //用于同步 struct list_head userspace_clients; //client链表头

stm8中断使用

stm8中断使用 工程应用分析 最近的一个项目中用到了stm8s,一个比较重要的知识点就是中断的使用。暂且称stm8s这边做从机,要进行双机通信。stm8s作“从机”接收数据,也可以发送数据给主机。 自定了一个通信协议,一个CLK线,一个DAT线,CLK线总是由主机边控制。类似于I2C通信,CLK为高时,DAT由高到底表示开始。CLK 位高时,DAT由低到高表示结束。CLK为高电平时,DAT线数据为保持,为低电平时允许数据跳变。实际的时序图如下: 我这边接收数据其实有很多种方法,比如: 1.可以在程序主循环while(1)中每一次周期监视检测电平的变化,来达到判断信号的目的 2.采用延时,很多常用的通信会采用,比如我们接收数据,在高电平读数据,传送16位数据,得到第一个CLK高电平之后,可以直接延时固定间隔时间读,就可以得到下一个高电平时DAT数据,以此类推 3.采用中断,不依赖于时间,完全依赖于硬件检测电平变化 4.采用中断加延时的方法 评价: 1的方法,对时间要求比较高,因为有传输速度的要求,电平变化本来比较快,应尽可能缩短主循环一次执行时间,后续添加其他功能会有影响 2的方法,对时间要求比较高,双机通信,一对一尚可,如果一对很多,不稳定,待验证 3的方法,完全依赖于自身的硬件,比较稳定 4的方法,依然存在2的缺点,情况类似 最终实现方法DAT触发条件为上升沿和下降沿,CLK触发条件为上升沿 DAT触发,检测DAT电平,只有开始和结束符合条件,所以可以用这个来判断开始位和结束位。CLK上升沿触发中断,读DAT,可以保证肯定是在高电平时读的数据。俩个中断同时开启,最终的操作还是简单的,参考代码如下:

简单的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。 五. 寻址约定

Linux下I2C驱动架构全面分析概要

Linux下I2C驱动架构全面分析 I2C概述 I2C是philips提岀的外设总线. I2C只有两条线,一条串行数据线:SDA, —条是时钟线SCL,使用SCL , SDA这两根信号线就实现了设备之间的数据交互,它方便了工程师的布线。 因此,I2C总线被非常广泛地应用在EEPROM,实时钟,小型LCD等设备与CPU的接口中。 linux下的驱动思路 在linux系统下编写I2C驱动,目前主要有两种方法,一种是把I2C设备当作一个普通的字符设备来处理,另一种是利用linux下I2C驱动体系结构来完成。下面比较下这两种方法: 第一种方法: 优点:思路比较直接,不需要花很多时间去了解linux中复杂的I2C子系统的操作方法。 缺点: 要求工程师不仅要对I2C设备的操作熟悉,而且要熟悉I2C的适配器(I2C控制器)操作。要求工程师对I2C的设备器及I2C的设备操作方法都比较熟悉,最重要的是写岀的程序可以移植性差。 对内核的资源无法直接使用,因为内核提供的所有I2C设备器以及设备驱动都是基于I2C 子系统的格式。 第一种方法的优点就是第二种方法的缺点, 第一种方法的缺点就是第二种方法的优点。 I2C架构概述 Linux的I2C体系结构分为3个组成部分: I2C核心:I2C核心提供了I2C总线驱动和设备驱动的注册,注销方法,I2C通信方法 (” algorithm 上层的,与具体适配器无关的代码以及探测设备,检测设备地址的上层代码等。 I2C总线驱动:I2C总线驱动是对I2C硬件体系结构中适配器端的实现,适配器可由CPU控制,甚至可以直接集成在CPU内部。 I2C设备驱动:I2C设备驱动(也称为客户驱动)是对I2C硬件体系结构中设备端的实现,设备一般挂接在受CPU控制的I2C适配器上,通过I2C适配器与CPU交换数据。

Linux驱动之i2c用户态调用

一、概述 I2C只有两条线,一条串行数据线:SDA,一条是时钟线SCL.正因为这样,它方便了工程人员的布线. 二、用户态实现设备驱动 在Linux内核代码文件i2c-dev.c中实现了I2C适配器设备文件的功能,针对每个适配器生成一个主设备号为89的设备节点(次设备号为0-255),I2c-dev.c并没有针对特定的设备而设计,只是提供了通用的read(),write(),和ioctl()等文件操作接口,在用户空间的应用层就可以借用这些接口访问挂接在适配器上的I2C设备的存储空间或寄存器,并控制I2C设备的工作方式。 i2c适配器的设备节点是/dev/i2c-x,其中x是数字。由于适配器编号是动态分配的(和注册次序有关),所以想了解哪一个适配器对应什么编号,可以查看/sys/class/i2c-dev/目录下的文件内容。 三、用户态调用 3.1、i2c-dev 用户空间操作i2c,需要包含以下头文件。 打开适配器对应的设备节点

i2c-dev为打开的线程建立一个i2c_client,但是这个i2c_client并不加到i2c_adapter的client链表当中。他是一个虚拟的临时client,当用户打开设备节点时,它自动产生,当用户关闭设备节点时,它自动被释放。 3.2、ioctl() 查看include/linux/i2c-dev.h文件,可以看到i2c支持的IOCTL命令1.#define I2C_RETRIES0x0701 /*设置收不到ACK时的重试次数*/ 2.#define I2C_TIMEOUT0x0702/*设置超 时时限的jiffies*/ 3.#define I2C_SLAVE0x0703/ *设置从机地址*/ 4.#define I2C_SLAVE_FORCE0x0706/*强制设置从机地 址*/ 5.#define I2C_TENBIT0x0704/* 选择地址位长:=0for7bit,!=0for10bit*/ 6.#define I2C_FUNCS0x0705/* 获取适配器支持的功能*/ 7.#define I2C_RDWR0x0707 /*Combin ed R/W transfer(one STOP only)*/ 8.#define I2C_PEC0 x0708/* !=0to use PEC with SMBus*/ 9.#define I2C_SMBUS0x0720 /*SMBus transfer*/

STM8L探索套件学习笔记-EXTI外部中断(二)

STM8L探索套件学习笔记-EXTI外部中断(二) 上节讲到GPIO 口可以作为外部中断使用,今天我们就使用探索套件上的USER 按键,翻转LED1 灯。外部中断叙述如下图所示,USER KEY 连到的是PC.1 所以使用的是EXTI1 中断线,和STM32 的中断方式比较接近。 首先我们把KEY 的GPIO 设置为输入中断使能 GPIO_Init(KEY_PORT,KEY_PIN,GPIO_Mode_In_FL_IT); 然后配置中断1 为下降沿低电平触发 EXTI_SetPinSensitivity(EXTI_Pin_1, EXTI_Trigger_Falling_Low); 设置中断的优先级 ITC_SetSoftwarePriority(EXTI1_IRQn, ITC_PriorityLevel_1); 开全局中断 enableInterrupts(); 最后我们到中断文件里面STM8L15X_it.c 设置 INTERRUPT_HANDLER(EXTI1_IRQHandler, 9) { /* In order to detect unexpected events during development, it is recommended to set a breakpoint on the following instruction. */ GPIO_ToggleBits(GPIOE, GPIO_Pin_7); Delay(0xFFFF); EXTI_ClearITPendingBit(EXTI_IT_Pin1); } tips:感谢大家的阅读,本文由我司收集整编。仅供参阅!

I2C总线协议规范 v2.1

THE I2C-BUS SPECIFICATION VERSION 2.1 JANUARY 2000

CONTENTS 1PREFACE. . . . . . . . . . . . . . . . . . . . . . . . . . .3 1.1Version 1.0 - 1992. . . . . . . . . . . . . . . . . . . . 3 1.2Version 2.0 - 198. . . . . . . . . . . . . . . . . . . . . 3 1.3Version 2.1 - 1999. . . . . . . . . . . . . . . . . . . . 3 1.4Purchase of Philips I2C-bus components . . 3 2THE I2C-BUS BENEFITS DESIGNERS AND MANUFACTURERS. . . . . . . . . . . . . . .4 2.1Designer benefits . . . . . . . . . . . . . . . . . . . . 4 2.2Manufacturer benefits. . . . . . . . . . . . . . . . . 6 3INTRODUCTION TO THE I2C-BUS SPECIFICATION . . . . . . . . . . . . . . . . . . . . .6 4THE I2C-BUS CONCEPT . . . . . . . . . . . . . . .6 5GENERAL CHARACTERISTICS . . . . . . . . .8 6BIT TRANSFER . . . . . . . . . . . . . . . . . . . . . .8 6.1Data validity . . . . . . . . . . . . . . . . . . . . . . . . 8 6.2START and STOP conditions. . . . . . . . . . . 9 7TRANSFERRING DATA. . . . . . . . . . . . . . .10 7.1Byte format . . . . . . . . . . . . . . . . . . . . . . . . 10 7.2Acknowledge. . . . . . . . . . . . . . . . . . . . . . . 10 8ARBITRATION AND CLOCK GENERATION . . . . . . . . . . . . . . . . . . . . . .11 8.1Synchronization . . . . . . . . . . . . . . . . . . . . 11 8.2Arbitration . . . . . . . . . . . . . . . . . . . . . . . . . 12 8.3Use of the clock synchronizing mechanism as a handshake. . . . . . . . . . . 13 9FORMATS WITH 7-BIT ADDRESSES. . . .13 107-BIT ADDRESSING . . . . . . . . . . . . . . . . .15 10.1Definition of bits in the first byte . . . . . . . . 15 10.1.1General call address. . . . . . . . . . . . . . . . . 16 10.1.2START byte . . . . . . . . . . . . . . . . . . . . . . . 17 10.1.3CBUS compatibility. . . . . . . . . . . . . . . . . . 18 11EXTENSIONS TO THE STANDARD- MODE I2C-BUS SPECIFICATION . . . . . . .19 12FAST-MODE. . . . . . . . . . . . . . . . . . . . . . . .19 13Hs-MODE . . . . . . . . . . . . . . . . . . . . . . . . . .20 13.1High speed transfer. . . . . . . . . . . . . . . . . . 20 13.2Serial data transfer format in Hs-mode. . . 21 13.3Switching from F/S- to Hs-mode and back . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2313.4Hs-mode devices at lower speed modes. . 24 13.5Mixed speed modes on one serial bus system. . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 13.5.1F/S-mode transfer in a mixed-speed bus system. . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 13.5.2Hs-mode transfer in a mixed-speed bus system. . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 13.5.3Timing requirements for the bridge in a mixed-speed bus system. . . . . . . . . . . . . . 27 1410-BIT ADDRESSING. . . . . . . . . . . . . . . . 27 14.1Definition of bits in the first two bytes. . . . . 27 14.2Formats with 10-bit addresses. . . . . . . . . . 27 14.3General call address and start byte with 10-bit addressing. . . . . . . . . . . . . . . . . . . . 30 15ELECTRICAL SPECIFICATIONS AND TIMING FOR I/O STAGES AND BUS LINES. . . . . . . . . . . . . . . . . . . . 30 15.1Standard- and Fast-mode devices. . . . . . . 30 15.2Hs-mode devices. . . . . . . . . . . . . . . . . . . . 34 16ELECTRICAL CONNECTIONS OF I2C-BUS DEVICES TO THE BUS LINES . 37 16.1Maximum and minimum values of resistors R p and R s for Standard-mode I2C-bus devices . . . . . . . . . . . . . . . . . . . . . 39 17APPLICATION INFORMATION. . . . . . . . . 41 17.1Slope-controlled output stages of Fast-mode I2C-bus devices. . . . . . . . . . . . 41 17.2Switched pull-up circuit for Fast-mode I2C-bus devices . . . . . . . . . . . . . . . . . . . . . 41 17.3Wiring pattern of the bus lines. . . . . . . . . . 42 17.4Maximum and minimum values of resistors R p and R s for Fast-mode I2C-bus devices . . . . . . . . . . . . . . . . . . . . . 42 17.5Maximum and minimum values of resistors R p and R s for Hs-mode I2C-bus devices . . . . . . . . . . . . . . . . . . . . . 42 18BI-DIRECTIONAL LEVEL SHIFTER FOR F/S-MODE I2C-BUS SYSTEMS . . . . 42 18.1Connecting devices with different logic levels. . . . . . . . . . . . . . . . . . . . . . . . . 43 18.1.1Operation of the level shifter . . . . . . . . . . . 44 19DEVELOPMENT TOOLS AVAILABLE FROM PHILIPS. . . . . . . . . . . . . . . . . . . . . 45 20SUPPORT LITERATURE . . . . . . . . . . . . . 46

linux下iic(i2c)读写AT24C02

https://www.wendangku.net/doc/3b7225726.html,/jammy_lee/ https://www.wendangku.net/doc/3b7225726.html, linux下iic(i2c)读写AT24C02 linux驱动2010-02-09 16:02:03 阅读955 评论3 字号:大中小订阅 linux内核上已有iic的驱动,因此只需要对该iic设备文件进行读写则能够控制外围的iic器件。这里以AT24C02为对象,编写一个简单的读写应用程序。iic设备文件在我的开发板上/dev/i2c/0 ,打开文件为可读写。AT24C02的器件地址为0x50 ,既是iic总线上从器件的地址,每次只读写一字节数据。 /************************************************************/ //文件名:app_at24c02.c //功能:测试linux下iic读写at24c02程序 //使用说明: (1) // (2) // (3) // (4) //作者:jammy-lee //日期:2010-02-08 /************************************************************/ //包含头文件 #include #include #include #include #include #include #include

#include #include #include //宏定义 #define Address 0x50 //at24c02地址 #define I2C_RETRIES 0x0701 #define I2C_TIMEOUT 0x0702 #define I2C_SLAVE 0x0703 //IIC从器件的地址设置 #define I2C_BUS_MODE 0x0780 typedef unsigned char uint8; uint8 rbuf[8] = {0x00}; //读出缓存 uint8 wbuf[8] = {0x01,0x05,0x06,0x04,0x01,0x01,0x03,0x0d}; //写入缓存int fd = -1; //函数声明 static uint8 AT24C02_Init(void); static uint8 i2c_write(int fd, uint8 reg, uint8 val); static uint8 i2c_read(int fd, uint8 reg, uint8 *val); static uint8 printarray(uint8 Array[], uint8 Num); //at24c02初始化 static uint8 AT24C02_Init(void) { fd = open("/dev/i2c/0", O_RDWR); //允许读写 if(fd < 0) { perror("Can't open /dev/nrf24l01 \n"); //打开iic设备文件失败 exit(1);

iic设备驱动程序.doc

IIC设备驱动程序 IIC设备是一种通过IIC总线连接的设备,由于其简单性,被广泛引用于电子系统中。在现代电子系统中,有很多的IIC设备需要进行相互之间通信 IIC总线是由PHILIPS公司开发的两线式串行总线,用于连接微处理器和外部IIC设备。IIC设备产生于20世纪80年代,最初专用与音频和视频设备,现在在各种电子设备中都广泛应用 IIC总线有两条总线线路,一条是串行数据线(SDA),一条是串行时钟线(SCL)。SDA负责数据传输,SCL负责数据传输的时钟同步。IIC设备通过这两条总线连接到处理器的IIC总线控制器上。一种典型的设备连接如图: 与其他总线相比,IIC总线有很多重要的特点。在选择一种设备来完成特定功能时,这些特点是选择IIC设备的重要依据。 主要特点: 1,每一个连接到总线的设备都可以通过唯一的设备地址单独访问 2,串行的8位双向数据传输,位速率在标准模式下可达到100kb/s;快速模式下可以达到400kb/s;告诉模式下可以达到3.4Mb/s 3,总线长度最长7.6m左右 4,片上滤波器可以增加抗干扰能力,保证数据的完成传输 5,连接到一条IIC总线上的设备数量只受到最大电容400pF的限制 6,它是一个多主机系统,在一条总线上可以同时有多个主机存在,通过冲突检测方式和延时等待防止数据不被破坏。同一时间只能有一个主机占用总线 IIC总线在传输数据的过程中有3种类型的信号:开始信号、结束信号、和应答信号 >>开始信号(S): 当SCL为高电平时,SDA由高电平向低电平跳变,表示将要开始传输数据 >>结束信号(P):当SCL为高电平时,SDA由低电平向高电平跳变,表示结束传输数据 >>响应信号(ACK): 从机接收到8位数据后,在第9个周期,拉低SDA电平,表示已经收到数据。这个信号称为应答信号 开始信号和结束信号的波形如下图:

基于STM8的外部中断实验

例程四按键中断 其实在上个例程就说那个中断的,但不是重点说,例程四就重点说下这个中断的设置,主要是针对外部中断,对于其他的中断,到时在相应的模块里面会说的。在STM8S207RB这个芯片里面有很多IO口都可以触发中断的。主要是GPIO_A,GPIO_B,GPIO_C,GPIO_D,GPIO_E,这五组IO口都可以触发外部中断,所以大家以后要设计电路的话,必须先要查看先对应的文档来看下,了解清楚芯片的资料才好设置。其实大家学会调用库里面的函数的话,这些初始化相当来说就很容易的了。 以上外部中断的设置来自“STM8寄存器.pdf”文档第74页 下面看下电路图先吧,只要当你清楚电路具体的链接,才能完成相对应的初始化。

用到内部的资源 "stm8s_clk.h" "stm8s_exti.h" "stm8s_gpio.h" "stm8s_uart1.h" "stm8s_clk.c" "stm8s_exti.c" "stm8s_gpio.c" "stm8s_uart1.c" 看完了电路图,照样是先看主函数

在主函数里面最重要的是Buttom_Init();的初始化,其他的初始话上前几个例程已经有介绍过,相信大家也很清楚了。下面重点讲下Buttom_Init()。 函数原型: 第一条语句是设置Buttom1和Buttom2相对应的IO为上拉输入; 第二条语句是设置GPIOD,也即是按键,为下降沿触发中断。 __enable_interrupt();这条语句是开总中断,在上一个例程里面说过了,以后凡是有触发中断的都要用上这条语句,所以说这条语句很重要的。 下面讲下外部中断常用的几个函数,这些函数都是库有的,可以直接调用的。

关于IIC的通信协议程序

#define uchar unsigned char #define uint unsigned int #define ulong unsigned long #define _BV(bit) (1 << (bit)) #ifndef cbi #define cbi(reg,bit) reg &= ~_BV(bit) #endif #ifndef sbi #define sbi(reg,bit) reg |= _BV(bit) #endif extern uchar dog; /* void delay_1ms(uchar xtal) { uchar i; for(i=0;i<(uint)(143*xtal-2);i++) {;} } //2 延时nms void delay_ms(uchar m, uchar fosc) { uchar i; i=0; while(i

实例解析linux内核I2C体系结构(2)

实例解析linux内核I2C体系结构(2) 华清远见刘洪涛四、在内核里写i2c设备驱动的两种方式 前文介绍了利用/dev/i2c-0在应用层完成对i2c设备的操作,但很多时候我们还是习惯为i2c设备在内核层编写驱动程序。目前内核支持两种编写i2c驱动程序的方式。下面分别介绍这两种方式的实现。这里分别称这两种方式为“Adapter方式(LEGACY)”和“Probe方式(new style)”。 (1)Adapter方式(LEGACY) (下面的实例代码是在2.6.27内核的pca953x.c基础上修改的,原始代码采用的是本文将要讨论的第2种方式,即Probe方式) ●构建i2c_driver static struct i2c_driver pca953x_driver = { .driver = { .name= "pca953x", //名称 }, .id= ID_PCA9555,//id号 .attach_adapter= pca953x_attach_adapter, //调用适配器连接设备 .detach_client= pca953x_detach_client,//让设备脱离适配器 }; ●注册i2c_driver static int __init pca953x_init(void) { return i2c_add_driver(&pca953x_driver); } module_init(pca953x_init); ●attach_adapter动作 执行i2c_add_driver(&pca953x_driver)后会,如果内核中已经注册了i2c适配器,则顺序调用这些适配器来连接我们的i2c设备。此过程是通过调用i2c_driver中的attach_adapter方法完成的。具体实现形式如下: static int pca953x_attach_adapter(struct i2c_adapter *adapter) { return i2c_probe(adapter, &addr_data, pca953x_detect); /* adapter:适配器 addr_data:地址信息 pca953x_detect:探测到设备后调用的函数 */ } 地址信息addr_data是由下面代码指定的。 /* Addresses to scan */ static unsigned short normal_i2c[] = {0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,I2C_CLIENT_END}; I2C_CLIENT_INSMOD;

i2c总线原理

I2C总线原理 ?什么是I2C总线? I2C即Inter IC,由Philips公司开发,是当今电子设计中应用非常广泛的串行总线之一,主要用于电压、温度监控,EEPROM数据的读写,光模块的管理等。 I2C总线只有两根线,SCL和SDA,SCL即Serial Clock,串行参考时钟,SDA即Serial Data,串行数据。 ?I2C总线的速率能达到多少? 标准模式下:100Kbps 快速模式下:400Kbps 高速模式下:3.4Mbps I2C总线结构如下图所示: 如上图所示,I2C是OC或OD输出结构,使用时必须在芯片外部进行上拉,上拉电阻R的取值根据I2C总线上所挂器件数量及I2C总线的速率有关,一般是标准模式下R选择10kohm,快速模式下R选取1kohm,I2C总线上挂的I2C器件越多,就要求I2C的驱动能力越强,R的取值就要越小,实际设计中,一般是先选取4.7kohm上拉

电阻,然后在调试的时候根据实测的I2C波形再调整R的值。 ?I2C总线上最多能挂多少个I2C器件? I2C总线上允许挂接I2C器件的数量由两个条件决定: 1).I2C从设备的地址位数。I2C标准中有7位地址和10位地址两种。如果是7位地址,允许挂接的I2C器件数量为:27=128,如果是10位地址,允许挂接的I2C 器件数量为:210=1024,一般I2C总线上挂接的I2C器件不会太多,所以现在几乎所有的I2C器件都使用7位地址。 2).挂在I2C总线上所有I2C器件的管脚寄生电容之和。I2C总线规范要求,I2C 总线容性负载最大不能超过470pF。 ?I2C总线是如何工作的? 1).I2C总线传输的特点。 I2C总线按字节传输,即每次传输8bits二进制数据,传输完毕后等待接收端的应答信号ACK,收到应答信号后再传输下一字节。等不到ACK信号后,传输终止。空闲情况下,SCL和SDA都处于高电平状态。 2).如何判断一次传输的开始? 如上图所示,I2C总线传输开始的标志是:SCL信号处于高电平期间,SDA信号出现一个由高电平向低电平的跳变。 3).如何判断一次传输的结束? 如上图所示,I2C总线传输结束的标志是:SCL信号处于高电平期间,SDA信号出现一个由低电平向高电平的跳变。跟开始标识正好相反。 4).什么样的I2C数据才是有效的。

相关文档
相关文档 最新文档