求助arduino 0.96oled iic之间iic通信问题,不胜感激

需要确认注册邮箱后才能开通博客,
&&&fpga学习日记15,实现IIC通信
6年会员勋章目前未领取。领取条件:?凡是注册时间六年以上的活跃用户即可领取该勋章。
liang890319的博客——专注的力量
博主:????
专注于嵌入式硬件开发。
文章(135)????
访问(217632)????
评论(93)????
投票(136)????
订阅本博??
博文列表查看方式:
需要确认注册邮箱后才能下载,
第一部分IIC介绍?
第二部分 verilog实现写24c16
IIC总线在嵌入式开发中是常用的总线之一
无论是实时时钟,温度传感器还是EEPROM等芯片都有采用IIC通信的
IIC简单的说具有以下特点
1,省IO只需要SDA??SCK两根线即可完成通信
2,速度快??最快可达到4Mbit/s
3,一条总线可挂载多个设备实现主从通信
?虽然现在的单片机和arm都内置了iic接口简单的配置下寄存器和调用API函数即可完成通信
但是研究其时序的实现对iic的加强理解还是有益的
1?.数据的有效性:
SDA?线上的数据必须在时钟的高电平周期保持稳定数据线的高或低电平状态只有在?SCL线的时钟信号是低电平时才能改变。
2,基本信号为?空闲?起始信号??应答信号??结束信号
空闲:SDA和SCL两条信号线都处于高电平,即总线上所有的器件都释放总线,两条信号线各自的上拉电阻把电平拉高;
起始信号:当SCL线是高电平时,SDA线从高电平向低电平切换,这个情况表示起始条件。
应答信号:发送到SDA线上的数据必须是8位的。每次传输可以发送的数据不受限制。每个字节后必须在时钟的第9个脉冲期间释放数据总线(SDA为高),由接收器发送一个ACK(把数据总线的电平拉低)来表示数据成功接收。
停止:当SCL线是高电平时,SDA线由低电平向高电平切换表示停止条件
3,首先传输的是数据的最高位(MSB)。如果从机要完成一些其他功能后(例如一个内部中断服务程序)才能接收或发送下一个完整的数据字节,可以使时钟SCL保持低电平迫使主机进入等待状态。当从机准备好接收下一个数据字节并释放时钟线SCL后,数据传输继续。
地址与数据
在起始条件之后,发送一个7位的从机地址,其中高四位A6-A3是从机器件的固定编址,出厂时就已给定;A2-A0是从机器件的引脚地址,通过接地接电源来形成地址。例如:4位LED的驱动控制器只用到两位A1,A0,所以同样的器件最多可以挂4个在IIC总线上;AT24C02(EEPROM)通过器件地址输入端A0、A1和A2可以实现将最多8个AT24C02器件连接到总线上。紧接着第8位是数据方向(R/W),0-表示发送数据(写),1-表示接收数据(读)。数据传输一般由主机产生的停止位(P)终止。
但是如果主机仍希望在总线上通讯,它可以产生重复起始条件(Sr),和寻址另一个从机,而不是首先产生一个停止条件。在这种传输中,可能有不同的读/写格式结合。
24C02写入操作
进行写操作时,首先发送该器件的7位地址码和写方向位”0”(共8位,即一个字节),发送完后释放SDA线并在SCL线上产生第9个时钟信号。被选中的存储器器件在确认是自己的地址后,在SDA线上产生一个应答信号作为响应,单片机收到应答后就可以传送数据了。传送数据时,单片机首先发送一个字节的被写入存储器的首地址,收到存储器器件的应答后,单片机就逐个发送数据字节,但每发送一个字节后都要等待应答。AT24C系列片内地址在接收到每一个数据字节地址后自动加1,在芯片的“一次装载字节数”限度内,只需输入首地址。装载字节数超过芯片的“一次装载字节数”时,数据地址将“上卷”,前面的数据将被覆盖。??
先发送该器件的7位地址码和写方向位“0”(“伪写”),发送完后释放SDA线并在SCL线上产生第9个时钟信号。被选中的存储器器件在确认是自己的地址后,在SDA线上产生一个应答信号作为回应。??????
然后,再发一个字节的要读出器件的存储区的首地址,收到应答后,单片机要重复一次起始信号并发出器件地址和读方向位(“1”),收到器件应答后就可以读出数据字节,每读出一个字节,单片机都要回复应答信号。当最后一个字节数据读完后,单片机应返回以“非应答”(高电平),并发出终止信号以结束读出操作。???
?第二部分 verilog实现写eeprom 24cxx
?<span style="color: #,设计思想
a,IIC时钟频率? 频率与起始 结束信号的产生 以及数据在时钟低电平变化的控制?
b,如何找到IIC 时钟的低电平? 进行数据变化操作
c,如何产生开始和结束信号
24CXX在3,3v时最高速度100k
开发板晶振50为了简单设计速度为50k? 计数1000次产生一个时钟
对50khz进行2倍频 4倍频即可找到50khz时钟高低电平的中点
在产生起始 结束信号时 接过50khz时钟的权限
强制控制时钟电平和数据信号 产生开始和结束信号
然后按照数据手册上写的时序进行设计即可
2,verilog代码实现
50khz时钟产生
verilog语言:
// counter for gen a clk_50k : need count to 1000, for 50M/1000 = 50K hz
always @(posedge sys_clk or negedge sys_rst_n) begin
? ? ? ?if (sys_rst_n ==1'b0)
? ? ? ? ? ?counter_div &= 10'b0;
? ? ? ?else if (counter_div &= 10'd999)
? ? ? ? ? ?counter_div &= 10'b0;
? ? ? ?else
? ? ? ? ? ?counter_div &= counter_div + 10'b1;
// gen a clk_50k use counter_div : ?not use counter_div 0 - 500 is for i2c bus request start timing
always @(posedge sys_clk or negedge sys_rst_n) begin
? ? ? ?if (sys_rst_n ==1'b0) ?
? ? ? ? ? ?clk_50k &= 10'b0;
? ? ? ?else ?if ((counter_div &= 375) && (counter_div & 875)) ? ?
? ? ? ? ? ?clk_50k &= 10'b1;
? ? ? ?else
? ? ? ? ? ?clk_50k &= 10'b0;
我们对50khz进行4倍频以便于找到50khz时钟高低电平中点
verilog语言:
// gen a 200K CLK for work counter count
always @(posedge sys_clk or negedge sys_rst_n) begin
? ? ? ?if (sys_rst_n ==1'b0)
? ? ? ? ? ?clk_200k &= 10'b0;
? ? ? ?else ?if ((counter_div &= 0 ?) && (counter_div & 125))
? ? ? ? ? ?clk_200k &= 10'b0;
? ? ? ?else ?if ((counter_div &= 125) && (counter_div & 250))
? ? ? ? ? ?clk_200k &= 10'b1; ?
? ? ? ?else ?if ((counter_div &= 250) && (counter_div & 375))
? ? ? ? ? ?clk_200k &= 10'b0; ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ?else ?if ((counter_div &= 375) && (counter_div & 500))
? ? ? ? ? ?clk_200k &= 10'b1;
? ? ? ?else ?if ((counter_div &= 500) && (counter_div & 625))
? ? ? ? ? ?clk_200k &= 10'b0;
? ? ? ?else ?if ((counter_div &= 625) && (counter_div & 750))
? ? ? ? ? ?clk_200k &= 10'b1;
? ? ? ?else ?if ((counter_div &= 750) && (counter_div & 875))
? ? ? ? ? ?clk_200k &= 10'b0; ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ?else ?if ((counter_div &= 875) && (counter_div & 1000))
? ? ? ? ? ?clk_200k &= 10'b1;
? ? ? ?else ;
产生开始和结束信号时强制时钟为高而不是50khz的那个时钟来源
verilog语言:
//generate real clk for SCLK ,when the i2c bus is idle, make the clk wire high level
always @(*) begin
? ? ? ?if ( counter &= 2 && counter &= 118 )
? ? ? ? ? ?clk_sclk = clk_50k;
? ? ? ?else
? ? ? ? ? ?clk_sclk = 1'b1;
最后在每个50khz的低电平中点变换要发送的数据
always @(*) begin
? ?case (counter)
? ? ? ? 0 : sda = 1'b1 ;
? ? ? ? 1 : sda = 1'b1 ;
? ? ? ? 2 : sda = 1'b1 ;
? ? ? ? 3 : sda = 1'b0 ;
? ? ? ? 4 : sda = 1'b0 ; ? ? ? ? ? ? ?//Start
? ? ? ? 5 : sda = 1'b1 ; ? ? ? ? ? ? ?// 1
? ? ? ? 9 : sda = 1'b0 ; ? ? ? ? ? ? ?//0
? ? ? ?13 : sda = 1'b1 ; ? ? ? ? ? ? ? //1
? ? ? ?17 : sda = 1'b0 ; ? ? ? ? ? ? ? //0
? ? ? ?21 : sda = device_addr[2] ;
? ? ? ?25 : sda = device_addr[1] ;
? ? ? ?29 : sda = device_addr[0] ;
? ? ? ?33 : sda = 1'b0 ; ? ? ? ? ? ? ? ? ? // write ,bit[0] = ?0 ?
? ? ? ?33 + 4 : sda = 1'bz ; ? ? ? ? ? ? ? ? //ACK ,sda should be input
//---------重复以上数据发送-------------------?
????? 109 + 4: sda = 1'b0 ;
? ? ? 111 + 4: sda = 1'b1 ; ? ? ? ? ? ? ? ? ? ? ?//End
? ? ? default : ?sda = 1'b1 ;
其他参考资料
24C02通信详解
与非网IIC协议文章
IIC总线协议中文版
下载次数:?19
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
1.扫描左侧二维码
2.点击右上角的分享按钮
3.选择分享给朋友
??????有[ 2 ]名读者喜欢此文
阅读(5227)??
最近到访博主
评论是对思考最好的总结…
你还可以输入1000字
转发到我的博客
评论??的“fpga学习日记15,实现IIC通信”
第一部分IIC介绍第二部分verilog实现写24c16IIC总线在嵌入式开发中是常用的总线之一无论是实时时钟,温度传感器还是EEPROM等芯片都有采用IIC通信的IIC简单的说具有以下特点1,省IO只需要SDASCK两根线即可完成通信2,速度快最快可达到4Mbit/s3,一条总线可挂载多个设备实现...
你还可以输入30000字
同时评论给?liang890319
你还可以输入1000字
你还可以输入1000字
站在巨人的肩膀上。
mrleejiac??20:50 04-10
zcz2004??21:38 04-03
大大林??14:32 03-26
寻觅虚无??09:10 03-24
寻觅虚无??08:54 03-24
用户界面(GUI)
成员70名创建者:
EDN助学—FPGA/CPLD学习小组
成员18972名创建者:
STM32爱好者之家
成员6661名创建者:
成员419名创建者:
FPGA讨论组
成员3308名创建者:
成员800名创建者:
ZRtech之FPGA学友会
成员2342名创建者:
51单片机实践
成员270名创建者:
UCOSII讨论组
成员1463名创建者:
ARM_Linux团队
成员1367名创建者:
Linux内核分析
成员103名创建者:
linux编程天地
成员1318名创建者:
触摸屏技术
成员59名创建者:
-- Use of this website is subject to its terms of use.
京ICP备号-4 |
京公网安备37 |
新版社区已上线,旧版论坛、博客将停用
1、为防数据丢失,旧版论坛、博客不再接受发帖;
2、老用户只需重设密码,即可直接登录新平台;
3、新版博客将于8月底完美归来,敬请期待;
4、全新论坛、问答,体验升级、手机阅读更方便。Arduino Library for IIC/I2C OLED Model - 推酷
Arduino Library for IIC/I2C OLED Model
因为硬件原因,导致IIC/I2C总线没有ACK应答信号,所以惠特自动化生产的
不是标准的IIC通信。但这点可以通过软件来解决……
这里发布一个用于
的库文件,可以让这种OLED模块在
系统中使用。
下载地址:
文件说明:
.cpp &– &SSD1306的驱动文件;
.h &– &SSD1306驱动文件的头文件;
oledfont.c &– &字模表(你需要显示的内容可以通过取模软件算出字模后添加到此文件中,取模方式“共阴——列行式——逆向输出”;字模会占用大量的FLASH空间,请将不需要的字模注释掉,以免
会有空间不够的提示)。
功能说明:
Write_IIC_Byte(unsigned char IIC_Byte);&//通过IIC写一个8位的数据(比如0xff)
Write_IIC_Command(unsigned char IIC_Command); &//通过IIC总线向OLED模块写命令
Begin_IIC_Data(); &//通过IIC总线开启写数据的准备(这样可以让一组数据发送完成后再关闭IIC,能很大程度提速)
IIC_SetPos(unsigned char x, unsigned char y) ; //设置起始点坐标(x范围0~128,y范围0~7)
Fill_Screen(unsigned char fill_Data); &//Fill_Screen(0xff) — 全屏亮;Fill_Screen(0&00) — 全屏灭(可用作清屏)
Char_F6x8(unsigned char x, unsigned char y, const char ch[]); &//显示6&8的ASCII字符
Char_F8x16(unsigned char x, unsigned char y,const char ch[]);//显示8&16的ASCII字符
CN_F16x16(unsigned char x, unsigned char y, unsigned char N); //
显示16&16的汉字(这个也算是首次在Arduino平台上实现了显示汉字)
Draw_BMP(unsigned char x0, unsigned char y0, unsigned char x1, unsigned char y1,const char BMP[]); & //显示128&64的BMP图片
另外一些函数是功能函数
使用方法:
”文件夹复制到x:\arduino-1.5.5\libraries目录,重启Arduino IDE;
Demo_IIC是基于Arduino UNO的示例程序……正确接线并运行即可。
鄙人第一次使用Arduino,也不太熟悉C++,所以目前这个库使用起来可能不如Adafruit或U8glib的库那样方便……理解万岁。比如设置字体大小、显示任意尺寸BMP图片等功能,&后续会完善功能的!!!!
转载请注明出处:&
/archives/1358
购买或了解这种模块:
建议和问题反馈,请
或发邮件至
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致12345678910
搜索配件:
&&价格区间:从
折扣价格¥2.00元
原价:¥2.40元 (8.3折)
最近30天销量:月销 3 笔
商品来源:
&购物咨询(商品客服):
由卖家 ccz马到成功 从 广东 深圳 发货
推荐服务商:&&&&&&&&&&
商品详情图
商品标签云
买过的人评价...
卖家:ccz马到成功
来自:广东 深圳
最近30天销量:1件
相关内容:&
¥5.30(8.9折)
卖家:ccz马到成功
来自:广东 深圳
最近30天销量:2件
相关内容:&
¥62.00(9.7折)
卖家:ccz马到成功
来自:广东 深圳
最近30天销量:3件
相关内容:&
卖家:ccz马到成功
来自:广东 深圳
最近30天销量:0件
相关内容:&
卖家:ccz马到成功
来自:广东 深圳
最近30天销量:3件
相关内容:&
¥2.10(8.1折)
卖家:重庆育松电子经营部
来自:广东 深圳
最近30天销量:74件
相关内容:&
¥2.19(9.1折)
卖家:呀呀诺达
来自:广东 深圳
最近30天销量:4件
相关内容:&
卖家:ccz马到成功
来自:广东 深圳
最近30天销量:14件
相关内容:&
¥29.00(9.7折)
卖家:ccz马到成功
来自:广东 深圳
最近30天销量:3件
相关内容:&
¥5.30(8.9折)
卖家:ccz马到成功
来自:广东 深圳
最近30天销量:12件
相关内容:&
¥33.00(9.2折)
卖家:ccz马到成功
来自:广东 深圳
最近30天销量:1件
相关内容:&
卖家:ccz马到成功
来自:广东 深圳
最近30天销量:2件
相关内容:&
¥6.30(8.4折)
双氙商品标签云画像 正在为您生成中,请稍候再来哟...
您或许还喜欢
19.00&&&&(无折)
11.00&&&&(9.2折)
12.00&&&&(无折)
28.00&&&&(9.7折)
22.00&&&&(无折)
7.00&&&&(无折)
6.00&&&&(无折)
3.00&&&&(8.6折)
请留下你对双氙的意见或建议,感谢!
(如果有个人或商家的相关问题需要解决或者投诉,请致电400-000-5668)
联系电话/微信/QQ:
支持中英文(Support in both Chinese and English)
感谢您的反馈,我们会努力做得更好!Arduino相关硬件、程序使用交流。
作者: | 浏览:7 | 更新: 18:22:27
作者: | 浏览:10 | 更新: 18:21:30
作者: | 浏览:45 | 更新: 21:28:07
作者: | 浏览:49 | 更新: 15:32:43
作者: | 浏览:52 | 更新: 21:32:49
作者: | 浏览:116 | 更新: 17:43:20
作者: | 浏览:148 | 更新: 22:51:46
作者: | 浏览:170 | 更新: 00:27:33
作者: | 浏览:201 | 更新: 21:10:49
作者: | 浏览:202 | 更新: 22:32:16
作者: | 浏览:286 | 更新: 15:42:22
作者: | 浏览:315 | 更新: 17:14:55
作者: | 浏览:327 | 更新: 12:50:04
作者: | 浏览:342 | 更新: 14:42:43
作者: | 浏览:365 | 更新: 14:33:26
| 贝壳物联 | QQ交流群:
友情链接:

我要回帖

更多关于 arduino nano iic 的文章

 

随机推荐