iic

蓝桥杯—PCF8591、IIC总线、EEPROM介绍

僤鯓⒐⒋嵵緔 提交于 2020-02-21 22:25:11
1、IIC总线相关介绍 I2C串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有接到I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。下面根据官方提供的库文件,介绍需要注意的函数有: (1)void init_pcf8591(void) void init_pcf8591(void) { i2c_start(); i2c_sendbyte(0x90); i2c_waitack(); i2c_sendbyte(0x03); //ADC通道3 i2c_waitack(); i2c_stop(); operate_delay(10); } 这个函数为PCF8591初始化函数,对于选择通道函数为i2c_sendbyte(),上述代码选择通道3。 最后两位配置选择哪个通道 ,其余位不用管。 (2)unsigned char adc_pcf8591(void) unsigned char adc_pcf8591(void) { unsigned char temp; i2c_start(); i2c_sendbyte(0x91); i2c_waitack(); temp = i2c_receivebyte(); i2c_sendack(1); i2c_stop(); return temp; }

新金宝

依然范特西╮ 提交于 2020-02-18 03:38:18
目前只实现了主设备模式,一般也只用到主设备模式,IIC如果不能使用硬件方式,读取大量数据的时候效率很大,由于只有1个字节的缓冲区,根本不能使用中断模式(实际使用过程中,IIC会造成100us以内间隔的中断,单片机根本扛不住的),所以建议数据少就直接阻塞,1个字节也就几十us,数据多直接用DMA,将线程阻塞,等待DMA传输完成,而不会阻塞CPU(上传的代码没有实现DMA部分,便于理解)。 目前已经做了完善的错误处理,读写操作前都会清除中断,遇到错误会软复位,所有位置均做了超时处理,防止程序卡死,目前只测试了几个字节的读写,大量的,长时间的读写均表现稳定,目前手上开发板没有eeprom,无法做大数据的连续读写,如果你在使用过程中遇到问题,欢迎指正。 下面是IIC读写的时序例子,可以先熟悉一下,这样比较容易上手,哪一个环节出了问题也要调试。 正在上传…重新上传取消 下面简要说明一下STM32F7硬件IIC的驱动设计方式(建议先百度学习一下IIC的时序要求): [基本的初始化] 1.初始化IIC时钟,IO(IIC IO必须设置为复用开漏输出,这个很重要)。 2.CR1先赋值为0,复位IIC. 3.除了TIMINGR寄存器需要自己计算设置好,其余寄存器全部复位为0 4.设置CR1使能IIC。 注意:上面说到,IIC的IO必须初始化为复用开漏输出,我之前初始化为复用推挽输出,测试很久

WM8994软件IIC调试怪异问题

情到浓时终转凉″ 提交于 2020-02-15 05:47:40
使用官方demo,硬件IIC可以正常与WM8994通讯,而我这个使用了几年的软件IIC却无法正常通讯,表现为设备地址0x34能正常发送,能正确响应ACK,如果后续的16bit(2个字节)的地址与16bit(2个字节)的数据,BIT0,BIT8有一个1的话,就无法完成通讯。 比如发送0xFEFE是没问题的,如果是0xFFFF或者0x0001或者0x0100之类,只要BIT0或BIT8有1则不会收到ACK,时序确认了无数次,其它各种IIC芯片都能正常读写,唯独这个WM8994死活无法读取,已经折腾1个多星期了。 之前的软件IIC代码在这: https://blog.csdn.net/cp1300/article/details/75644988 已经用了好几年了。 然后我还重新编写了一个IIC的通讯接口,问题依旧。 //SDA-PH8 SCL-PH7 #define WM8994_SDA_OUT_MODE() SYS_GPIOx_OneInit(GPIOH, 8, OUT_OD, SPEED_50M) //SDA输出模式 #define WM8994_SDA_IN_MODE() SYS_GPIOx_OneInit(GPIOH, 8, IN_IPU, IN_NONE) //SDA输入模式 #define IIC_SDA_Set(x) (PHout(8) = x) #define IIC

单片机:EEPROM(IIC总线)

早过忘川 提交于 2020-02-12 12:13:24
I2C总线只有两根双向信号线。一根是数据线SDA,另一根是时钟线SCL。 I2C总线通过上拉电阻接正电源。当总线空闲时,两根线均为高电平。连到总线上的任一器件输出的低电平,都将使总线的信号变低,即各器件的SDA及SCL都是线“与”关系。 2.png 每个接到I2C总线上的器件都有唯一的地址。主机与其它器件间的数据传送可以是由主机发送数据到其它器件,这时主机即为发送器。由总线上接收数据的器件则为接收器。 起始和终止信号 SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号;SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。 起始和终止信号都是由主机发出的,在起始信号产生后,总线就处于被占用的状态;在终止信号产生后,总线就处于空闲状态。 接收器件收到一个完整的数据字节后,有可能需要完成一些其它工作,如处理内部中断服务等,可能无法立刻接收下一个字节,这时接收器件可以将SCL线拉成低电平,从而使主机处于等待状态。直到接收器件准备好接收下一个字节时,再释放SCL线使之为高电平,从而使数据传送可以继续进行。 3.png 4.png AT24CXX存储器工作原理 与400KHz I2C总线兼容 1.8到6.0伏工作电压范围 低功耗CMOS技术 写保护功能当WP为高电平时进入写保护状态 页写缓冲器 自定时擦写周期 100万次编程/擦除周期 可保存数据100年 8脚DIP

IIC

≡放荡痞女 提交于 2020-02-12 02:05:58
IIC 是什么: IIC(Inter-Integrated Circuit)总线是一种由 PHILIPS 公司开发的两线式串行总线,用于连接微控制器及其外围设备。它是由数据线 SDA 和时钟 SCL 构成的串行总线,可发送和接收数据。在 CPU 与被控 IC 之间、IC 与 IC 之间进行双向传送。在信息传输过程中IIC总线上并联的每一个器件既是被控器(或主控器),又是发送器,这取决于他所要完成的功能。CPU发出的控制信号分为地址码和数据码两部分:地址码用来选址,即接通需要控制的电路;数据码是通信的内容,这样各IC控制电路虽然挂在同一条总线上,但却彼此独立。 I2C 总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。 开始信号:SCL 为高电平时,SDA 由高电平向低电平跳变,开始传送数据。 结束信号:SCL 为高电平时,SDA 由低电平向高电平跳变,结束传送数据。 应答信号:接收数据的 IC 在接收到 8bit 数据后,向发送数据的 IC 发出特定的低电平脉冲,表示已收到数据。CPU 向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU 接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。 注意: 使用IIC总线时必须要有起始信号,结束信号和应答信号可以不要。IIC总线进行数据传送时

关于IIC总线

二次信任 提交于 2020-02-08 12:51:45
关于IIC总线 I2C(Inter-Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。I2C总线产生于在80年代,最初为音频和视频设备开发,如今主要在服务器管理中使用,其中包括单个组件状态的通信。例如管理员可对各个组件进行查询,以管理系统的配置或掌握组件的功能状态,如电源和系统风扇。可随时监控内存、硬盘、网络、系统温度等多个参数,增加了系统的安全性,方便了管理。 1 I2C总线特点 I2C总线最主要的优点是其简单性和有效性。由于接口直接在组件之上,因此I2C总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。总线的长度可高达25英尺,并且能够以10Kbps的最大传输速率支持40个组件。 I2C总线的另一个优点是,它支持多主控(multimastering), 其中任何能够进行发送和接收的设备都可以成为主总线。一个主控能够控制信号的传输和时钟频率。当然,在任何时间点上只能有一个主控。 2 I2C总线工作原理 2.1 总线的构成及信号类型 I2C总线是由 数据线SDA 和 时钟SCL 构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,最高传送速率100kbps。 各种被控制电路均并联在这条总线上,但就像电话机一样只有拨通各自的号码才能工作

k60驱动代码学习(10)

蹲街弑〆低调 提交于 2020-02-08 04:51:24
//IIC # ifndef __IIC_H # define __IIC_H # include "common.h" # include "MK60_GPIO.h" # define IIC_SCL_PIN PTC10 //模拟IIC的SCL信号 1.修改引脚即可修改IIC接口 # define IIC_SDA_PIN PTC11 //模拟IIC的SDA信号 # define SDA_IN() GPIO_PinSetDir(IIC_SDA_PIN, 0); //输入 # define SDA_OUT() GPIO_PinSetDir(IIC_SDA_PIN, 1); //输出 # define IIC_SCL PTC10_OUT //SCL 2.修改引脚即可修改IIC接口 # define IIC_SDA PTC11_OUT //SDA # define READ_SDA PTC11_IN //输入SDA /*--------------------------------------------------------------- IIC内部函数 ----------------------------------------------------------------*/ void IIC_Start ( void ) ; //发送IIC开始信号 void IIC

stm32f1系列单片机使用IIC驱动BH1750/GY302模块驱动

我只是一个虾纸丫 提交于 2020-02-08 02:32:32
STM32f1系列单片机使用IIC驱动BH1750 转发此文请标明出去! 首先说明下** GY302模块上面其实就是一个BH1750芯片 **,然后加了一小丢丢的外部驱动电路,实际上本质来说没什么区别,用起来一样。 简单的来说下BH1750这款光照强度传感器吧,输入电压VCC在3.0v-3.6v之间,我们一般都是 使用3.3v供电 啦,通讯采用 标准的IIC协议 , 自身的IIC地址可以有两种选择 ,怎么选择请看后面。它具有接近视觉的光谱效应,说白了就是你眼睛能感受到的光波范围,它也刚好是这个范围,所以这个模块用在什么光强感应的那些面向消费者的产品上最好了;它的 输入光的范围是1-65535lx 刚开始的时候使用STM32的硬件IIC写过这个的程序,但是发现不管怎么整都是返回的0x80,而且STM32的硬件IIC确实是有点问题,后来硬是没弄出来就改用软件IIC了,下面的程序也是用的软件IIC写的,有用硬件IIC成功的朋友可以分享下哈,我把我写的硬件IIC的代码也丢在下面了,希望有热心的伙伴一起研究硬件IIC为什么不成功哈, 写硬件IIC的时候一定要注意两点 ,其一, IIC从机的地址是7位地址往前移动一位,第八位是读写位 ,其二, STM32读和写的时序中的EV6事件虽然名字相同都叫EV6但是代码却不同,分别是 I2C_EVENT_MASTER_RECEIVER_MODE

arduino寻找IIC(I2c)设备地址

一曲冷凌霜 提交于 2020-02-04 01:50:36
arduino寻找IIC(I2c)设备地址 寻找IIC设备地址 官方地址 官方地址:i2c_scanner(http://playground.arduino.cc/Main/I2cScanner) 示例 : 可参考我的另外一篇博客 Arduino实践(二)lcd1602 把模块按接线方法接好,上传这段代码后,打开端口监视器,就能找到在I2C上的设备地址. # include <Wire.h> void setup ( ) { Wire . begin ( ) ; Serial . begin ( 9600 ) ; Serial . println ( "\nI2C Scanner" ) ; } void loop ( ) { byte error , address ; int nDevices ; Serial . println ( "Scanning..." ) ; nDevices = 0 ; for ( address = 1 ; address < 127 ; address ++ ) { // The i2c_scanner uses the return value of // the Write.endTransmisstion to see if // a device did acknowledge to the address. Wire .

STM32通信:IIC

被刻印的时光 ゝ 提交于 2020-02-03 00:23:57
因为教程上说STM32的硬件IIC复杂而且不太稳定,所以这里使用的是直接控制GPIO端口模拟IIC时序的方式进行通信 因为涉及到初始化、发送、接收等多个功能,所以就分成若干个函数来写了 这里涉及的是主设备上IIC的相关代码,因为SCL线的电平由主设备控制,因此主设备的代码会简单一点 从设备涉及到对SCL线上电平的识别,进而涉及到循环判断或者中断,以后有时间再去看看怎么写(挖坑) 一、IIC通信 1.简介 IIC总线是一种串行数据总线,只有二根信号线,一根是双向的数据线SDA,另一根是时钟线SCL,两条线可以挂多个设备。 IIC设备(绝大多数)里有个固化的地址,只有在两条线上传输的值等于IIC设备的固化地址时,其才会作出响应。通常我们为了方便把IIC设备分为主设备和从设备,基本上谁控制时钟线(即控制SCL的电平高低变换)谁就是主设备。 2.时序图 总结下来就是以下几点: 1.正常传输数据时,当SCL线处于低电平期时,SDA线上的电平允许变动 2.正常传输数据时,当SCL线处于高电平期时,SDA线上的电平不变 3.如果在SCL线的高电平期,SDA线由高电平向低电平跳变,则表示开始传输数据(START信号) 4.如果在SCL线的高电平期,SDA线由低电平向高电平跳变,则表示停止传输数据(STOP信号) 由于SCL线受主设备控制,因此主设备上的代码非常好写 发送数据时