iic

STM32L4R9使用HAL库调试IIC注意事项

徘徊边缘 提交于 2019-12-04 03:30:47
STM32使用Cubemx生成的代码中,用到IIC的驱动,但是始终不能读写,因此使用逻辑分析仪,发现原本地址为0x58的写成了0x20,因此肯定是地址错了。因此,总结如下: 1、需要逻辑分析仪分析IIC协议书很好的,目前使用的工具是:DSView 逻辑分析仪。 2、keil在线debug的能够独写一次的,能代表是正确的,逻辑分析仪才是正确的判断方法。 3、在不能分析原因的情况下,先把硬件电源判断正确,是否有正确的电压。 4、示波器的探头也会有不能正常使用的情况,因此,发现没有波形的时候,也需要换一个探头,也许不是代码的错误。 5、自己用杜邦线搭建的电路调试板子,需要确认杜邦线连线要牢固。 来源: https://www.cnblogs.com/CodeWorkerLiMing/p/11828942.html

IIC挂死问题解决过程

安稳与你 提交于 2019-12-03 20:59:59
0.环境:arm CPU 带有IIC控制器作为slave端,带有调试串口。 1.bug表现:IIC slave 在系统启动后概率挂死,导致master无法detect到slave。 猜测1:认为IIC device程序有问题 检查1:查看程序发现有可能溢出的部分,使用IIC 工具刷过量数据到slave,未出问题。 猜测2:认为IIC device寄存器进入异常状态未能恢复 检查2:检查正常IIC寄存器和异常状态IIC寄存器,未能发现问题。 猜测3:时钟分频问题 检查3:询问同事,答固定分频。 猜测4:看波形分析 检查4:波形未量到,测量波形导致通信异常,部分设备破坏,放弃该方法。 2.发现新情况:系统启动过程中如果调试串口有数据输入,问题会概率出现。如果串口没有输入则多次测试不会出现问题。 猜测1:串口中断导致IIC初始化时被打断产生问题。 检查1:删除调试串口设备树节点,发现IIC启动100%出现问题 T-T。 猜测2: 100%复现的问题和之前的概率出现的问题相同 检查2:检查寄存器,检查设备detect 表现,认为是相同问题。 3.删除调试串口,IIC受影响的原因? 删除串口设备树节点,IIC device 必出问题。 猜测1:怀疑调试串口外部硬件电平高低导致IIC外设受影响 检查1:检查原理图,未发现影响的可能性。 猜测2:怀疑串口初始化部分处理了部分IIC设备依赖的初始化

iic总线的机制

只谈情不闲聊 提交于 2019-12-03 10:48:10
iic总线相关知识是嵌入式开发软件、硬件必问的知识点。被卡死了几回,今天进行总结。 特点:二线制,半双工,具有应答机制。其工作原理是scl、sda的开漏输出,因此必须接上拉电阻。通信速率略慢,0-3.4mHZ范围。 时序图: 来源: https://www.cnblogs.com/xuehaiwuya0000/p/11791737.html

软件模拟IIC

匿名 (未验证) 提交于 2019-12-03 00:22:01
最近做平衡车的时候用到了IIC总线的知识,在这里就总结一下吧! 1,IIC总线的连接 IIC传输数据的时候只用其实只需要两根线,一根是“SCL”为时钟线,一根是“SDA”为数据线 我们来看一下器件是怎么连接在IIC总线上的! 可以看到,SDA和SCL都接了上拉电阻, 在总线空闲的时候,SDA和SCL都应该为高电平 ,当总线上的任何一个器件输出低电平,那总线都将变为低电平。 数据有效性 我们记住只要记住一条:IIC总线在进行数据传输时,当SCL线为高,SDA线必须保持稳定,也就是说,在当拉高SCL线的时候,SDA线不能改变其电平,只有当SCL为低电平的时候才允许SDA线进行跳变,需要注意的是这个规定只是在进行数据传输的时候起作用,其他时候比如生成起始信号的时候可以不理睬。 2,IIC的电平信号 在使用IIC总线的时候我们主要有以下几个信号。 一,起始信号当我们使用IIC总线的时候第一个发送的就是这个信号 IIC协议规定当SCL为高电平的时候,SDA由高到低跳变,为起始信号 下面来看一下代码 二,停止信号 IIC协议规定当SCL为高电平的时候,SDA由低到高跳变,为停止信号,和起始信号正好相反 下面来看一下代码 三,应答信号 IIC协议规定当SCL为高电平的时候,SDA为低,为起始信号,注意这里是需要在SCL的高电平到来之前SDA线需先将低电平准备好,并在SCL为高期间稳定

Arduino基础入门―3.连接 IIC 1602 LCD显示文字

匿名 (未验证) 提交于 2019-12-03 00:09:02
1. IIC转接板介绍 Arduino Uno R3开发板的外部IO口是非常有限的。在驱动LCD1602时,尽管我们的数据线使用了4线,相对于8线方式减少一半,但是在需要外接多种传感器的应用中,4线驱动还是占用了过多的IO。本篇介绍LCD1602的IIC驱动方式,通过IIC转接板使用IIC接口,只占用2个IO口就能驱动LCD1602。 IIC「Inter-Integrated Circuit 集成电路总线」是一种串行通信总线,应用于板载低速设备间的通讯。由飞利浦公司开发的这一通讯协议,其目的就是为了简化系统硬件设计,减少设备间的连线。 IIC串行总线有两根信号线,一根是双向的数字线SDA,另一根是时钟线SCL,每个IIC设备都有自己的地址,IIC总线上多个设备间通过设备地址进行区别。 2. 安装驱动库 在Arduino IDE中点击「项目」―「加载库」―「管理库」,查找「LiquidCrystal_I2C」,选择最新版本进行安装。(这个得慢慢找) 3.实验材料 Uno R3开发板 配套USB数据线 面包板及配套连接线 LCD1602液晶屏带IIC转接板 4.实验步骤 4.1.电路连接。 IIC转接板的VCC、GND分别连接开发板5V、GND,转接板的SDA、SCL连接开发板A4、A5。 为什么接A4、A5脚,这里可以参考 3. 详解Arduino Uno开发板的引脚分配图及定义

IIC时序详解

匿名 (未验证) 提交于 2019-12-03 00:03:02
AT24C02是由ATMEL公司提供的,IIC总线串行EEPROM(electronic eraser programmer read only memory),其容量为2kbit(256B),工作电压在2.7v"5.5v之间,生产工艺是CMOS。 一般数字芯片都在左下角和右上角为GND,VCC。容量的计算方法:AT24Cxx :01"1024 容量 = xx * 1kbit。 写入过程: AT24C系列EEPROM芯片的固定部分为1010,A2,A1,A0引脚接高低电平后得到确定的3位编码,形成7位编码即为该器件的地址码。 单片机进行写操作时,首先发送该器件的7位地址码和写方向位”0”(共8位,即一个字节),发送完后释放SDA线并在SCL线上产生第9个时钟信号。被选中的存储器器件在确认是自己的地址后,在SDA线上产生一个应答信号作为响应,单片机收到应答后就可以传送数据了。传送数据时,单片机首先发送一个字节的被写入存储器的首地址,收到存储器器件的应答后,单片机就逐个发送数据字节,但每发送一个字节后都要等待应答。AT24C系列片内地址在接收到每一个数据字节地址后自动加1,在芯片的“一次装载字节数”限度内,只需输入首地址。装载字节数超过芯片的“一次装载字节数”时,数据地址将“上卷”,前面的数据将被覆盖。 字节写: 页写: 读入过程: 单片机先发送该器件的7位地址码和写方向位“0”(

I2C接口与SPI和UART接口的区别

匿名 (未验证) 提交于 2019-12-02 23:37:01
一、SPI I2C UART通信速率比较: SPI > I2C > UART 1、同步通信>异步通信; 2、同步通信时必须有一根时钟线连接传输的两端; 3、都是串行通信方式,并行通信用于内部存储间的通信,如flash; 4、适合传输的距离和通信速率成反比关系; 3-SPI:两条合一的数据线、1时钟线、1CS(设备片选线) SPI:2数据线、1时钟线、1CS(设备片选线)/串行 同步 通信全双工 I2C:1数据线、1时钟线/串行 同步 通信半双工 传输距离比UART短 UART:2数据线、 1地线/串行 异步 通信全双工 传输距离比I2C长些 (I2C接口是“器件间”接口,是在一块板子之内传输数据) (UART是 “设备间”接口,更多的是用于两台设备之间传输数据) 二、串行和并行、同步和异步的区别: 串行通信:利用一条数据线将数据一位一位的顺序传送,特点是通信线路简单,成本低,适合于长距离传送 并行通信:利用多条数据线将数据的各位同时传送,特点是传输速度快,适合于短距离传送 异步:在一个字符的传输时间范围内保持同步即可 同步:在数据传输过程中,需要一根时钟线同步,IIC总线,SPI总线 三、I2C接口与串行接口的区别: I2C 两线式串行总线 UART 通用串行异步收发器串口,UART是串行异步通信接口,它包括RS232、RS499、RS423、RS422和RS485等接口规范和

STM32F103ZET6+光照强度传感器GY-30

匿名 (未验证) 提交于 2019-12-02 23:36:01
单片机读取光照强度在电脑的串口调试助手显示光强: 源文件 #include "GY30.h" #include "delay.h" #include "myiic.h" void bh_data_send(u8 command) { do{ IIC_Start(); //iic开始 IIC_Send_Byte(BHAddWrite); //写地址 }while(IIC_Wait_Ack()); //等待响应 IIC_Send_Byte(command); //发送命令 IIC_Wait_Ack(); //等待响应 IIC_Stop(); //iic停止 } u16 bh_data_read(void) { u16 buf; IIC_Start(); //iic开始 IIC_Send_Byte(BHAddRead); //发送读地址 IIC_Wait_Ack(); //等待响应 buf=IIC_Read_Byte(1); //读取数据 buf=buf<<8; //读取并保存高八位数据 buf+=0x00ff&IIC_Read_Byte(0); //读取并保存第八位数据 IIC_Stop(); //发送停止信号 return buf; } void BH1750init(void) { bh_data_send(BHPowOn); //发送启动信号 bh_data_send

IIC设备

懵懂的女人 提交于 2019-12-01 15:39:49
驱动开发的学习方法:框架 --->流程--->编程 IIC硬件设备(低速总线) 两根信号线:SCL、SDA 总线速度:标准100kbps、快速模式400kbps、高速模式3.4Mbps 特点:半双工通信方式;仅需两根线(所以又被成为2-wire总线);一次传输8位;高位在前,低位在后;总线空闲状态:数据线SDA拉高 IIC硬件的 基本操作原理 启动停止信号:由IIC主机发出 数据传输格式:   SDA线上传输的每个字节要有8位,每次传输没有传输字节多少的限制。启动信号发出后,首先传输的是地址字段。如果IIC总线是主机模式,由主机发送地址地段。每一个字段后必须跟上应答位,字段中的内容(地址/数据) 按照先高位(MSB)后低位(LSB)的顺序传输。 应答信号传输:   对于每一个字节的传送,接收者都要发送一个应答信号给发送者。应答信号在时钟线SCL的第九个时钟时产生。这个应答信号需要的时钟脉冲由主机产生。在第九个时钟周期时,主机释放SDA,由从机驱动SDA线。当主机传送的地址与某个接收者(I2C从机设备)匹配,则这个接受者在第九个时钟周期高电平期间拉低SDA线,即发出一个ACK应答信号。 IIC子系统架构组成:   设备驱动层组件 (i2c-dev.c) 、核心层组件 (i2c-core.c) 、总线驱动层组件 (i2c-s3c2410.c) IIC子系统架构功能作用 设备驱动层组件

IIC通信笔记

浪子不回头ぞ 提交于 2019-12-01 10:17:17
空闲状态 I2C总线总线的SDA和SCL两条信号线 同时处于高电平 时,规定为总线的空闲状态。此时各个器件的输出级场效应管均处在截止状态,即释放总线,由两条信号线各自的上拉电阻把电平拉高。 起始信号与停止信号 起始信号:当SCL为高期间,SDA由高到低的跳变;启动信号是一种电平跳变时序信号,而不是一个电平信号。 停止信号:当SCL为高期间,SDA由低到高的跳变;停止信号也是一种电平跳变时序信号,而不是一个电平信号。 应答信号ACK 发送器每发送一个字节,就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号。 应答信号为低电平时,规定为有效应答位(ACK简称应答位),表示接收器已经成功地接收了该字节;应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。 对于反馈有效应答位ACK的要求是,接收器在第9个时钟脉冲之前的低电平期间将SDA线拉低,并且确保在该时钟的高电平期间为稳定的低电平。 如果接收器是主控器,则在它收到最后一个字节后,发送一个NACK信号,以通知被控发送器结束数据发送,并释放SDA线,以便主控接收器发送一个停止信号P。 数据有效性 I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。 即: 数据在SCL的上升沿到来之前就需准备好