单片机i2c总线程序(i2c总线代码)

海潮机械 2022-12-25 14:46 编辑:admin 296阅读

1. i2c总线代码

两者足同一个东西,i2c是iic的简写

2. 简述i2c总线

应该是不可以的,因为I2C在传输数据的时候高电平是靠外部上拉电阻得到的,也就是要求IO口设置为输入状态。

如果有按键按下是要进行传输数据的,这时候的电平是低电平,I2C传输数据会出现错误。

除非做成有按键按下不进行I2C操作,但是这样的话就不能做时时通讯,主机那面反应会慢。而且也有可能会漏掉一些按键(在I2C通讯的时候不能进行按键扫描)

3. I2C总线协议

IIC总线只有两条线(SCL和SDA),IIC协议其实就是这两条线上的数据传输的时序规定。

主控制芯片通过向IO口(已经与从芯片的IIC端口SCL和SDA连接)按从芯片提供的IIC协议有序并配合地输出高低电平,从而模拟出能实现IIC通信的时序。

4. I2C总线原理

优点

1.许多电子器件,比如说很多的传感器,还有驱动芯片,都支持i2c总线。

2.它只需要两根线就可以驱动十几个设备。

3.有的单片机带有该模块,同时也可以通过软件来模拟实现。

5. I2C总线是什么

管脚数量的话CAN,IIC都是2个,SPI 3个。通信效率来说的话,IIC是半双工效率跟可靠性最差,SPI是全双工,通信效率很高,但是通信距离短,适合于板卡内部芯片通信。

CAN是半双工,主要是可靠性高,属于长远距离通信。

6. i2c代码的详细讲解

MicroPython 在设计上最初就是为了嵌入式微处理器运行,例如在 nRF51822 (256kB flash + 16kB RAM) 的芯片上也可以运行起来,也有人肾得慌在 STM32F103 上跑起来了,从代码上来看 Python 函数栈的官方默认是 16K RAM,也就意味着它可以在许多微芯片上提供一个最小的 Python 代码交互环境,但这并不包含它们的拓展功能,毕竟编译更多的功能代码意味着需要更多的 Flash 或 外部存储。

高度与宽度

根据定位的场景我们可以看到 MicroPython 在硬件的深度可以去到超低功耗芯片开发领域,而采用 Python 语言的开发方式决定了它的软件宽度可以站在全世界热门的 Python 领域中进行借鉴和参考,这带来了许多改变,如改变以往的硬件测试流程和开发流程,改变一贯认为的硬件程序开发困难的刻板印象,这个现象之后会详细阐述。

Arduino(C++)

基于 C++ 代码设计

拥有和 C 兼容的优势,可以无缝接入 ESP-IDF 。

大量遗留的代码库可以直接整合使用。

近年来的提供的外设硬件库质量大幅度下降,导致硬件开发后的稳定性欠缺。

Javascript

常见于 Ruff lite 、 JerryScript 等。

新生事物,同 MicroPython 相似的结构

支持 JS 异步驱动事件模型,要求芯片必须拥有系统(RTOS)。

在硬件上使用浏览器形式的开发方式

硬件驱动相关支持库较弱,基于此深耕硬件接口的开发者不多。

相关的开发资料和代码还不够稳定。

lua

相比 MicroPython 和 JerryScript 它的可移植性要来得更为简单一些。

如仓库:https://github.com/whitecatboard/Lua-RTOS-ESP32

但由于 lua 是小众语言,地位和 bat 、 bash 差不多。

所以不是在开发应用领域里不是很流行,但作为自动化脚本工具还是很棒的。

开发资料相关周边的基本没有,会 lua 的大多都是孤芳自赏,比如我(大概)。

ESPEasy

大概算是一种开发环境,类似于路由器系统(openwrt)

除了好玩,就没有什么用了。

像这样的固件还有很多很多,在这里就不一一举例了。

esp-idf

硬件开发芯片原厂一般都会提供的 SDK ,esp32 提供的多为 esp-idf 、esp-adf 、 esp-mdf 诸如此类,对应的 stm32 的 hal 或 CC25XX stack 等等原生 C 代码 SDK 。

上述开发环境均基于此继续开发得来的产物。

经过了上述的各类开发环境的初步认识,我们就来说说 MicroPython 对比后的优劣吧。

MicroPython 的优劣

我们不难看到,MicroPython 和 Python 一样,发挥了胶水语言的优势,最大化的兼容和保持了各自的优势,减少自己的劣势。

在动态语言大战中,MicroPython 保留了面向过程、对象、切面、函数的编程语法,丰富的开发方式带来了代码的开发广度,反观 lua 从语法上砍掉了大量开发常用的语法糖,大幅度的裁剪代码量,在开发者开箱即用的角度来看, MicroPython 迎合了大多数开发者的拿来主义(我?)。

与 JavaScript 相比的 Python 在性能上没有太多的优势,唯一的优势就是 Js 的编程思维并不适合长期浸染在面向过程领域里的 C 语言硬件编程,例如串口收发这样简单的一件事情,在 Js 的异步事件绑定模型下,需要设置一些回调函数等待处理,而在 MicroPython 中,通过多线程可以实现 Js 的效果,但没有多线程也可以通过 While 死循环轮询或非阻塞状态机来实现同样的功能,而后者的死循环就是嵌入式 C 中的常见编程习惯了,但在 JS 的硬件编程中,某个函数若是发生了死循环,那真的是一种灾难,所有的后台线程都无法运行了,但死循环这样的开发方式真的太烂了,建议硬件开发的时候多写异步驱动代码,或者是状态机代码,以提高 IO 性能。

因此 MicroPython 在众多动态语言中与 C 语言的兼容性为最佳,在程序设计上也是如此,向下兼容语言的同时又吸取了上层优秀代码的精髓,尤其是异常机制和动态类型。

此时相比 C 或 C++ 语言,MicroPython 牺牲了一些执行性能,平均每段 Python 代码回到 C 的执行函数操作额外增加了 5 us 左右,这是我在写软串口的时候发现的,但也带来了解释器接口(其他动态语言也是如此),通过动态调整执行接口的参数,加速了硬件程序的验证与开发。

在面对硬件程序的主控方面的开发,经常面对大量的硬件 API 通信调试,就像调试网络服务里的 HTTP API ,对硬件里的 UART 、I2C 、 SPI 、RS485、CAN 等等从机设备的控制,使用 MicroPython 进行开发验证,要比纯粹使用 C 、Arduino 来的更为迅速,毕竟它们编译一次 2 分钟,运行 10 秒,而 MicroPython 烧录 2 分钟,之后每隔 5 秒运行反复运行,这也得益于 MicroPython 的硬件外设驱动的开发相当可靠和稳定(其实是 ESP-IDF 稳定可靠的原因 XD )。

所以别人花一天调试的硬件接口,我几个小时就可以调试得七七八八了,尤其是多机协议的反复测试接口,例如: Modbus readaddr 或是 I2C.scan 这类接口。当然,上述的这种开发哪怕是封装成 AT 指令的接口方式也可以做到,但在 Python 解释器的基础上可以编写更多复杂的后续逻辑操作,而非 AT固件的指定接口形式调试。

综上所述, MicroPython 的硬件开发地位处于硬件开发的初期验证和原始开发阶段,在后期大多都会转回 C ,而软件领域里,则有大量的逻辑示例代码供硬件开发调用和测试,对于硬件开发人员,将会获得更多控制硬件的方法,对于软件人员也会更容易的配合硬件人员开发硬件和调试硬件。

结语

7. i2c总线是什么

  I2C 总线在物理连接上非常简单,分别由SDA(串行数据线)和SCL(串行时钟线)及上拉电阻组成。通信原理是通过对SCL和SDA线高低电平时序的控制,来产生I2C总线协议所需要的信号进行数据的传递。在总线空闲状态时,这两根线一般被上面所接的上拉电阻拉高,保持着高电平。

I2C通信方式为半双工,只有一根SDA线,同一时间只可以单向通信,485也为半双工,SPI和uart为双工。

8. I2C总线是什么意思

一、优势不同:

1、IIC:

IIC总线是双向、两线(SCL、SDA)、串行、多主控(mulTI-master)接口标准,具有总线仲裁机制,非常适合在器件之间进行近距离、非经常性的数据通信。在它的协议体系中,传输数据时都会带上目的设备的设备地址,因此可以实现设备组网。

2、SPI:

SPI在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,越来越多的芯片集成了这种通信协议。

二、硬件结构不同:

1、IIC:

IIC串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有接到I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。

2、SPI:

SPI总线是一种4线总线,也是所有基于SPI的设备共有的,它们是MISO(主设备数据输入)、MOSI(主设备数据输出)、SCLK(时钟)、CS(片选)。

性能特点

SPI的片选可以扩充选择16个外设,这时PCS输出=NPCS,说NPCS0~3接4-16译码器,这个译码器是需要外接4-16译码器,译码器的输入为NPCS0~3,输出用于16个外设的选择。

如果应用中必须使用高速数据传输,那么SPI是更好的选择。因为SPI是全双工,IIC的不是。SPI没有定义速度限制,一般的实现通常能达到甚至超过10 Mbps。IIC 最高的速度也就快速+模式(1 Mbps)和高速模式(3.4 Mbps),后面的模式还需要额外的I/O缓冲区,还并不是总是容易实现的

9. I2C总线接口

I2C 总线在物理连接上非常简单,分别由SDA(串行数据线)和SCL(串行时钟线)及上拉电阻组成。通信原理是通过对SCL和SDA线高低电平时序的控制,来产生I2C总线协议所需要的信号进行数据的传递。在总线空闲状态时,这两根线一般被上面所接的上拉电阻拉高,保持着高电平。

I2C通信方式为半双工,只有一根SDA线,同一时间只可以单向通信,485也为半双工,SPI和uart为双工。