STM32 IIC通信干货!理论+实例

2023-11-14

I2C总线简介

I2C总线介绍

I2C(Inter-Integrated Circuit)总线(也称IIC或I2C)是由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备,是微电子通信控制领域广泛采用的一种总线标准。它是同步通信的一种特殊形式,具有接口线少,控制方式简单,期间封装形式少,通信速率高等优点。

I2C总线特征

两条总线线路:一条串行数据SDA,一条串行时钟线SCL来完成数据的传输及外围器件的扩展
I2C总线上的每一个设备都可以作为主设备或者从设备,而且每一个设备都会对应一个唯一的地址
I2C总线数据传输速率在标准模式下可达100kbit/s,快速模式下可达400kbit/s,高速模式下
可达3.4Mbit/s。一般通过I2C总线接口可编程时钟来实现传输速率的调整,同时也跟所接的上拉电阻的阻值有关。
I2C总线上的主设备与从设备之间以字节(8位)为单位进行单双工的数据传输。

I2C总线物理·拓扑结构

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

I2C总线协议

I2C协议规定: 总线上数据的传输必须以一个起始信号作为开始条件,以一个结束信号作为传输的停止条件。起始和结束信号总是由主设备产生。
空闲状态: SCL和SDA都保持着高电平。
起始信号: 当SCL为高电平而SDA由高到低的跳变,表示产生一个起始条件
结束信号:当SCL为高而SDA由低到高的跳变,表示产生一个 停止条件
在这里插入图片描述

数据传输

数据传输以字节为单位 , 主设备在SCL线上产生每个时钟脉冲的过程中将在SDA线上传输一个数据位,数据在时钟的高电平被采样,一个字节按数据位从高位到低位的顺序进行传输
主设备在传输有效数据之前 要先指定从设备的地址,一般为7位,然后再发生数据传输的方向位, 0表示主设备向从设备写数据,1表示主设备向从设备读数据

应答信号

接收数据的器件在接收到 8bit 数据后,向发送数据的器件发出低电平的应答信号,表示已收到数据。这个信号可以是主控器件发出,也可以是从动器件发出。总之,由接收数据的器件发出。
在这里插入图片描述

I2C总线读写操作

主设备往从设备写数据
在这里插入图片描述
主设备读从设备数据
在这里插入图片描述
主设备读从设备的某个寄存器
在这里插入图片描述

STM32F4-I2C控制器特性

软件模拟I2C时序

由于直接控制 GPIO 引脚电平产生通讯时序时,需要由 CPU 控制每个时刻的引脚状态,所以称之为“软件模拟协议”方式。

硬件控制产生I2C时序

STM32 的 I2C 片上外设专门负责实现 I2C 通讯协议,只要配置好该外设,它就会自动根据协议要求产生通讯信号,收发数据并缓存起来,CPU只要检测该外设的状态和访问数据寄存器,就能完成数据收发。这种由硬件外设处理 I2C协议的方式减轻了 CPU 的工作,且使软件设计更加简单。

在这里插入图片描述

I2C的主要特点

● I2C总线规范 rev03 兼容性:
- 从机模式和主机模式
- 多主机功能
- 标准模式(高达 100kHz )
- 快速模式(高达 400kHz )
- 超快速模式(高达 1 MHz )
- 7 位和 10 位地址模式
- 软件复位
● 1 字节缓冲带 DMA 功能

STM32F4-I2C通讯引脚

STM32芯片有多个I2C外设,它们的I2C通讯信号引出到不同的GPIO引脚上,使用时必须配置到这些指定的引脚。
在这里插入图片描述

EEPROM简介

EEPROM介绍

EEPROM (Electrically Erasable Programmable read only memory),带电可擦可编程只读存储器–一种掉电后数据不丢失的存储芯片。 EEPROM 可以在电脑上或专用设备上擦除已有信息,重新编程。
EEPROM常用来存储一些配置信息,以便系统重新上电的时候加载之。EEPOM 芯片最常用的通讯方式就是 I 2 C 协议
在这里插入图片描述

24CXX简介

AT24XX芯片容量
XX表示:01、02、04、16、32、64、……
单位: Kbit
AT24XX芯片引脚
在这里插入图片描述
在这里插入图片描述

24C65设备地址

在这里插入图片描述

24CXX的设备地址:
24CXX的设备地址为7位:
高4位恒定为 1010
低3位取决于A0-A2的电平状态

注:一般主机在读写24CXX都是把设备地址连同读写位组合成一个字节一起发送

24C65硬件原理图

在这里插入图片描述
设备地址:
读地址: 1010 0001 即 0xA1
写地址: 1010 0000 即 0xA0

24C65读写时序

在这里插入图片描述
在这里插入图片描述

/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  ** This notice applies to any and all portions of this file
  * that are not between comment pairs USER CODE BEGIN and
  * USER CODE END. Other portions of this file, whether 
  * inserted by the user or by software development tools
  * are owned by their respective copyright owners.
  *
  * COPYRIGHT(c) 2018 STMicroelectronics
  *
  * Redistribution and use in source and binary forms, with or without modification,
  * are permitted provided that the following conditions are met:
  *   1. Redistributions of source code must retain the above copyright notice,
  *      this list of conditions and the following disclaimer.
  *   2. Redistributions in binary form must reproduce the above copyright notice,
  *      this list of conditions and the following disclaimer in the documentation
  *      and/or other materials provided with the distribution.
  *   3. Neither the name of STMicroelectronics nor the names of its contributors
  *      may be used to endorse or promote products derived from this software
  *      without specific prior written permission.
  *
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  ******************************************************************************
  */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32f4xx_hal.h"
#include "i2c.h"
#include "usart.h"
#include "gpio.h"

/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);

/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/

/* USER CODE END PFP */

/* USER CODE BEGIN 0 */


#define ReadAddr   0xA1
#define WriteAddr  0xA0

uint8_t Wbuf[20] = "EEPROM TEST OK!";
uint8_t Rbuf[20] = {0};


int fputc(int ch, FILE *p)
{
	while(!(USART1->SR & (1<<7)));
	
	USART1->DR = ch;
	
	return ch;
}


/*********  24C65 写数据函数*****************************/

void  Eeprom_Write(uint16_t MemAddr, uint8_t *Wbuf, uint16_t len )
{
	 while(len--)
	 {
			while(HAL_I2C_Mem_Write(&hi2c1, WriteAddr, MemAddr, I2C_MEMADD_SIZE_16BIT, Wbuf, 1, 100) != HAL_OK){};
		  MemAddr++;
		  Wbuf++;
	 }
}


/*********  24C65 读数据函数*****************************/

void  Eeprom_Read(uint16_t MemAddr, uint8_t *Rbuf, uint16_t len )
{
	 while(HAL_I2C_Mem_Read(&hi2c1, ReadAddr, MemAddr, I2C_MEMADD_SIZE_16BIT, Rbuf  , len, 100) != HAL_OK );
}

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  *
  * @retval None
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_I2C1_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */

	printf("this is i2c eeprom test\n");

	Eeprom_Write(0, Wbuf, sizeof(Wbuf) );
	
	HAL_Delay(500);
	
	Eeprom_Read(0 , Rbuf, sizeof(Rbuf));
	
	printf("READ:  %s\n", Rbuf);


  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {

  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */

}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{

  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;

    /**Configure the main internal regulator output voltage 
    */
  __HAL_RCC_PWR_CLK_ENABLE();

  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

    /**Initializes the CPU, AHB and APB busses clocks 
    */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = 25;
  RCC_OscInitStruct.PLL.PLLN = 336;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 4;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Initializes the CPU, AHB and APB busses clocks 
    */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Configure the Systick interrupt time 
    */
  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

    /**Configure the Systick 
    */
  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

  /* SysTick_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @param  file: The file name as string.
  * @param  line: The line in file as a number.
  * @retval None
  */
void _Error_Handler(char *file, int line)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  while(1)
  {
  }
  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t* file, uint32_t line)
{ 
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

/**
  * @}
  */

/**
  * @}
  */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32 IIC通信干货!理论+实例 的相关文章

  • 51单片机 数码管中断操作

    实践目的 1 掌握中断的概念和思想 2 掌握51单片机中断系统和相关软硬件设计 实践内容 1 利用单片机的P0口接数码管的字段脚 P1 0脚接共阴极 P3 2 P3 3引脚接独立按键产生外部中断信号 编写程序 当程序正常运行时数码管显示H字
  • 处理器指令周期执行时间

    我的猜测是 no operation 内在 ARM 指令应花费 1 168 MHz 来执行 前提是每个NOP在一个时钟周期内执行 我想通过文档验证这一点 有关处理器指令周期执行时间的信息是否有标准位置 我试图确定 STM32f407IGh6
  • 如何更改闪存的起始地址?

    我正在使用 STM32F746ZG 和 FreeRTOS Flash的起始地址是0x08000000 但我想把它改成0x08040000 我通过谷歌搜索了这个问题 但没有找到解决方案 我更改了链接器脚本 如下所示 MEMORY RAM xr
  • 以字符串形式接收数字(uart)

    我正在尝试通过 uart 接收一个包装为字符串的数字 我发送数字 1000 所以我得到 4 个字节 空字符 但是 当我使用 atoi 将数组转换为数字并将整数与 1000 进行比较时 我并不总是得到正确的数字 这是我用于接收号码的中断处理函
  • CMSIS 库是否应该包含在版本控制中? [复制]

    这个问题在这里已经有答案了 通常 我曾经在版本控制中包含芯片供应商 ST 提供的设备特定标头和源以及 CMSIS Core 标头 数量不多 也没有更新的习惯 我使用STM32微控制器 但我不使用立方体框架 or the 标准外设库 最近 我
  • 133-基于stm32单片机停车场车位管理系统Proteus仿真+源程序

    资料编号 133 一 功能介绍 1 采用stm32单片机 4位数码管 独立按键 制作一个基于stm32单片机停车场车位管理系统Proteus仿真 2 通过按键进行模拟车辆进出 并且通过程序计算出当前的剩余车位数量 3 将剩余的车位数量显示到
  • STM32超声波——HC_SR04

    文章目录 一 超声波图片 二 时序图 三 超声波流程 四 单位换算 五 取余计算 六 换算距离 七 超声波代码 一 超声波图片 测量距离 2cm 400cm 二 时序图 1 以下时序图要先提供一个至少10us的脉冲触发信号 告诉单片机我准备
  • SHT10温湿度传感器——STM32驱动

    实验效果 硬件外观 接线 3 3V供电 IIC通讯 代码获取 查看下方 END
  • HAL 锁定和解锁函数如何使用以及为什么?

    我试图理解另一位程序员编写的代码 它使用了I C http en wikipedia org wiki I C2 B2C通信以将数据写入 STM32 微控制器的 EEPROM 一般来说 我理解他的代码是如何工作的 但我不明白他为什么使用HA
  • 解决KEIL编译慢问题

    两种方案 使用v6版本的ARM Compiler 如果v6版本编译不过 必须使用v5版本的 则可以勾选掉Browse Information选项 提升很明显 1分多钟能优化到几秒 看代码量 但是这个有个弊端 在KEIL中会影响函数跳转 建议
  • VS Code 有没有办法导入 Makefile 项目?

    正如标题所说 我可以从现有的 Makefile 自动填充 c cpp properties json 吗 Edit 对于其他尝试导入 makefile 的人 我找到了一组脚本 它们完全可以实现我想要实现的目标 即通过 VS Code 管理
  • 1.69寸SPI接口240*280TFT液晶显示模块使用中碰到的问题

    1 69寸SPI接口240 280TFT液晶显示模块使用中碰到的问题说明并记录一下 在网上买了1 69寸液晶显示模块 使用spi接口 分辨率240 280 给的参考程序是GPIO模拟的SPI接口 打算先移植到FreeRtos测试 再慢慢使用
  • STM32 暂停调试器时冻结外设

    当到达断点或用户暂停代码执行时 调试器可以停止 Cortex 中代码的执行 但是 当皮质停止在暂停状态下执行代码时 调试器是否会冻结其他外设 例如 DMA UART 和定时器 您只能保留时间 r 取决于外围设备 我在进入主函数时调用以下代码
  • 无法使用 OpenOCD 找到脚本文件

    我正在尝试按照本教程将 OpenOCD 与我的 ST 发现板一起使用 https japaric github io discovery README html https japaric github io discovery READM
  • Freertos低功耗管理

    空闲任务中的低功耗Tickless处理 在整个系统运行得过程中 其中大部分时间都是在执行空闲任务的 空闲任务之所以执行 因为在系统中的其他任务处于阻塞或者被挂起时才会执行 因此可以将空闲任务的执行时间转换成低功耗模式 在其他任务解除阻塞而准
  • STM32F4XX的12位ADC采集数值超过4096&右对齐模式设置失败

    文章目录 一 前言 二 问题1 数值超过4096 三 问题1的排错过程 四 问题2 右对齐模式设置失败 五 问题2的解决方法 5 1 将ADC ExternalTrigConv设置为0 5 2 使用ADC StructInit 函数 一 前
  • Cortex-M3与M4权威指南

    处理器类型 所有的ARM Cortex M 处理器是32位的精简指令集处理器 它们有 32位寄存器 32位内部数据路径 32位总线接口 除了32位数据 Cortex M处理器也可以有效地处理器8位和16位数据以及支持许多涉及64位数据的操作
  • STM32 上的位置无关代码 - 指针

    我已成功在 STM32 上构建并运行位置无关的代码 向量表和 GOT 已修补 一切正常 但我对这样的代码有问题 double myAdd double x return x 0 1 double ptrmyAdd double myAdd
  • STM32内部时钟

    我对 STM32F7 设备 意法半导体的 Cortex M7 微控制器 上的时钟系统感到困惑 参考手册没有充分阐明这些时钟之间的差异 SYSCLK HCLK FCLK 参考手册中阅读章节 gt RCC 为 Cortex 系统定时器 SysT
  • HAL_Delay() 陷入无限循环

    我被 HAL Delay 函数困住了 当我调用此函数 HAL Delay 时 控制陷入无限循环 在寻找问题的过程中 我发现了这个 http www openstm32 org forumthread2145 threadId2146 htt

随机推荐

  • 【C++】11新特性:std::thread、std::mutex和两种RAII方式的锁封装

    一 std thread 在C 11之前 开发多线程的程序 一般都是使用pthread create来创建线程 繁琐且不易读 可以看一下它的函数原型 int pthread create pthread t restrict tidp co
  • 第33步 机器学习分类实战:误判病例分析

    填最后一个坑 如何寻找误判的病例 之前我们在介绍AUC的时候 提到了两个函数 predict和predict proba 复习一下 auc test roc auc score y test y testprba roc auc score
  • 麻雀虽小,五脏俱全:上手Google App Engine遇到的问题总结

    虽然不停的见到云计算的相关新闻 而且在CSDN的论坛里也解答过关于Google App Engine持久化方面的问题 但并没有将这两者联系起来 我一直以为GAE是一个类似于Spring或者Hibernate一样的开源项目罢了 最近构思技术族
  • 嵌入式开发(7)系统定时器(SysTick)之延时函数运用

    目录 一 系统定时器 1 简介 2 工作原理 3 频率的概念 二 库函数SysTick定时器操作 系统定时器配置 三 寄存器SysTick定时器操作 1 系统定时器的用途 2 寄存器 3 官方示例 4 毫秒级延时函数 5 微秒和毫秒延时的优
  • ElasticSearch的查询权重-控制查询相关度

    ES查询相关度的官网连接 1 ElasticSearch的查询权重 每个文档与查询的相关度 在全文搜索引擎中不仅需要找到匹配的文档 还需根据它们相关度的高低进行排序 根据全文相关的公式或 相似算法 similarity algorithms
  • Python实现水仙花数代码

    n int input for a in range 10 n 1 10 n if a sum int i n for i in str a print a
  • python 类函数调用外部函数_python类中调用外部函数,python 函数中 定义类

    Q1 python函数里的数组如何在函数外调用出来 使用返回值的方法有两种 可以直接把调用的函数作为变量使用 可以用调用函数给一个变量赋值 第一种情况见如下例子 l 1 2 3 4 5 def add element list elemen
  • 两种方法利用CUDA实现矩阵乘法

    方法一 自己写 创建 cu文件 include
  • 常见的算法思想,全在这里了

    常见的算法思想 1 贪心 贪心算法有很多经典的应用 比如霍夫曼编码 Huffman Coding Prim 和 Kruskal 最小生成树算法 还有 Dijkstra 单源最短路径算法 解决问题步骤 第一步 当我们看到这类问题的时候 首先要
  • 20190708三天总结zrb

    20190705 操作系统 对硬件的第一次扩充 Release 正式版本 内核都为Linux 外观可能使各个品牌 swap 交换分区 1024 2048 根目录 剩余的空间 boot 启动分区 520 1024 虚拟机安装 temp 临时文
  • Vue实现浙政钉扫码登陆(前端部分)

    效果 浙政钉app扫码实现登陆系统 参考文档 浙政钉 H5 小程序应用采集开发手册 语雀 专有钉钉门户 div class login 2code div
  • SpringBoot系列笔记一——SpringBoot项目结构

    SpringBoot 简介 Spring Boot 是一个框架 一种全新的编程规范 他的产生简化了框架的使用 所谓简化是指简化了 Spring 众多框架中所需的大量且繁琐的配置文件 所以 Spring Boot 是一个服 务于框架的框架 服
  • ts自动编译声明文件_webstorm配置TS运行时环境与自动给编译

    webstorm配置TS运行时环境与自动编译 Step 1 安装TypeScipt npm i typescript g Step 2 设置webstorm language Step 3 设置File Watch 添加file watch
  • 针对搜索引擎爬虫的欺骗式SSR

    玩Google Webmasters的可能会有这种经历 自己开发的app用了Vue React 写完后用Fetch as Google一爬傻眼了 爬不到东西 网上搜解决方案出来的都是一堆额外的SSR框架 要上node 还看起来麻烦的要死 对
  • 超清晰-数据结构之线性表

    鸟哥说 坚持学习基础才能有出人头地的一天 不能只专注于练武功了 内功也得练 本篇文章是讲数据结构的第一篇 跟着书好好再过一篇基础 一 线性表 线性表是n个数据特性相同的元素的组成有限序列 是最基本且常用的一种线性结构 线性表 栈 队列 串和
  • 安卓蓝牙广播大全

    android bluetooth 提供了皆如扫描设备 连接设备以及对设备间的数据传输进行管理的类 这些类对蓝牙设备进行功能性管理 蓝牙模块API提供的应用包括了 扫描其它蓝牙设备 通过查询本地蓝牙适配器来匹配蓝牙设备 建立RFCOMM 无
  • layui 附件上传、预览、删除、下载

    layui在开发文档中提供了 附件上传的方法upload render 此篇文章在此模块基础方法上扩展补充了附件预览 删除 下载的实现方法 具体如下 layui 文件 图片上传 layui 相册层 一 html div class layu
  • [无线通信基础-13]:图解移动通信技术与应用发展-1-概述

    前言 移动通信 Mobile communication 是移动体之间的通信 或移动体与固定体之间的通信 移动体可以是人 也可以是汽车 火车 轮船 收音机等在移动状态中的物体 移动通信是进行无线通信的现代化技术 这种技术是电子计算机与移动互
  • 用matlab做高斯混合模型(GMM)聚类分析

    训练GMM参数 options statset MaxIter 1000 gmm gmdistribution fit feature k Covtype Diagonal Regularize 1e 10 Options options
  • STM32 IIC通信干货!理论+实例

    I2C总线简介 I2C总线介绍 I2C Inter Integrated Circuit 总线 也称IIC或I2C 是由PHILIPS公司开发的两线式串行总线 用于连接微控制器及其外围设备 是微电子通信控制领域广泛采用的一种总线标准 它是同