I2C通信——S5PV210的I2C通信简单案例

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。

参考内容

I2C子系统详解3——I2C总线驱动层代码分析_天糊土的博客-CSDN博客

一、S5PV210的I2C控制器

1、为什么需要控制器?

通信双方通过时序协调工作,但是时序比较复杂而不利于SoC软件完成。于是在SoC内部设置了硬件的控制器来产生通信时序,这样我们写软件时只需要向控制器的寄存器中写入配置值即可。

2、I2C控制器结构框图

S5PV210的I2C控制器的相关内容,始于用户手册第883页。

 (1)时钟部分

时钟来源是PCLK_PSYS,经过内部分频最终得到I2C控制器的CLK,通信中这个CLK会通过SCL线传给从设备。

(2)I2C总线控制逻辑

这部分负责产生I2C通信时序,主要体现在I2CCON、I2CSTAT这两个寄存器。实际编程中要发送起始位、停止位、接收ACK等都是通过这两个寄存器(背后所代表的电路模块)来实现的。

(3)移位寄存器

将要发送的字节数据,通过移位寄存器变成连续的位,一个个位地丢给SDA线。

(4)地址寄存器 + 比较器

本I2C控制器做从设备的时候用。

3、I2C控制器的工作时钟

由S5PV210——S5PV210的时钟系统可以得知:

(1)时钟源头是PCLK_PSYS,经过2级分频后得到I2C控制器的工作时钟。

(2)第一级分频系数,在I2CCON的bit[6]进行设置,分频后得到一个中间时钟I2CCLK。

(3)第二级分频系数为[1,16],分频器的输入是I2CCLK,输出是I2C控制器的工作时钟。

比如一个可用的配置是:65000KHz/512/4=31KHz。

4、I2C控制器有关的寄存器

(1)I2CCON、I2CSTAT寄存器

主要用来产生通信时序和I2C接口配置。

(2)I2CADD寄存器

主要用来写自己的slave address。

(3)I2CDS寄存器

发送/接收的数据都放在这里。

二、X210板载gsensor简介

1、重力加速度传感器(gsensor)

gsensor一般用在手机、平板、智能手表等设备上,用来感受人的手的移动,获取一些运动的方向性信息用来给系统作为输入参量,比如可以用来设计智能手表的计步器功能。

重力加速度传感器、地磁传感器、陀螺仪这三个传感器,都是用来感测运动的速度、方位等信息的,所以现在的9轴传感器,就是把这三个传感器结合起来,使用一定的算法得出结论,这样的结论比较精准。

传感器的接口一般有2种:模拟接口和数字接口。

模拟接口,是指使用接口电平变化来作为输出。比如使用模拟接口的压力传感器,在压力不同时输出电平在0~3.3V范围内变化,每个电压对应一个压力。SoC需要用使用AD对这些数据进行转换,得到数字化的电压值,再用数字电压值去校准得到压力值。

采用数字接口的传感器,是在采用模拟接口的传感器的基础上,内部集成了AD,通过一定的总线接口协议(一般是i2C)来输出数字化的参数。这样SoC直接通过总线接口初始化传感器、读取传感器输出的参数即可。比如gsensor、电容触摸屏IC就采用数字接口。

换言之,gsensor是I2C通信中的从设备,S5PV210中的I2C控制器是主设备。

2、gsensor原理图分析

由X210开发板的原理图可知:

(1)gsensor的供电由PWMTOUT3引脚控制。当PWMTOUT3输出低电平时,gsensor无电不工作,输出高电平时gsensor才会工作。PWMTOUT3对应着引脚GPD20_3。

(2)gsensor的SDA和SCL接在S5PV210的I2C端口0,对应着引脚GPD1_0、GPD1_1。将来编程时要初始化相关的GPIO,即把相关GPIO设置为正确的模式和输入输出值,即通过对寄存器GPD1CON的设置来实现。该寄存器的内容如下:

3、I2C从设备的设备地址

这款重力加速度传感器的型号叫KXTE9,它作为I2C通信中的从设备,与S5PV210这个SoC中的I2C控制器(主设备)进行通信。KXTE9的I2C地址固定为0b0001111(0x0f)。

I2C从设备地址本身是7位的,但是在I2C通信中发送I2C从设备地址时实际发送的是8位。高7位(bit7-bit1)对应I2C从设备的7位地址,最低一位(LSB)存放R/W信息(即下一个数据是主设备写从设备读(对应0),还是主设备读从设备写(对应1))。

主设备发信息给gsensor时,SAD应该是0b00011110(0x1E);如果是主设备读取gsensor信息时,则SAD应该是0b00011111(0x1F)。

4、I2C从设备的通信速率

I2C协议本身属于低速协议,通信速率不能太高。

另外主设备和从设备本身都有最高通信速率限制(属于各个芯片本身的参数),实际编程时只要小于两个即可。

作为只能做从设备的sensor,其本身i2c通信速率偏低,像KXTE9最高支持400KHz的频率。


三、I2C总线通信流程

位于用户手册第889页。

1、S5PV210的主发送流程图

2、S5PV210的主接收流程图

3、gsensor的写寄存器流程图

待写。

4、gsensor的读寄存器流程图

待写。

四、I2C通信代码

相关函数在文件drivers\i2c\busses\i2c-s3c2410.c中。

1、I2C控制器初始化:s3c24xx_i2c_init()

此函数完成I2C控制器的初始化:初始化GPIO,设置IRQEN和ACKEN,初始化I2C时钟。


/* s3c24xx_i2c_init** initialise the controller, set the IO lines and frequency
*/static int s3c24xx_i2c_init(struct s3c24xx_i2c *i2c)
{unsigned long iicon = S3C2410_IICCON_IRQEN | S3C2410_IICCON_ACKEN;struct s3c2410_platform_i2c *pdata;unsigned int freq;/* get the plafrom data */pdata = i2c->dev->platform_data;/* inititalise the gpio */if (pdata->cfg_gpio)pdata->cfg_gpio(to_platform_device(i2c->dev));/* write slave address */writeb(pdata->slave_addr, i2c->regs + S3C2410_IICADD);dev_dbg(i2c->dev, "slave address 0x%02x\n", pdata->slave_addr);writel(iicon, i2c->regs + S3C2410_IICCON);/* we need to work out the divisors for the clock... */if (s3c24xx_i2c_clockrate(i2c, &freq) != 0) {writel(0, i2c->regs + S3C2410_IICCON);dev_err(i2c->dev, "cannot meet bus frequency required\n");return -EINVAL;}/* todo - check that the i2c lines aren't being dragged anywhere */dev_dbg(i2c->dev, "bus frequency set to %d KHz\n", freq);dev_dbg(i2c->dev, "S3C2410_IICCON=0x%02lx\n", iicon);dev_dbg(i2c->dev, "S3C2440_IICLC=%08x\n", pdata->sda_delay);writel(pdata->sda_delay, i2c->regs + S3C2440_IICLC);return 0;
}

2、I2C控制器主模式开始一次读写:s3c24xx_i2c_message_start


/* s3c24xx_i2c_message_start** put the start of a message onto the bus
*/static void s3c24xx_i2c_message_start(struct s3c24xx_i2c *i2c,struct i2c_msg *msg)
{unsigned int addr = (msg->addr & 0x7f) << 1;unsigned long stat;unsigned long iiccon;stat = 0;stat |=  S3C2410_IICSTAT_TXRXEN;if (msg->flags & I2C_M_RD) {stat |= S3C2410_IICSTAT_MASTER_RX;addr |= 1;} elsestat |= S3C2410_IICSTAT_MASTER_TX;if (msg->flags & I2C_M_REV_DIR_ADDR)addr ^= 1;/* todo - check for wether ack wanted or not */s3c24xx_i2c_enable_ack(i2c);iiccon = readl(i2c->regs + S3C2410_IICCON);writel(stat, i2c->regs + S3C2410_IICSTAT);dev_dbg(i2c->dev, "START: %08lx to IICSTAT, %02x to DS\n", stat, addr);writeb(addr, i2c->regs + S3C2410_IICDS);/* delay here to ensure the data byte has gotten onto the bus* before the transaction is started */ndelay(i2c->tx_setup);dev_dbg(i2c->dev, "iiccon, %08lx\n", iiccon);writel(iiccon, i2c->regs + S3C2410_IICCON);stat |= S3C2410_IICSTAT_START;writel(stat, i2c->regs + S3C2410_IICSTAT);
}

3、I2C控制器主模式结束一次读写:s3c24xx_i2c_stop

static inline void s3c24xx_i2c_stop(struct s3c24xx_i2c *i2c, int ret)
{unsigned long iicstat = readl(i2c->regs + S3C2410_IICSTAT);dev_dbg(i2c->dev, "STOP\n");/* stop the transfer */iicstat &= ~S3C2410_IICSTAT_START;writel(iicstat, i2c->regs + S3C2410_IICSTAT);i2c->state = STATE_STOP;s3c24xx_i2c_master_complete(i2c, ret);s3c24xx_i2c_disable_irq(i2c);
}

4、框架分析

我们最终目的是通过读写gsensor芯片的内部寄存器来得到一些信息。

为了完成这个目的,我们需要能够读写gsensor的寄存器。而根据gsensor的规定,我们需要按照一定的操作流程来读写gsensor的内部寄存器,这是一个层次(姑且叫做传输层、协议层、应用层)。协议层的代码主要取决于gsensor芯片。

我们要按照操作流程去读写寄存器,就需要考虑I2C接口协议。这就是所谓的物理层,本质就是那些时序。此时要看主机SoC有没有控制器,有控制器时考虑控制器的寄存器,没控制器时要自己软件模拟时序。物理层代码主要取决于主机SoC。

相关的操作函数

gsensor写寄存器:gsensor_i2c_write_reg

gsensor读寄存器:gsensor_i2c_read_reg

gsensor编程:gsensor_initial等

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/461645.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

POJ 2718

题意&#xff1a;给出最多10个数字&#xff0c;将它们划分为两个整数&#xff0c;求差异值最小的值&#xff08;除非只有一位数&#xff0c;否则不允许出现先导0&#xff09; 题解&#xff1a;很显然如果总共有n个数&#xff0c;必然有一个整数长n/2,另一个长n-n/2&#xff0c;…

HDUOJ---1879 继续畅通工程

继续畅通工程 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 11473 Accepted Submission(s): 5026 Problem Description省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通&#xff08;但不一…

动态载入树 (ASP+数据库)

ASPACCESS 在数据量达100万条记录下&#xff0c;载入速度仍然惊人.... // 网上转载. 忘了作者... : ) //********************** Index.asp ************************// 1<%LANGUAGE"VBSCRIPT"CODEPAGE"936"%>2<%OptionExplicit%>3<htm…

ADC——S5PV210的ADC的理论与操作

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 参考博客 s5pv210 AD转换 - biaohc - 博客园 一、ADC的相关概念 1、量程&#xff08;模拟量的输入范围&#xff09; ADC只能输入电压信号&#xff0c;其他种类的模拟信号要经过传感器的转换&#x…

【洛谷 2661】信息传递

题目描述 有 nn 个同学&#xff08;编号为 11 到 nn &#xff09;正在玩一个信息传递的游戏。在游戏里每人都有一个固定的信息传递对象&#xff0c;其中&#xff0c;编号为 ii 的同学的信息传递对象是编号为 T_iTi​ 的同学。 游戏开始时&#xff0c;每人都只知道自己的生日。之…

kernel移植——从三星官方内核开始移植

以下内容源于朱有鹏嵌入式课程的学习&#xff0c;如有侵权&#xff0c;请告知删除。 一、内核移植初体验 1、获取三星官方的内核源码包 三星SMDKV210开发板附带的光盘里有内核源码包&#xff1a;下载地址。 2、构建移植环境 &#xff08;1&#xff09;Windows下建立SI工程&…

Android中实时视频传输(摄像头实时视频传输)解决方案二

为什么80%的码农都做不了架构师&#xff1f;>>> 1、使用FFMpeg进行视频采集&#xff0c;使用Live555进行RTP传输&#xff0c;使用VideoView进行播放。 csdn提到&#xff1a;重载FrameSource&#xff0c;写一个服务类&#xff0c;可以从FrameSource的派生类读取帧数…

定时器——S5PV210定时器的理论与操作

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、定时器简介 1、定时器的含义 定时器作为SoC的外设&#xff0c;主要用来实现定时执行代码的功能&#xff0c;它相对SoC而言&#xff0c;就像闹钟相对于人的意义一样。定时器内部的计数器每隔一个…

uboot的移植——DM9000移植的理论基础

以下内容源于朱有鹏嵌入式课程的学习&#xff0c;如有侵权请告知删除。 一、网卡相关的基本知识 1、DM9000网卡芯片和SoC的连接 如上图所示&#xff0c;DM9000网卡芯片是通过SROM总线接口&#xff0c;或者说SROM控制器接入SoC的。下面分别介绍SROM控制器、DM9000网卡芯片的相关…

javascript深入浅出

第一章 数据类型 1&#xff0c;六种数据类型&#xff1a;原始类型&#xff08;number&#xff0c;string&#xff0c;boolean&#xff0c;null&#xff0c;undefined&#xff09; object对象&#xff08;Function Array Date&#xff09; 2&#xff0c;隐式转换&#xff1a;Na…

网络通信基础常识

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 1、网络通信属于进程间通信 进程间通信的一种方法是使用套接字socket&#xff0c;网络通信其实就是位于网络中不同主机上面的2个进程之间的通信。 2、网络通信的层次 网络通信的层次&#xff0c;即…

Android NDK工程创建与编译运行

首发地址&#xff1a;http://www.eoeandroid.com/thread-201993-1-1.html一、 工程创建1. 创建一个Android工程配置好开发环境并加载好对应版本sdk后&#xff0c;选择菜单File->New-> Project创建工程&#xff0c;工程类型选择Android Project&#xff0c;如下图所示&…

[Quatsch]Quantum Or Optics

小生预言&#xff0c;鉴于目前CG产业中学术界与生产界之间的差异&#xff0c;未来必将有一门独立的学科&#xff0c;专门用于研究自然界的材质特性与表现&#xff0c;从此艺术界与学术界将呈现完美之统一&#xff0c;应该先在MIT或者Cornell出现。本人姑且将这门学科命名为“应…

C#事件 的讲解

一、事件的本质事件是软件系统里的两个子系统之间&#xff0c;或者两个模块之间&#xff0c;或者两个对象之间发送消息&#xff0c;并处理消息的过程。在面向对象的世界里&#xff0c;就可以统一认为是两个对象之间的行为。两个对象之间发送的这种消息&#xff0c;对发送方来讲…

phpMyAdmin密码设置

2019独角兽企业重金招聘Python工程师标准>>> 在使用phpMyAdmin操作数据库时&#xff0c;首先需要设置mysql的root用户的密码。具体操作参考前一篇博文。设置完mysql的root密码之后&#xff0c;需要对phpMyAdmin的登录进行一些配置。 未经配置的phpMyAdmin很不安全&a…

抽取网络信息进行数据挖掘 建立语料库

最近的实习项目需要做一个大数据库&#xff08;语料库&#xff09;&#xff0c;采集博客、微博、问答库的信息。将数据库的内容进行训练&#xff0c;最后应该是做成一个类似中文siri的模型吧。 第一步新闻抓取器已经稳定运行了&#xff0c;基本原理用的是爬虫去爬新闻门户网站的…

四旋翼无人机调研结果

P.S&#xff1a;作者曾在大学某次小班课上看到该视频&#xff0c;深深被震撼了&#xff0c;因此对无人机念念不忘。 恰逢某课程要求讲解自己喜欢的领域的内容&#xff0c;因此对四旋翼无人机进行了调研。

选购四轴飞行器的部件

内容截于&#xff1a;http://www.loveuav.com/article-191-1.html

重复编辑命令行

为什么80%的码农都做不了架构师&#xff1f;>>> 要想重复前面已经输入的命令&#xff0c;请按向上方向键。每按这个键一次&#xff0c;shell都会显示前一个命令行。要想重新执行所显示的命令行&#xff0c;请按回车键。按向下方向键&#xff0c;则可以沿着相反的方…

hadoop2.2.0 分布式存储hdfs完全分布式搭建及功能测试记录(一)----架构及原理介绍...

0.文档说明&#xff1a;本文是围绕hadoop2.2的分布式文件系统hdfs进行分布式存储功能测试&#xff0c;形成的hdfs分布式存储功能测试报告&#xff0c;其中主要包括三大部分内容&#xff1a;第一部分介绍了hdfs的基本原理&#xff1b;第二部分介绍了hadoop2.2的完全分布式集群安…