【总线接口】3.常见总线、接口GPIO、I2C、SPI、I2S、Modbus

 初接触硬件,五花八门的总线、接口一定会让你有些疑惑,我尝试用一系列文章来解开你的疑惑。

系列文章

【总线接口】1.以Xilinx开发板为例,直观的认识硬件接口

【总线接口】2.学习硬件这些年接触过的硬件接口、总线 · 大汇总

【总线接口】3.常见总线、接口GPIO、I2C、SPI、I2S、Modbus

【总线接口】4.一些和串口相关的概念:UART、TTL、RS232、RS485、RS422、RJ45

【总线接口】5.模拟视频和数字视频接口大汇总:CVBS、S-video、Component、BNC、VGA、RCA

【总线接口】6.显示屏相关总线、接口:DVI、HDMI、SDI、DisplayPort、Camera link

【总线接口】7.音频相关接口

【总线接口】8.SD卡和SDOI

【总线接口】9.Serdes是个“大家族”

【总线接口】10.PCI与PCI-E

【总线接口】11.RAM和ROM的一些相关概念

【总线接口】12.关于DDR你了解多少?

【总线接口】13.常见的硬盘接口与相关协议

【总线接口】14.DDR、EEPROM、SATA的关系

【总线接口】15.硬件板卡上常见的FMC接口

【总线接口】16.汽车总线:CAN、LIN、MOST

【总线接口】17.常见的JTAG是个什么协议?

【总线接口】18.航电总线你了解多少?

【总线接口】19.简单介绍USB“大家族”

【总线接口】20.常见网络接口:RJ45

【总线接口】21.硬件板卡上常见的:M12、SMA

【总线接口】22.光模块:SFP、CFP与OSFP 


几条说明

  1. 本文只罗列接口,这会是一个大系列的文章,让硬件新人系统的了解总线、协议、硬件接口;
  2. 列表里总线、接口、连接器都有,混在一起了,后续文章会根据下面这个大致的划分,去简单介绍;
  3. 有重复的列举;
  4. 划分有不严谨的地方;

目录

系列文章

几条说明

1 硬件总线和接口

1.1硬件总线

1.2硬件接口

2 GPIO

2.1概念

2.2应用实例

3 I2C

3.1概念

3.2应用实例

4 SPI

4.1概念

4.2应用实例

5 I2S

5.1概念

5.2应用实例

6 Modbus

6.1概念

6.2应用实例

6.3Modbus RTU协议

6.4Modbus TCP协议


1 硬件总线和接口

1.1硬件总线

硬件总线是连接计算机各种功能部件之间的公共通信干线,是各部件间传输信息的公用通道。它是由导线组成的传输线束,按照计算机所传输的信息种类,计算机的总线可以划分为数据总线、地址总线和控制总线,分别用来传输数据、数据地址和控制信号。硬件总线是一种内部结构,CPU、内存、输入、输出设备通过总线相连接,外部设备通过相应的接口电路再与总线相连接,从而形成了计算机硬件系统。硬件总线有一定的承载能力上限,我们把总线在单位时间内传输的数据量称为总线的带宽。硬件总线有多种分类方式,如按照信息传输的形式可分为并行总线和串行总线,按照连接的部件可分为芯片内总线和系统总线等。

1.2硬件接口

硬件接口(hardware interface)是指两个硬件设备之间的连接方式。它既包括物理上的接口,如USB接口、HDMI接口等,也包括逻辑上的数据传送协议,如IDE接口、SCSI接口等。硬件接口的作用是使不同的硬件设备能够相互协作、交换信息或提供服务,实现设备间的通信和控制。硬件接口有多种分类方式,如串行接口和并行接口等。


2 GPIO

2.1概念

GPIO的英文全称为General-Purpose Input/Output,中文含义是通用输入输出接口。GPIO是指数字信号的输入输出端口,通常用于连接外部硬件设备或传感器等,从而实现计算机与外部设备的通信和控制。GPIO可以通过软件进行配置,使其成为输入或输出模式,然后根据需要读取或写入数据。在嵌入式系统、微控制器、智能硬件等领域中,GPIO是非常常见的接口之一,它使得硬件和软件之间能够进行灵活的交互和控制。

2.2应用实例

如下图海思hi3516A对外提供GPIO接口

Hi3516A 支持 16 组 GPIO( General Purpose Input/Output),即 GPIO0~GPIO15。每组GPIO 提供 8 个可编程的输入输出管脚( GPIO15 只有 3 个)。每个管脚可以配置为输入或者输出。这些管脚用于生成特定应用的输出信号或采集特定应用的输入信号。作为输入管脚时, GPIO 可作为中断源;作为输出管脚时,每个 GPIO 都可以独立地清 0 或置 1。

GPIO 可以根据电平或跳变值产生可屏蔽的中断。 GPIOINTR( General Purpose InputOutput Interrupt)信号给中断控制器一个指示,表示有中断发生。


3 I2C

3.1概念

I2C的英文全称为Inter-Integrated Circuit,中文含义是集成电路间总线。I2C是一种串行通信协议,用于连接微控制器和各种外围设备,如传感器、EEPROM、实时时钟等。它使用两根线:一根用于传输数据(SDA),另一根用于时钟(SCL)。I2C总线支持多设备连接,可以在总线上挂载多个设备,并通过地址码进行设备间的通信。

3.2应用实例

如下图海思hi3516A内部总线有挂接IIC总线

这里I2C 模块的作用是完成 CPU 对 I2C 总线上连接的从设备的读写。当 CPU 对从设备做写操作时, CPU 通过总线配置 I2C 模块的配置寄存器,然后发送控制信息和操作数到 I2C模块的数据通信寄存器; I2C 模块解析命令后将数据通道寄存器的数据通过 I2C 总线发给从设备,发送完毕后将最终的状态通过中断反馈给 CPU。 CPU 读取从设备数据的过程与写操作类似。


4 SPI

4.1概念

SPI的英文全称为Serial Peripheral Interface,中文含义是串行外设接口。SPI是一种同步串行通信协议,常用于微控制器和外围设备之间的通信,如闪存、传感器、RFID等。SPI使用四根线:一根用于传输时钟(SCK),一根用于主设备到从设备的数据传输(MOSI),一根用于从设备到主设备的数据传输(MISO),以及一根用于从设备的片选信号(Chip Select)。SPI通信速度快,数据传输效率高。

4.2应用实例

如下图海思hi3516A ISP控制器实现数据的串并、并串转换,可以作为 Master 与外部设备进行同步串行通信。支持 MOTOROLA 的 SPI、 TI 串行同步、 MicroWire 三种外设接口协议


5 I2S

5.1概念

I2S的英文全称为Inter-IC Sound,中文含义是集成电路间音频总线。I2S最初用于数字音频信号的传输,现已广泛应用于各种数字音频设备之间的通信。I2S使用三根线:一根用于传输时钟(SCK),一根用于数据(SD)和另一根用于声道选择(WS)。I2S支持多种采样率,可以传输左声道和右声道的数据。

I2S和I2C没有任何关系。

5.2应用实例

如下图I2S接CS4344立体声音频数模转换器 (DAC)方案

详细可参考:基于MM32F3270 I2S 使用 | MCU加油站


6 Modbus

6.1概念

Modbus的英文全称为Modicon Modbus,中文含义是莫迪康Modbus。Modbus是一种串行通信协议,常用于工业自动化领域中连接可编程逻辑控制器(PLC)和其他工业设备。Modbus使用两根线:一根用于传输数据(Serial Data),另一根用于接收时钟(Serial Clock)。Modbus支持多种数据传输模式,如ASCII码和RTU(远程终端单元)模式。

6.2应用实例

如下图一个自动化项目Modbus互联总线

在工业和楼宇自动化项目中,网络基础设施中不同现场总线设备的连接是已知的。面临的挑战是在在一个全面的IP网络中连接具有不同协议标准的不同制造商。现场总线级别的传感器和执行器通过 Modbus RTU 进行通信,必须集成到 Modbus TCP 网络中。

为了将Modbus RTU协议转换为Modbus TCP协议,需要使用Modbus网关。Modbus网关是Modbus RTU/Modbus TCP网关,主要将Modbus RTU协议转换为Modbus TCP协议(或相反)。

参考资料:METZ CONNECT | Network connection of Modbus RTU fieldbus components made easy

6.3Modbus RTU协议

Modbus RTU(Remote Terminal Unit)协议是一种串行通信协议,属于应用层的一层协议。RTU协议是一种开放的、主要用于工业自动化领域的通信协议,常用于连接可编程逻辑控制器(PLC)和其他工业设备。Modbus RTU协议使用RS-232、RS-485或RS-422等串行接口进行通信,通过主从方式实现设备间的数据传输和控制。

在Modbus RTU协议中,通信的双方被称为“主站”和“从站”。主站负责发起通信请求,从站被动地响应主站的请求。主站通过发送数据请求报文来从从站中读取数据,从站接收到请求后,根据请求的内容返回相应的数据给主站。

Modbus RTU协议具有简单明了、易于组网的特点,因此在工业自动化领域得到了广泛应用。由于其开放性和互操作性,许多厂商都在其产品中实现了对Modbus RTU协议的支持,使得不同厂商的设备可以方便地进行互联和通信。

Modbus RTU协议的传输方式是半双工的,即数据只能在一个方向上传输。它采用二进制格式进行数据传输,相对于ASCII码来说更加高效和可靠。此外,Modbus RTU协议还支持多种数据传输模式,如点对点、多点通信等,可以满足不同应用场景的需求。

6.4Modbus TCP协议

Modbus TCP(Transmission Control Protocol)协议是一种基于以太网的通信协议,它将Modbus协议与TCP/IP协议相结合,实现了Modbus协议在以太网中的应用。

Modbus TCP协议使用TCP/IP协议进行数据传输,因此它可以在互联网上进行通信,也可以通过路由器和交换机等网络设备进行数据传输。与Modbus RTU协议不同,Modbus TCP协议是一种全双工的通信协议,即数据可以在两个方向上进行传输。

在Modbus TCP协议中,数据帧的结构与Modbus RTU协议类似,包括地址码、功能码、数据区和校验码等部分。但是,Modbus TCP协议没有采用RTU的二进制格式,而是采用了TCP的字节流格式进行数据传输。此外,Modbus TCP协议还支持多种以太网接口,如10Base-T、100Base-TX和1000Base-T等。

由于Modbus TCP协议具有高速、可靠和灵活的特点,因此在工业自动化领域得到了广泛应用。通过将Modbus协议与TCP/IP协议相结合,Modbus TCP协议可以方便地实现不同厂商的设备之间的互联和通信,提高设备的互操作性和集成度。

  • 45
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
SPII2C接口常见的数字接口,它们可以用于连接各种外设如传感器、显示器和存储器等。 初始化SPI接口的步骤如下: 1. 配置SPI总线的时钟、数据位数和通信模式等参数; 2. 配置SPI接口的引脚,包括SCK、MOSI、MISO和CS等引脚; 3. 使能SPI接口,并设置为主设备或从设备模式; 4. 在主设备模式下,通过调用SPI发送函数发送数据;在从设备模式下,通过调用SPI接收函数接收数据。 以下是使用STM32F4系列MCU初始化SPI接口的示例代码: ```c #include "stm32f4xx.h" void SPI_Init(void) { SPI_InitTypeDef SPI_InitStruct; // 使能SPI时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); // 配置SPI参数 SPI_StructInit(&SPI_InitStruct); SPI_InitStruct.SPI_Mode = SPI_Mode_Master; SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b; SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low; SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge; SPI_InitStruct.SPI_NSS = SPI_NSS_Soft; SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; SPI_Init(SPI1, &SPI_InitStruct); // 配置SPI引脚 GPIO_InitTypeDef GPIO_InitStruct; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); GPIO_StructInit(&GPIO_InitStruct); GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1); GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1); GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1); // 使能SPI SPI_Cmd(SPI1, ENABLE); } ``` 初始化I2C接口的步骤如下: 1. 配置I2C总线的时钟和通信速率等参数; 2. 配置I2C接口的引脚,包括SCL和SDA等引脚; 3. 配置I2C从设备地址; 4. 使能I2C接口,并设置为主设备或从设备模式; 5. 在主设备模式下,通过调用I2C发送函数发送数据;在从设备模式下,通过调用I2C接收函数接收数据。 以下是使用STM32F4系列MCU初始化I2C接口的示例代码: ```c #include "stm32f4xx.h" void I2C_Init(void) { I2C_InitTypeDef I2C_InitStruct; // 使能I2C时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); // 配置I2C参数 I2C_StructInit(&I2C_InitStruct); I2C_InitStruct.I2C_Mode = I2C_Mode_I2C; I2C_InitStruct.I2C_DutyCycle = I2C_DutyCycle_2; I2C_InitStruct.I2C_OwnAddress1 = 0x00; I2C_InitStruct.I2C_Ack = I2C_Ack_Disable; I2C_InitStruct.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_InitStruct.I2C_ClockSpeed = 100000; I2C_Init(I2C1, &I2C_InitStruct); // 配置I2C引脚 GPIO_InitTypeDef GPIO_InitStruct; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); GPIO_StructInit(&GPIO_InitStruct); GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_OType = GPIO_OType_OD; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOB, &GPIO_InitStruct); GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_I2C1); GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_I2C1); // 使能I2C I2C_Cmd(I2C1, ENABLE); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神仙约架

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值