STM32F103C8开发I2C通信(六)

2023-05-16

关于参数id的说明:
id是指与MCU相通信的设备的地址,其中id为七位地址,最后一位作为读写标志位使用;
例如:当外接设备为型号为24C02的E2PROM时,根据24C02数据手册说明地址为0B1010000,则补全为8位为0B10100000,16进制为0xA0;
#include "stm32f10x.h"
#define I2C_Speed              400000
#define I2C1_SLAVE_ADDRESS7    0xA0
void I2C_Start(void)
{
	GPIO_InitTypeDef GPIO_InitS;
	I2C_InitTypeDef I2C_InitS;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);

	GPIO_InitS.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
	GPIO_InitS.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitS.GPIO_Mode = GPIO_Mode_AF_OD;
	GPIO_Init(GPIOB, &GPIO_InitS);

	I2C_InitS.I2C_Mode = I2C_Mode_I2C;
	I2C_InitS.I2C_DutyCycle = I2C_DutyCycle_2;
	I2C_InitS.I2C_OwnAddress1 = I2C1_SLAVE_ADDRESS7;
	I2C_InitS.I2C_Ack = I2C_Ack_Enable;
	I2C_InitS.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
	I2C_InitS.I2C_ClockSpeed = I2C_Speed;

	I2C_Cmd(I2C1, ENABLE);
	I2C_Init(I2C1, &I2C_InitS);
}

void I2C_WriteByte(uint8_t id, uint8_t w_addr, uint8_t* p_data)
{
	I2C_GenerateSTART(I2C1, ENABLE);
	while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
	I2C_Send7bitAddress(I2C1, id, I2C_Direction_Transmitter);
	while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
	I2C_SendData(I2C1, w_addr);
	while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
	I2C_SendData(I2C1, *p_data);
	while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
	I2C_GenerateSTOP(I2C1, ENABLE);
}

void I2C_WriteBlock(uint8_t id, uint8_t w_addr, uint8_t* p_data, uint16_t len)
{
	uint16_t i = 0;
	I2C_GenerateSTART(I2C1, ENABLE);
	while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
	I2C_Send7bitAddress(I2C1, id, I2C_Direction_Transmitter);
	while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
	I2C_SendData(I2C1, w_addr);
	while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
	while (i < len) {
		I2C_SendData(I2C1, *p_data);
		while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
		i++; p_data++;
	}
	I2C_GenerateSTOP(I2C1, ENABLE);
}

void I2C_ReadByte(uint8_t id , uint8_t r_addr, uint8_t* p_data)
{
	I2C_ReadBlock(id, r_addr, p_data, 1);
}

void I2C_ReadBlock(uint8_t id, uint8_t r_addr, uint8_t* p_data, uint16_t len)
{
	while (I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
	I2C_GenerateSTART(I2C1, ENABLE);
	while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
	I2C_Send7bitAddress(I2C1, id, I2C_Direction_Transmitter);
	while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
	I2C_Cmd(I2C1, ENABLE);
	I2C_SendData(I2C1, r_addr);
	while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
	I2C_GenerateSTART(I2C1, ENABLE);
	while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
	I2C_Send7bitAddress(I2C1, id, I2C_Direction_Receiver);
	while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
	while (len)
	{
		if (len == 1)
		{
			I2C_AcknowledgeConfig(I2C1, DISABLE);
			I2C_GenerateSTOP(I2C1, ENABLE);
		}
		if (I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED))
		{
			*p_data = I2C_ReceiveData(I2C1);
			p_data++;
			len--;
		}
	}
	I2C_AcknowledgeConfig(I2C1, ENABLE);
}

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

STM32F103C8开发I2C通信(六) 的相关文章

  • nRF52832的I2C例程代码

    nRF52832的I2C例程代码 include 34 nrf drv i2c h 34 include 34 app error h 34 define I2C SCL PIN 0 SCL引脚号 define I2C SDA PIN 1
  • 使用 Keil uVision 和 STM32CubeMX 对 STM32F103C8 进行编程

    采用ARM Cortex M架构的STM32微控制器因其特性 成本和性能而在许多应用中得到广泛应用 在之前的教程中 xff0c 我们已经使用Arduino IDE编程了STM32F103C8 使用Arduino IDE编程STM32很简单
  • Jetson nano i2c教程(MPU6050 + PCA9685)

    首先介绍nano板子上的i2c相关的硬件信息 xff1a 安装所需要的i2c库 sudo apt get install l y i2c tools 完成nano中io与i2c设备的硬件接线 本次案例使用的是PCA9685和MPU6050
  • PX4代码中LIDAR-Lite v3激光测距仪I2C驱动

    调试LIDAR Lite v3激光测距仪 xff0c 通读了PX4代码中驱动相关的部分 在这里做一下记录 飞控硬件是pixhawk1 xff0c PX4软件版本为1 7 3 按照官方教程进行接线和配置 xff0c 链接为 https doc
  • DHT12温湿度传感器IIC,I2C接口调试心得和代码说明

    来源 xff1a http www fuhome net bbs forum php mod 61 viewthread amp tid 61 2141 DHT11那个单总线的温湿度传感器用的很多了 xff0c aosong推出了DHT12
  • PX4通过I2C方式添加自定义传感器(3)

    添加自定义传感器并实现数据的发送和订阅 1 前期准备 1 1 建立文件夹和相关文件配置 我是在src drivers distance sensor文件夹下操作的 xff0c 当然其他文件夹下都类似 首先建立了两个文件夹angle sour
  • 关于I2C和SPI总线协议

    关于I2C和SPI总线协议 IICvs SPI 现今 xff0c 在低端数字通信应用领域 xff0c 我们随处可见IIC Inter Integrated Circuit 和 SPI Serial Peripheral Interface
  • I2C总线基础知识及操作详解

    I2C总线是一种简单的双向两线式同步串行总线 xff0c 最初由Philips公司开发 xff0c 后又经过几次发展和完善 xff0c 目前已被业界厂商广泛采用 xff0c 成为最常用的板级通信总线之一 xff0c 大量应用于处理器与外围设
  • UART、RS232、RS485、I2C和SPI的介绍

    基本知识 串行通信 xff1a 多个数据通过一条数据线 xff0c 依次传输并行通信 xff1a 多个数据通过多条数据线 xff0c 一次性传输单工通信 xff1a 只能接收数据或者发送数据 xff08 遥控器 收音机 xff09 半双工通
  • STM32软件模拟I2C从机的实现方法

    1 1 前言 在使用I2C通信时 xff0c 一般会用到软件模拟I2C 目前网络上能搜索到的软件模拟I2C一般都是模拟I2C主机 xff0c 很少有模拟I2C从机的例程 由于I2C主机在进行数据收发时 xff0c 有明确的可预见性 xff0
  • stm32的HAL库i2c从机实现

    stm32的i2c默认就是slave模式 xff0c 本文基于HAL库实现中断方式的接收和发送 xff0c 首先是初始化gpio和i2c xff0c 代码如下 xff1a I2C HandleTypeDef I2cHandle void H
  • 海思文件系统缺少文件himm 、i2c_read 、i2c_write 、ssp_read 、ssp_write

    原因 xff1a 海思根文件默认没有把himm i2c read i2c write ssp read ssp write工具集成在bin里 xff0c 但是在sdk中 解决办法 xff1a cd osdrv tools board reg
  • Arduino读取DHT11的温湿度显示在基于I2C的1602上

    背景摘要 又到了周末 xff0c B站的番还未更新 闲来无事 xff0c 搞搞吃灰已久的Arduino 南方的冬天真冷啊 xff0c 测测屋子里的温湿度怎么样 xff01 为了测量屋子里的温湿度 xff0c 就用简单大方的Arduino x
  • 串口通信协议 UART+I2C+SPI

    UART 异步 串行 全双工 I2C SPI 不同通信协议比较 UART UART协议详解 UART通信 xff0c 接收与发送 xff08 详细版 xff0c 附代码 xff09 UART串行通信详解 待整理 UART是Universal
  • 【总线】I2C 通信协议

    目录 I2C 总线协议概述 参数总结 I2C 的工作原理 寻址 读 写位 数据帧 I2C数据传输的步骤 具有多个从机的单个主机 具有多个从机的多个主机 I2C的优缺点 优点 缺点 文章参考 I2C 总线协议概述 I2C 总线广泛应用在 OL
  • STM32设置为I2C从机模式

    STM32设置为I2C从机模式 目录 STM32设置为I2C从机模式 前言 1 硬件连接 2 软件编程 3 运行测试 3 1 I2C连续写入 3 2 I2C连续读取 3 3 I2C单次读写测试 4 总结 前言 STM32的I2C作为主机的情
  • HAL 锁定和解锁函数如何使用以及为什么?

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

    我正在使用 STM32F207 微控制器在 STM3220G EVAL 板上学习嵌入式开发 我尝试通过连接同一芯片上的两个 I2C2 和 I2C3 模块并发送 接收字符来测试 I2C 接口 这是我当前编写的代码 使用 mdk arm 5 i
  • 使用 C++ 和 i2c 工具从虚拟 i2c 写入和读取

    我正在尝试使用 C 写入和读取 I2C 总线 我的I2C总线是虚拟的 第一件事是加载内核模块i2c stub 我可以通过 bash 完成所有事情 现在我将其移植到 C 我可以打开i2c总线 获取特定地址的i2c总线 但无法读写 我正在虚拟化
  • 如何转换温度传感器得到的值?

    我在ST工作Temperature sensor hts221 我用I2C与传感器的命令通信 我从文档中看到类似以下文字 enter code here Temperature data are expressed as TEMP OUT

随机推荐

  • java创建线程的三种方式及其对比

    Java中创建线程主要有三种方式 xff1a 一 继承Thread类创建线程类 xff08 1 xff09 定义Thread类的子类 xff0c 并重写该类的run方法 xff0c 该run方法的方法体就代表了线程要完成的任务 因此把run
  • 史上最全面最易懂的,Spring框架学习教程

    Spring通过PlatformTransactionManager平台事务管理器接口对事务的管理进行高度抽象 xff0c 但是该接口下具体的实现是由各个平台自己实现 xff0c Spring并不直接管理事务 xff0c 而是提供了多种事务
  • 'hibernate.dialect' must be set when no Connection available

    今天碰到的这个问题 xff0c 很无厘头 xff0c 网上搜索了很多 xff0c 都不靠谱 xff0c 还是靠自己 解决方法是在hibernate cfg xml中添加 lt property name 61 34 dialect 34 g
  • javascript动态插入html元素

    主要有是两种方案 xff1a 1 使用DOM span class hljs comment 使用createElement创建元素 span span class hljs keyword var span dialog 61 docum
  • python中switch语句用法

    python中是没用switch语句的 xff0c 这应该是体现python大道至简的思想 xff0c python中一般多用字典来代替switch来实现 coding utf 8 from future import division d
  • ROS的 sudo rosdep init 的报错终极解决方案

    ROS的 sudo rosdep init 的报错解决方案 安装ROS时sudo rosdep init指令报错 xff1a ERROR span class token operator span cannot download span
  • 干支纪年

    干支纪年 摘自 xff1a http baike baidu com view 187057 htm 1 天干 xff08 甲 xff09 象草林破土而萌 xff0c 阳在内而被阴包裹 又有认为 xff0c 甲者铠甲也 xff0c 把万物冲
  • “密码不满足密码策略的要求,检查最小密码长度、密码复杂性和密码历史的要求”的解决办法(Windows...

    Windows Server 2003解决办法是 xff1a 选择 开始 gt 程序 gt 管理工具 gt 域安全策略 gt 帐户策略 gt 密码策略 密码必须符合复杂性要求 xff1a 由 已启用 改为 已禁用 xff1b 密码长度最小值
  • 解决android studio 不同ApplicationId可能导致xmlns命名空间报错

    遇到一个需求 xff0c 想出不同渠道 xff0c 我们可以知道在build gradle里面声明 productFlavors dev minSdkVersion 21 applicationId 34 xxx xxx xxx 34 ma
  • Manjaro Linux KDE 安装后的配置

    一 更换中国源 span class token function sudo span pacman mirrors i c China m rank 这个命令执行完毕的时候后弹窗让你选择想要使用的源 xff0c 选择速度最快的那个就可以了
  • 盘点程序员情人节的表白,前端程序员最浪漫,后端不服来战

    loonggg 读完需要3分钟 速读仅需1分钟 今天是七夕 xff0c 中国的情人节 xff0c 当然了就是牛郎和织女团聚的日子 在 IT 群体中 xff0c 很多人都说程序员不浪漫 xff0c 程序员不懂得浪漫 xff0c 程序员木讷 x
  • 毕业设计 Spring Boot的在线音乐网站系统(含源码+论文)

    文章目录 1 项目简介2 实现效果2 1 界面展示 3 设计方案3 1 概述3 2 系统流程3 2 1 系统开发流程 3 3 系统结构设计 4 项目获取 1 项目简介 Hi xff0c 各位同学好呀 xff0c 这里是M学姐 xff01 今
  • mac(osx) apache无法启动 localhost无法访问服务器

    问题描述 xff1a 由于删除了 private var log下面的日志 xff0c 导致重启电脑后apache无法正常工作 删除log的初衷是 xff1a 当系统用久了 xff0c 日志文件占据了几十个G的硬盘容量 造成的后果 xff1
  • 去掉了“摆动窗口”特效

    自从安装了KDE4以后 xff0c 我就再也离不开那些华丽的特效了 很多的时候 xff0c 不得不忍受万分缓慢的速度 昨天 xff0c 对开启的特效进行了一些精简 xff1a 最大化 最小化窗口特效仅保留魔灯 xff1b 关闭了摆动窗口特效
  • 单片机关键字sfr和sbit的理解

    在单片机C语言编程中 xff0c 扩充了两个关键字sfr和sbit sfr Special Function Register特殊功能寄存器的缩写 xff0c sbit 特殊功能寄存器位 xff0c 与定义一般的int char型变量不同
  • CSR1010蓝牙开发I/O操作

    CSR1010开发前期准备 1 开发环境CSR uEnergy SDK 2 5 1 2 硬件准备keyfob蓝牙开发板 xff0c USB SPI下载器 CSR1010 I O开发须知 xff1a 关于I O操作的函数库被定义在头文件 lt
  • ArchLinux必备命令记录

    1 添加新账户 useradd username新建账户 useradd d home xxx m xxx创建用户 xff0c 并同时生成用户目录 xff0c 不然账户无法正常启用 passwd username修改密码 userdel f
  • CSR1010蓝牙开发探索(一)

    花了多少时间我已经不想提起 xff0c 但是至少还是有点成果的 xff0c 分析了不少代码 xff0c 也看了不少资料 xff0c 发现比较接地气的东西还是比较少 xff0c 不多花点时间积累 xff0c 说实话很辛苦 现在还没有足够的水平
  • STM32F103C8开发74HC595串行转并行输出(五)

    1 新建项目 xff0c 选择芯片型号 xff0c 选中如下库文件 xff1a 代码如下 xff1a include 34 stm32f10x h 34 define MOSIO GPIO Pin 12 61 PA12 define R C
  • STM32F103C8开发I2C通信(六)

    关于参数id的说明 xff1a id是指与MCU相通信的设备的地址 xff0c 其中id为七位地址 xff0c 最后一位作为读写标志位使用 例如 xff1a 当外接设备为型号为24C02的E2PROM时 xff0c 根据24C02数据手册说