解锁单片机外部通讯宝典:串口、I2C、SPI、CAN详解与实战指南

发布时间: 2024-07-11 02:45:58 阅读量: 43 订阅数: 42
![解锁单片机外部通讯宝典:串口、I2C、SPI、CAN详解与实战指南](https://img-blog.csdnimg.cn/5c9c12fe820747798fbe668d8f292b4e.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAV2FsbGFjZSBaaGFuZw==,size_20,color_FFFFFF,t_70,g_se,x_16) # 1. 单片机外部通讯概述** 单片机外部通讯是指单片机与外部设备或其他单片机进行数据交换和控制的过程。它通常通过串口、I2C、SPI、CAN等通讯协议和硬件接口实现。 外部通讯对于单片机系统来说至关重要,它使单片机能够与外界进行交互,实现各种功能,例如: * 数据采集和传输:从传感器或其他设备获取数据,并将其传输到其他设备或系统。 * 设备控制:通过发送指令控制外部设备,如显示器、电机或其他单片机。 * 网络通信:通过串口或其他协议与其他单片机或计算机建立网络连接。 # 2. 串口通讯 ### 2.1 串口协议和硬件接口 #### 2.1.1 串口协议标准 串口协议定义了数据在串口总线上传输的方式,包括数据格式、波特率、校验方式等。常见的串口协议标准有: - **RS-232C:**最常用的串口协议,采用差分信号传输,支持全双工通信。 - **RS-422:**与RS-232C类似,但采用平衡传输,抗干扰能力更强。 - **RS-485:**采用半双工通信,支持多点连接,适合工业控制等场合。 #### 2.1.2 串口硬件接口 串口硬件接口定义了串口设备之间的物理连接方式,包括引脚定义、电气特性等。常见的串口硬件接口有: - **DB9:**9针接口,常用于RS-232C。 - **DB25:**25针接口,可支持更多信号线。 - **RJ45:**8针接口,常用于RS-485。 ### 2.2 串口编程 #### 2.2.1 串口初始化和配置 串口初始化和配置包括设置波特率、数据格式、校验方式等参数。以STM32单片机为例,串口初始化代码如下: ```c // 初始化串口1 RCC->APB2ENR |= RCC_APB2ENR_USART1EN; // 使能串口1时钟 USART1->BRR = 0x0683; // 设置波特率为9600 USART1->CR1 |= USART_CR1_TE | USART_CR1_RE; // 使能发送和接收 USART1->CR2 |= USART_CR2_STOP1_0; // 设置停止位为1位 ``` #### 2.2.2 串口数据收发 串口数据收发可以通过轮询方式或中断方式实现。轮询方式即不断检查串口状态寄存器,当有数据可收发时再进行操作。中断方式则在串口发生中断时触发中断服务程序,从而提高效率。 ```c // 轮询方式发送数据 while ((USART1->SR & USART_SR_TXE) == 0); // 等待发送缓冲区空闲 USART1->DR = 0x55; // 发送数据 // 中断方式接收数据 void USART1_IRQHandler(void) { if (USART1->SR & USART_SR_RXNE) { uint8_t data = USART1->DR; // 读取接收数据 } } ``` #### 2.2.3 串口中断处理 串口中断处理包括中断向量配置、中断服务程序编写等。以STM32单片机为例,串口1中断向量配置代码如下: ```c NVIC_SetPriority(USART1_IRQn, 3); // 设置串口1中断优先级 NVIC_EnableIRQ(USART1_IRQn); // 使能串口1中断 ``` # 3. I2C通讯 #### 3.1 I2C协议和硬件接口 ##### 3.1.1 I2C协议标准 I2C(Inter-Integrated Circuit)是一种串行通信协议,用于连接多个设备。它采用主从模式,其中一个设备(主设备)控制通信,而其他设备(从设备)响应主设备的请求。 I2C协议的标准定义了以下特性: - **总线拓扑:**I2C总线采用多主从拓扑,允许多个主设备和从设备连接到同一总线上。 - **数据传输:**数据以串行方式传输,一次一位。 - **时钟:**主设备生成时钟信号,从设备同步于此时钟。 - **寻址:**每个从设备都有一个唯一的7位地址,主设备通过发送此地址来选择要通信的从设备。 - **数据格式:**数据以8位字节格式传输,包括一个起始位、一个停止位和一个可选项校验位。 ##### 3.1.2 I2C硬件接口 I2C总线由两根信号线组成: - **SCL(时钟线):**主设备生成时钟信号,从设备同步于此时钟。 - **SDA(数据线):**数据以串行方式在SDA线上传输。 设备连接到I2C总线需要两个外部上拉电阻,分别连接到SCL和SDA线上。这些电阻将总线拉高到逻辑高电平,当没有设备发送数据时,总线处于空闲状态。 #### 3.2 I2C编程 ##### 3.2.1 I2C总线初始化和配置 在使用I2C总线之前,需要对总线进行初始化和配置。这包括设置时钟频率、选择SCL和SDA引脚,以及使能I2C模块。 以下代码示例展示了STM32单片机上I2C总线初始化和配置: ```c // I2C总线初始化 void I2C_Init(void) { // 使能I2C模块时钟 RCC->APB1ENR |= RCC_APB1ENR_I2C1EN; // 配置SCL和SDA引脚 GPIOB->AFR[1] |= GPIO_AFRH_AFRH1_1 | GPIO_AFRH_AFRH1_0; GPIOB->MODER &= ~(GPIO_MODER_MODE1 | GPIO_MODER_MODE0); GPIOB->MODER |= GPIO_MODER_MODE1_1 | GPIO_MODER_MODE0_1; GPIOB->OTYPER &= ~(GPIO_OTYPER_OT1 | GPIO_OTYPER_OT0); GPIOB->PUPDR &= ~(GPIO_PUPDR_PUPD1 | GPIO_PUPDR_PUPD0); GPIOB->PUPDR |= GPIO_PUPDR_PUPD1_0 | GPIO_PUPDR_PUPD0_0; // 配置I2C总线时钟频率 I2C1->CR2 |= (I2C_CR2_FREQ_36MHZ | I2C_CR2_FREQ_16MHZ); // 使能I2C总线 I2C1->CR1 |= I2C_CR1_PE; } ``` ##### 3.2.2 I2C数据收发 I2C数据收发通过以下步骤完成: 1. 主设备发送起始位。 2. 主设备发送从设备地址。 3. 从设备响应。 4. 主设备发送数据(写操作)或接收数据(读操作)。 5. 主设备发送停止位。 以下代码示例展示了STM32单片机上I2C数据收发: ```c // I2C数据发送 void I2C_Send(uint8_t addr, uint8_t *data, uint8_t len) { // 发送起始位 I2C1->CR1 |= I2C_CR1_START; while (!(I2C1->SR1 & I2C_SR1_SB)); // 发送从设备地址 I2C1->DR = (addr << 1); while (!(I2C1->SR1 & I2C_SR1_ADDR)); // 发送数据 for (uint8_t i = 0; i < len; i++) { I2C1->DR = data[i]; while (!(I2C1->SR1 & I2C_SR1_TXE)); } // 发送停止位 I2C1->CR1 |= I2C_CR1_STOP; } // I2C数据接收 void I2C_Receive(uint8_t addr, uint8_t *data, uint8_t len) { // 发送起始位 I2C1->CR1 |= I2C_CR1_START; while (!(I2C1->SR1 & I2C_SR1_SB)); // 发送从设备地址 I2C1->DR = (addr << 1) | 1; while (!(I2C1->SR1 & I2C_SR1_ADDR)); // 接收数据 for (uint8_t i = 0; i < len; i++) { if (i == len - 1) { // 最后一次接收,发送NACK I2C1->CR1 &= ~I2C_CR1_ACK; } while (!(I2C1->SR1 & I2C_SR1_RXNE)); data[i] = I2C1->DR; } // 发送停止位 I2C1->CR1 |= I2C_CR1_STOP; } ``` ##### 3.2.3 I2C中断处理 I2C总线支持中断处理,以提高通信效率。当发生以下事件时,会触发中断: - **接收数据中断:**当从设备接收到数据时触发。 - **发送数据中断:**当主设备发送数据时触发。 - **总线错误中断:**当总线上发生错误时触发,例如仲裁丢失、从设备未响应等。 以下代码示例展示了STM32单片机上I2C中断处理: ```c // I2C中断处理函数 void I2C1_IRQHandler(void) { // 接收数据中断 if (I2C1->SR1 & I2C_SR1_RXNE) { // 读取接收到的数据 uint8_t data = I2C1->DR; } // 发送数据中断 if (I2C1->SR1 & I2C_SR1_TXE) { // 发送数据 I2C1->DR = data; } // 总线错误中断 if (I2C1->SR1 & I2C_SR1_BERR) { // 处理总线错误 } } ``` # 4. SPI通讯 ### 4.1 SPI协议和硬件接口 #### 4.1.1 SPI协议标准 SPI(Serial Peripheral Interface)是一种同步串行通信协议,用于在主设备和一个或多个从设备之间传输数据。它是一种全双工通信协议,这意味着主设备和从设备可以同时发送和接收数据。 SPI协议定义了以下信号: - **SCLK (Serial Clock)**:主设备提供的时钟信号,用于同步数据传输。 - **MOSI (Master Out, Slave In)**:主设备发送数据的信号线。 - **MISO (Master In, Slave Out)**:从设备发送数据的信号线。 - **SS (Slave Select)**:主设备用来选择要通信的从设备的信号线。 #### 4.1.2 SPI硬件接口 SPI硬件接口通常由以下组件组成: - **主设备**:控制通信的设备,通常是微控制器或微处理器。 - **从设备**:与主设备通信的设备,可以是传感器、显示器或其他外围设备。 - **SPI总线**:连接主设备和从设备的信号线集合。 ### 4.2 SPI编程 #### 4.2.1 SPI总线初始化和配置 SPI总线初始化和配置通常涉及以下步骤: - **设置时钟频率**:设置SPI总线时钟的频率。 - **设置数据格式**:设置数据传输的格式,包括数据位数、极性和相位。 - **选择从设备**:使用SS信号选择要通信的从设备。 #### 4.2.2 SPI数据收发 SPI数据收发涉及以下步骤: - **主设备发送数据**:主设备将数据发送到MOSI信号线上。 - **从设备接收数据**:从设备从MISO信号线上接收数据。 - **主设备接收数据**:主设备从MISO信号线上接收数据。 - **从设备发送数据**:从设备将数据发送到MOSI信号线上。 #### 4.2.3 SPI中断处理 SPI中断处理涉及以下步骤: - **启用中断**:启用SPI中断。 - **编写中断服务程序**:编写一个中断服务程序来处理SPI中断。 - **在中断服务程序中处理数据**:在中断服务程序中接收和发送数据。 ### 代码示例 以下是一个使用SPI协议发送和接收数据的代码示例: ```c // SPI初始化和配置 void spi_init(void) { // 设置时钟频率为1MHz SPI_SetClock(1000000); // 设置数据格式为8位,极性为低,相位为0 SPI_SetDataFormat(8, 0, 0); // 选择从设备 SPI_SelectSlave(0); } // SPI数据发送和接收 void spi_transfer(uint8_t *tx_data, uint8_t *rx_data, uint8_t len) { // 发送数据 SPI_SendData(tx_data, len); // 接收数据 SPI_ReceiveData(rx_data, len); } ``` **代码逻辑分析:** - `spi_init()`函数初始化SPI总线,设置时钟频率、数据格式和选择从设备。 - `spi_transfer()`函数发送和接收数据,它将发送数据发送到MOSI信号线上,并从MISO信号线上接收数据。 ### 扩展性说明 SPI协议还可以用于以下目的: - **多主设备通信**:允许多个主设备与同一个从设备通信。 - **全双工通信**:允许主设备和从设备同时发送和接收数据。 - **多速率通信**:允许在不同的数据速率下进行通信。 # 5.1 CAN协议和硬件接口 ### 5.1.1 CAN协议标准 控制器局域网络(CAN)是一种串行通信协议,广泛应用于汽车、工业自动化和医疗设备等领域。CAN协议具有以下特点: - **高可靠性:**CAN采用差分信号传输,抗干扰能力强,误码率低。 - **实时性:**CAN采用优先级机制,确保高优先级消息及时传输。 - **多主站:**CAN总线上可以有多个主站,实现多点通信。 CAN协议的标准规范包括: - **ISO 11898-1:**物理层和数据链路层规范 - **ISO 11898-2:**高层协议规范 ### 5.1.2 CAN硬件接口 CAN硬件接口包括: - **CAN控制器:**负责实现CAN协议的物理层和数据链路层功能。 - **收发器:**将CAN控制器的信号转换成差分信号,并传输到CAN总线上。 - **CAN总线:**双绞线或屏蔽双绞线,用于连接CAN控制器和收发器。 CAN总线具有以下特性: - **总线拓扑:**CAN总线采用总线拓扑结构,所有节点连接在同一根总线上。 - **差分信号:**CAN总线采用差分信号传输,抗干扰能力强。 - **总线电阻:**CAN总线上需要连接两个端接电阻,以匹配总线特性阻抗。
corwn 最低0.47元/天 解锁专栏
送3个月
profit 百万级 高质量VIP文章无限畅学
profit 千万级 优质资源任意下载
profit C知道 免费提问 ( 生成式Al产品 )

相关推荐

Big黄勇

硬件工程师
广州大学计算机硕士,硬件开发资深技术专家,拥有超过10多年的工作经验。曾就职于全球知名的大型科技公司,担任硬件工程师一职。任职期间负责产品的整体架构设计、电路设计、原型制作和测试验证工作。对硬件开发领域有着深入的理解和独到的见解。
专栏简介
本专栏深入探讨单片机与外部通讯的方方面面,涵盖从入门到精通的实战案例、协议详解、程序设计秘籍、中断处理技术、数据传输与校验指南、时序控制与同步秘籍、可靠性设计与故障排除全攻略、电磁兼容性设计指南、安全设计与防护策略、性能优化与调优技巧、高级技术与应用、嵌入式系统设计与开发指南、工业控制与自动化应用、物联网与智能家居应用、医疗电子与可穿戴设备应用、航空航天与国防应用、金融与支付应用、汽车电子与车联网应用、电力电子与新能源应用等各个方面,旨在帮助读者全面掌握单片机外部通讯技术,解决疑难杂症,打造稳定可靠、高效流畅、安全防护的系统,助力各行业创新发展。

专栏目录

最低0.47元/天 解锁专栏
送3个月
百万级 高质量VIP文章无限畅学
千万级 优质资源任意下载
C知道 免费提问 ( 生成式Al产品 )

最新推荐

Styling Scrollbars in Qt Style Sheets: Detailed Examples on Beautifying Scrollbar Appearance with QSS

# Chapter 1: Fundamentals of Scrollbar Beautification with Qt Style Sheets ## 1.1 The Importance of Scrollbars in Qt Interface Design As a frequently used interactive element in Qt interface design, scrollbars play a crucial role in displaying a vast amount of information within limited space. In

Technical Guide to Building Enterprise-level Document Management System using kkfileview

# 1.1 kkfileview Technical Overview kkfileview is a technology designed for file previewing and management, offering rapid and convenient document browsing capabilities. Its standout feature is the support for online previews of various file formats, such as Word, Excel, PDF, and more—allowing user

Statistical Tests for Model Evaluation: Using Hypothesis Testing to Compare Models

# Basic Concepts of Model Evaluation and Hypothesis Testing ## 1.1 The Importance of Model Evaluation In the fields of data science and machine learning, model evaluation is a critical step to ensure the predictive performance of a model. Model evaluation involves not only the production of accura

Expert Tips and Secrets for Reading Excel Data in MATLAB: Boost Your Data Handling Skills

# MATLAB Reading Excel Data: Expert Tips and Tricks to Elevate Your Data Handling Skills ## 1. The Theoretical Foundations of MATLAB Reading Excel Data MATLAB offers a variety of functions and methods to read Excel data, including readtable, importdata, and xlsread. These functions allow users to

Analyzing Trends in Date Data from Excel Using MATLAB

# Introduction ## 1.1 Foreword In the current era of information explosion, vast amounts of data are continuously generated and recorded. Date data, as a significant part of this, captures the changes in temporal information. By analyzing date data and performing trend analysis, we can better under

PyCharm Python Version Management and Version Control: Integrated Strategies for Version Management and Control

# Overview of Version Management and Version Control Version management and version control are crucial practices in software development, allowing developers to track code changes, collaborate, and maintain the integrity of the codebase. Version management systems (like Git and Mercurial) provide

[Frontier Developments]: GAN's Latest Breakthroughs in Deepfake Domain: Understanding Future AI Trends

# 1. Introduction to Deepfakes and GANs ## 1.1 Definition and History of Deepfakes Deepfakes, a portmanteau of "deep learning" and "fake", are technologically-altered images, audio, and videos that are lifelike thanks to the power of deep learning, particularly Generative Adversarial Networks (GANs

Installing and Optimizing Performance of NumPy: Optimizing Post-installation Performance of NumPy

# 1. Introduction to NumPy NumPy, short for Numerical Python, is a Python library used for scientific computing. It offers a powerful N-dimensional array object, along with efficient functions for array operations. NumPy is widely used in data science, machine learning, image processing, and scient

Parallelization Techniques for Matlab Autocorrelation Function: Enhancing Efficiency in Big Data Analysis

# 1. Introduction to Matlab Autocorrelation Function The autocorrelation function is a vital analytical tool in time-domain signal processing, capable of measuring the similarity of a signal with itself at varying time lags. In Matlab, the autocorrelation function can be calculated using the `xcorr

Image Processing and Computer Vision Techniques in Jupyter Notebook

# Image Processing and Computer Vision Techniques in Jupyter Notebook ## Chapter 1: Introduction to Jupyter Notebook ### 2.1 What is Jupyter Notebook Jupyter Notebook is an interactive computing environment that supports code execution, text writing, and image display. Its main features include: -

专栏目录

最低0.47元/天 解锁专栏
送3个月
百万级 高质量VIP文章无限畅学
千万级 优质资源任意下载
C知道 免费提问 ( 生成式Al产品 )