linux下I2C驱动发送IO时序,笔记四:linux下IO口模拟实现I2C协议

一、i2c总线是什么?

1、i2c总线是一种物理总线及实实在在的总线,通过板子pcb等图能看到。

2、i2c总线是一种主从结构。

3、i2c总线是一种通信协议。

4、i2c总线是两线制半双工串行总线:

两线制:数据线(SDA)——>数据传输、时钟线(SCL)——>同步

半双工:同时刻数据只能从一端到另一端传输,一条数据线;对比全双工,同时刻完成数据的收发,两条数据线。

串行:一个时钟周期发送一位数据,一条线;对比并行,一个时钟周期发送一个字节数据,8条线。

注意:从相同时钟频率看并行比串行传输速度快,在实际传输中,随着时钟频率越来越高,并行数据传输时是有干扰,串行的传输优势更大一些。

5、i2c总线接口线少,控制简单,通信速率高。以上可以体现。

二、i2c总线协议怎么实现?

1、首先看一下i2c总线的时序图。

3f288ee285423cc6e29fa526842ca321.png

分析上图可以分为四部分,在学习的过程中我们要化整为零,逐个击破,然后再整合起来,这样就达到了学习的目的。

a、起始信号:时钟线为高电平时,数据线从高到低的变化;

b、数据传输:I2C为电平出发方式(数据先发高位,再发地位)

注:数据线上的数据必须在时钟线的高电平周期保持稳定,数据线上的电平状态在时钟线为低电平时才可以改变。

c、应答信号:接收端收到数据,发送一应答信号,低电平表示OK,高电平表示no。

d、 终止信号:时钟线为高电平时,数据线从低到高变化。

2、通过时序图完成模拟时序。

(起始、终止、发送应答、接收应答、发送数据位、接收数据位)

例子代码:

#define SCL (PAD_GPIO_D+6)

#define SDA (PAD_GPIO_D+7)

#define out_scl() nxp_soc_gpio_set_io_dir(SCL, 1)//代替s3c_gpio_cfgpin

#define out_sda()nxp_soc_gpio_set_io_dir(SDA, 1)

#define in_sda()nxp_soc_gpio_set_io_dir(SDA, 0)

#define low_scl()nxp_soc_gpio_set_out_value(SCL, 0)

#define high_scl()nxp_soc_gpio_set_out_value(SCL, 1)

#define low_sda()nxp_soc_gpio_set_out_value(SDA, 0)

#define high_sda()nxp_soc_gpio_set_out_value(SDA, 1)

#define demo_delay()udelay(6)

#define demo_i2c_get_data()nxp_soc_gpio_get_in_value(SDA)

#define I2C_W 0

#define I2C_R 1

#define SLAVE_ADDR 0x1D

static void demo_i2c_send_byte(unsigned char data)

{

int i = 0;

out_scl();

out_sda();

low_scl();

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

if(data & (0x80>>i))

high_sda();

else

low_sda();

demo_delay();

high_scl();

demo_delay();

low_scl();

}

}

static unsigned char demo_i2c_recv_byte(void)

{

int i = 0;

unsigned char data = 0;

out_scl();

in_sda();

low_scl();

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

demo_delay();

high_scl();

demo_delay();

data <<= 1;//循环8次,最终只左移了7次

data |= demo_i2c_get_data();

low_scl();

}

return data;

}

static void demo_i2c_send_ack(unsigned char ack)

{

out_scl();

out_sda();

low_scl();

if(ack)

high_sda();

else

low_sda();

demo_delay();

high_scl();

demo_delay();

low_scl();

}

static unsigned char demo_i2c_recv_ack(void)

{

unsigned char ack = 0;

out_scl();

in_sda();

low_scl();

demo_delay();

high_scl();

demo_delay();

ack = demo_i2c_get_data();

low_scl();

return ack;

}

static void demo_i2c_start(void)

{

out_scl();

out_sda();

high_scl();

high_sda();

demo_delay();

low_sda();

demo_delay();

low_scl();

}

static void demo_i2c_stop(void)

{

out_scl();

out_sda();

high_scl();

low_sda();

demo_delay();

high_sda();

demo_delay();

low_scl();

}

三、i2c总线使用?

无外乎就是通过i2c总线协议进行数据收发!

1、这里我们用mma8653三轴重力加速度传感器来验证我们写的模拟时序

2、查看mma8653在咱们板子的位置以及所用的I/O口。

(查看底板-->查看核心板-->得到所用I/O口)

157241c8f0bc7b3201b7b3b2261e2de5.png

3、设置I/O口功能。

4、打开mma8653芯片资料。

(查看i2c时序图,根据芯片的时序图,完成发送数据、接收数据的接口)

3f425716be1a11b82a5999b29b0a346b.png

3b85ea6d5e66671bc8c4c8781afdff74.png

例子代码:

static int demo_i2c_read_buffer(unsigned char reg, unsigned char *buff, int len)

{

int i = 0;

demo_i2c_start();

demo_i2c_send_byte((SLAVE_ADDR << 1) | I2C_W);

if(demo_i2c_recv_ack()) {

printk(KERN_WARNING "%d,get a nack.

", __LINE__);

return -1;

}

demo_i2c_send_byte(reg);

if(demo_i2c_recv_ack()) {

printk(KERN_WARNING "%d,get a nack.

", __LINE__);

return -1;

}

demo_i2c_start();

demo_i2c_send_byte((SLAVE_ADDR << 1) | I2C_R);

if(demo_i2c_recv_ack()) {

printk(KERN_WARNING "%d,get a nack.

", __LINE__);

return -1;

}

for(i=0; i

5、配置初始化mma8653芯片:active(0x2A)

检查chip_id(0x0D)

读取坐标信息。

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

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

相关文章

rails3异步发邮件

actionmailer 3.0 结合ar_mailer_rails3 异步发送邮件3 次投票jerry 分享于 3 个月 前, 0 条回复, 244 次浏览Share|actionmailer 3.0 的用法有所改进&#xff0c;并结合ar_mailer_rails3做异步邮件的发送&#xff0c;是比较方便的一种选择&#xff0c;把邮件都交给后台任务来发…

我见过的极品代码bug

程序员写代码有bug是很难避免的&#xff0c;也是因为程序员的bug存在&#xff0c;才让另一个职业有了更好的发展&#xff0c;那就是软件测试行业。但是程序员写bug&#xff0c;对于自己肯定是一件非常难忘的事情。我记得我在之前做一个TP固件升级的功能&#xff0c;也就是开机的…

Linux监控服务并主动重启

Linux查询后台进程&#xff0c;如果没有进程号&#xff0c;则重启服务&#xff1a; #!/bin/sh basepath$(cd dirname $0; pwd) while true doprocnumps -ef|grep "服务名称"|grep -v grep|wc -lif [ $procnum -eq 0 ]then#启动命令echo date %Y-%m-%d date %H:%M:%S …

双一流大学毕业的我,应该何去何从?

内卷时代&#xff0c;万物皆可卷&#xff01;什么是内卷&#xff0c;比如&#xff0c;你在电影院看电影&#xff0c;有一个人站起来了&#xff0c;那么就会有第二个人站起来&#xff0c;没一会儿所有的人就站起来了&#xff0c;但是和坐着相比&#xff0c;站着看电影体验感很差…

接上电就工作的单片机

对于手边的一盒STC单片机&#xff0c;测试一下它们使用相同的ISP方案在下载过程中是否都可以按照相同的方式完成程序的下载。同时对它们建立各自的元器件库&#xff0c;以便于后期的应用。通过这个实验&#xff0c;看到STC的单片机使用起来真实简捷明了&#xff0c;接上电就工作…

我的高中好友

很少写高中同学相关的文章&#xff0c;愿意是现在的生活上和原来的同学交集很少&#xff0c;他们的工作和我做的工作也有很大的差距。再一个是距离远&#xff0c;节假日不能互相走动。昨晚&#xff0c;我开直播。那时候是凌晨1点&#xff0c;然后我看到我一个高中的好朋友进了我…

类的初始化顺序详解

前言 先声明一个常识&#xff0c;类域和局部变量初始化的差异如下&#xff0c; 局部变量不初始化会报错&#xff1a; 类中属性(也称域)不赋初值&#xff0c;默认为0&#xff0c;如果是引用默认为空。 正题 一、类中属性按照定义的顺序初始化 我们声明一个Child类&#xff0c…

工程师的电脑桌面

【0】【1】【2】【3】【4】【5】【6】【7】【8】【9】【10】【11】【12】【13】【14】声明&#xff1a;本文素材来源网络&#xff0c;版权归原作者所有。如涉及作品版权问题&#xff0c;请与我联系删除。------------ END ------------转自黄工的公众号推荐阅读&#xff1a;专辑…

Jmeter JAVA请求

Jmeter Java请求 一、为什么要使用Java请求 现有的post 、 get 无法对加解密及鉴权的接口进行测试&#xff0c;需要进行封装&#xff0c;然后再请求&#xff0c;怎么进行封装&#xff1f;通常使用的方式是使用httpclient 工具类型来操作&#xff0c;下面举一个简单的Java自定义…

我的微信群里有一个外国人

最近&#xff0c;不知道怎么滴&#xff0c;我的微信群里面多了一个外国华人&#xff0c;然后他在群里面分享了他在国外的生活。实话说&#xff0c;我不曾羡慕过在美国生活的人们&#xff0c;我害怕走在街上突然遇到的枪击事件&#xff0c;也害怕每天面对的肯德基汉堡&#xff0…

第一次收到这么用心的感谢信

今天收到一个读者的感谢信心里特别暖&#xff0c;发出来给大家看看说明这很长时间的付出&#xff0c;说的很多话&#xff0c;是对别人是有帮助的&#xff0c;我也希望能够帮助到更多的人&#xff0c;希望大家有方向&#xff0c;有自己对生活的态度&#xff0c;然后坚持自己的理…

android fragment 底部菜单栏,一句话搞定Android底部导航栏,一键绑定Fragment、ViewPager...

现在大多数App都会用到底部导航栏&#xff0c;比如常见的聊天工具QQ、微信、购物App等等&#xff0c;有了底部导航栏&#xff0c;用户可以随时切换界面&#xff0c;查看不同的内容。它的实现方式也很多&#xff0c;以前大多使用TabHost来实现&#xff0c;但是现在我们有很多更好…

Http协议之报文·方法·状态码

【要点】 1. HTTP协议的主要特点2. HTTP报文的组成部分3. HTTP方法4. POST 和 GET的区别5. HTTP状态码【总结】HTTP协议的主要特点 主要特点&#xff1a;简单快速&#xff0c; 灵活&#xff0c; 无连接&#xff08;非keep-alive&#xff09;&#xff0c;无状态 每个资源URI是固…

MyEclipse 深色主题

Eclipse 是不支持主题的&#xff0c;不过可以通过导入导出perference文件来实现修改文本编辑器配色。 这里是一个深色主题&#xff0c;抓个图给大家看看&#xff1a; 下载地址&#xff1a;http://blog.codefront.net/2006/09/28/vibrant-ink-textmate-theme-for-eclipse/ 这里还…

深入理解嵌入式中重要的编程模型

大家好&#xff0c;我是写代码的篮球球痴。今天我们看一看业界一些著名的编程模型。背景模型是对事物共性的抽象&#xff0c;编程模型就是对编程的共性的抽象。什么是编程的共性呢&#xff1f;最重要的共性就是&#xff1a;程序设计时&#xff0c;代码的抽象方式、组织方式或复…

android v4包自动导入吧,android如何导入v4包的源码

1.我们导入v4包源码却发现没有导入按钮当我们调用android-support-v4.jar里面的控件的时候(这里以android.support.v4.view.ViewPager举例说明)&#xff0c;很多时候还需要查看此控件的源码&#xff0c;我们按住Ctrl键点击如下图中的ViewPager之后会出现如下提示出现这个问题的…

【floyd】【bitset】洛谷 P1841 [JSOI2007]重要的城市 题解

bitset玄学完美优化复杂度&#xff1f; 题目描述 参加jsoi冬令营的同学最近发现&#xff0c;由于南航校内修路截断了原来通向计算中心的路&#xff0c;导致去的路程比原先增加了近一公里。而食堂门前施工虽然也截断了原来通向计算中心的路&#xff0c;却没有使路程增加&#xf…

新风口下:嵌入式AI学习中较好的练手项目(附代码资料/学习视频/学习规划)...

有粉丝问我&#xff1a;“当前乃至未来5-10年&#xff0c;嵌入式开发者还有哪些风口&#xff1f;”画外音&#xff1a;风口的本质&#xff0c;其实就是一段时间的人才供需不平衡。说白了就是由于行业突变&#xff0c;敏锐的资本快速进入&#xff0c;导致短时间内行业大量扩张&a…

Windows 任务栏缩略图自定义程序[更新 Build20100830]

很久没有写一点小玩意儿了&#xff0c;今天终于有了一次机会。这个程序能够对 Windows 7 中的任务栏实时预览缩略图进行一系列个性化的调整&#xff0c;使其使用起来更炫更方便&#xff0c;避免了不方便的注册表修改操作&#xff0c;将其转化为方便图形界面&#xff0c;只需要点…

我接的是地啊,不,你接的是土!

作者&#xff1a;晓宇&#xff0c;排版&#xff1a;晓宇微信公众号&#xff1a;芯片之家&#xff08;ID&#xff1a;chiphome-dy&#xff09;1、我接地了啊&#xff0c;电子设计中&#xff0c;接地是非常重要的&#xff0c;地可不等于土&#xff0c;哈哈&#xff0c;有效的接地…