STM32 C++编程 005 I2c(Soft)类

Anthropic Glas:边缘AI实时闭环系统的硬核实践指南 边缘AI系统正从云端推理延伸至物理世界执行终端,其核心挑战在于确定性低延迟、多模态协同与硬件级可靠性。Glas作为面向具身智能的轻量级推理壳层,通过神经脉冲调度、微状态机(μSM)和在线跨模态对齐等技术,将视觉-语言-动作闭环压缩至亚秒级响应。它不依赖传统ROS中间件,而是以事件总线重构系统栈,直面工业场景中150ms动作失步、传感器时钟不同步、电源纹波敏感等真实瓶颈。该架构已落地制造、农业、医疗等场景,成为边缘AI从‘能跑模型’迈向‘稳控设备’的关键范式。本文聚焦Glas在树莓派5+VPU等资源受限平台的 阅读详情

使用 C++ 语言给 STM32 编写一个 I2c(Soft)类

我使用的STM32芯片:STM32F103ZET6
我们使用的STM32库版本:V3.5.0



注意:

  • 想学习本套 STM32 C++编程 的专栏是有点门槛的。你需要有一点点 STM32 基础 和 一点点 C++ 语言基础。

  • 完整的STM32 C++ I2c(Soft)类 的下载地址可以在本篇博客的最下面找到。


I2cSoft.h:

#ifndef __AOBO_stm32f10x_I2c_H_
#define     __AOBO_stm32f10x_I2c_H_

#include "stm32f10x.h"
#include "Gpio.h"

namespace stm32f10x{

class I2cSoft{
    public:
         I2cSoft(Gpio *sda, Gpio *scl);
        void initialize(void);
         int singleWrite(u8 SlaveAddress,u8 REG_Address,u8 REG_data);   
         int singleRead(u8 SlaveAddress,u8 REG_Address);
         int multRead(u8 SlaveAddress,u8 REG_Address,u8 * ptChar,u8 size);

    private:
        Gpio *SDA, *SCL;
        void delay(void);
         int start(void);
        void stop(void);
        void ack(void); 
        void noAck(void);
         int waitAck(void);      //返回为:=1有ACK,=0无ACK
        void sendByte(u8 SendByte);
          u8 readByte(void);  //数据从高位到低位//  
};

}

#endif

i2cSoft.cpp

#include "I2cSoft.h"

using namespace stm32f10x;

I2cSoft::I2cSoft(Gpio *sda, Gpio *scl):SDA(sda), SCL(scl){
//  initialize();
}

//模拟IIC初始化
void I2cSoft::initialize(void){
}

void I2cSoft::delay(void)
{
   /*u8 i=0; 
   while(i) 
   { 
     i--; 
   } 
        */  
}

int I2cSoft::start(void)
{
    SDA->high();    SCL->high();    delay();
    if(SDA->islow())return 0;   //SDA线为低电平则总线忙,退出
    SDA->low(); delay();
    if(SDA->ishigh()) return 0; //SDA线为高电平则总线出错,退出
    SDA->low(); delay();
    return 1;   
}

void I2cSoft::stop(void)
{
    SCL->low(); delay();
    SDA->low(); delay();
    SCL->high();    delay();
    SDA->high();    delay();
} 

void I2cSoft::ack(void)
{   
    SCL->low(); delay();
    SDA->low(); delay();
    SCL->high();    delay();
    SCL->low(); delay();
}   

void I2cSoft::noAck(void)
{   
    SCL->low(); delay();
    SDA->high();    delay();
    SCL->high();    delay();
    SCL->low(); delay();
} 

int I2cSoft::waitAck(void)   //返回为:=1有ACK,=0无ACK
{
    SCL->low(); delay();
    SDA->high();    delay();
    SCL->high();    delay();
    if(SDA->ishigh()){
        SCL->low(); delay();    return 0;
    }
    SCL->low(); delay();
    return 1;
}

void I2cSoft::sendByte(u8 SendByte) //数据从高位到低位//
{
    u8 i=8;
    while(i--){
        SCL->low(); delay();
        if(SendByte&0x80)   SDA->high();  
        else    SDA->low();   
        SendByte<<=1;   delay();
        SCL->high();        delay();
    }
    SCL->low();
}  

u8 I2cSoft::readByte(void)  //数据从高位到低位//
{ 
    u8 i=8;
    u8 ReceiveByte=0;

    SDA->high();                
    while(i--){
        ReceiveByte<<=1;      
        SCL->low(); delay();
        SCL->high();    delay();    
        if(SDA->ishigh()){
            ReceiveByte|=0x01;
        }
    }
    SCL->low();
    return ReceiveByte;
} 

//单字节写入*******************************************
int I2cSoft::singleWrite(u8 SlaveAddress,u8 REG_Address,u8 REG_data)    {
    if(!start())return 0;
    sendByte(SlaveAddress);   //发送设备地址+写信号//sendByte(((REG_Address & 0x0700) >>7) | SlaveAddress & 0xFFFE);//设置高起始地址+器件地址 
    if(!waitAck())  {stop(); return 0;}
    sendByte(REG_Address );   //设置低起始地址      
    waitAck();  
    sendByte(REG_data);
    waitAck();   
    stop(); 
    return 1;
}

//单字节读取*****************************************
int I2cSoft::singleRead(u8 SlaveAddress,u8 REG_Address){   
    unsigned char REG_data;         
    if(!start())return 0;
    sendByte(SlaveAddress); //sendByte(((REG_Address & 0x0700) >>7) | REG_Address & 0xFFFE);//设置高起始地址+器件地址 
    if(!waitAck()){
        stop(); return 0;
    }
    sendByte((u8) REG_Address);   waitAck(); /*设置低起始地址  */   
    start();
    sendByte(SlaveAddress+1);   waitAck();

    REG_data= readByte();
    noAck();
    stop();
    //return TRUE;
    return REG_data;

}   

/******************************************************************************
多字节读取
******************************************************************************/
int I2cSoft::multRead(u8 SlaveAddress,u8 REG_Address,u8 * ptChar,u8 size){
    uint8_t i;

    if(size < 1)    return 0;
    if(!start())    return 0;
    sendByte(SlaveAddress);
    if(!waitAck()){
        stop(); return 0;
    }
    sendByte(REG_Address);      waitAck();

    start();
    sendByte(SlaveAddress+1);   waitAck();

    for(i=1;i<size; i++){
        *ptChar++ = readByte();
        ack();
    }
    *ptChar++ = readByte();
    noAck();
    stop();
    return 1;    
}   


/******************* (C) COPYRIGHT 2014 ANO TECH *****END OF FILE************/

main.cpp

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "Gpio.h"
#include "I2cSoft.h"

using namespace stm32f10x;
/* Private functions ---------------------------------------------------------*/

/**
  * @brief  Main program.
  * @param  None
  * @retval None
  */

int main(void)
{
    Gpio scl(PA,5);
    Gpio sda(PA,6);
    I2cSoft  i2c(&sda, &scl);
    while(true)
    {
    }   
}

搞定


你可以到这里下载我已经做好的 STM32 C++ I2c(Soft)类:
百度云 链接:http://pan.baidu.com/s/1bpbZ2MV 密码:esam
也可以在优快云里面下载:http://download.youkuaiyun.com/detail/github_35160620/9626553



小结:
下一讲,我们来使用 C++ 语言,创建一个 STM32 的 硬件 I2c 类。

2024年C C++最全STM32硬件I2C与软件模拟I2C超详解_stm32 i2c(1),论程序员成长的正确姿势 【代码】2024年C C++最全STM32硬件I2C与软件模拟I2C超详解_stm32 i2c(1),论程序员成长的正确姿势。 阅读详情

相关推荐

2024年C C++最新STM32硬件I2C与软件模拟I2C超详解_stm32 i2c,2024年最新C C++开发实战讲解

EEPROM全称: electrically-erasable, and programmable read-only memory --》可电擦除的可编程的只读存储器,这里的只读并不是只能读,是以前ROM不能写只能读,现在的EEPROM已经是可读写的啦,为什么还叫可读:只不过是保留下来的名字而已。原理图:WP引脚直接EEPROM的设备地址(作为从机)EEPROM中硬件I2CEEPROM通信的时候也遵循I2C协议,向产生起始信号,停止信号,应答什么的都一样的。

2401_84975387的博客 1419

【树莓派】用于处理 I2C、SPI 和 UART 的C++库

Raspberry Pi 是一款单板计算机,现在有 4 个修订版和一个简约的零变体。它是不同项目的热门选择,因为它体积小,功耗高,处理速度快,并且是一台完整的基于Linux的计算机。

gongdiwudu的专栏 5353

树莓派Pico与C++结合I2C 128×32 LCD显示屏实现项目实践

通过这个项目,我们结合树莓派Pico开发板和I2C 128×32 LCD显示屏,展示了如何使用C++编程语言控制硬件。C++不仅能够帮助学生理解算法和编程结构,还能在硬件编程中发挥巨大的作用。掌握与硬件结合的编程技能是编程学习的重要一环,也是信息学奥赛竞赛中的一项加分项。如果你对嵌入式开发和树莓派编程感兴趣,希望本文对你有所帮助。

邓校长的编程课堂专栏 1502

soft-nms的C++实现

出处:nms.cc #include <bits/stdc++.h> namespace nms { struct proposal { float score, x1, y1, x2, y2; }; inline static bool cmp(const proposal& a, const proposal& b) { return a.score &...

xiangxianghehe的博客 1275

【STM32】软件I2C的使用 —— 看这一篇就够了(附代码)

欢迎来到我的博客。今天我想向大家介绍一下STM32软件I2C功能。首先,让我们来了解一下I2C(Inter-Integrated Circuit)总线。I2C是一种串行通信总线,最初由Philips公司开发。它允许多个设备使用同一条总线进行通信,并且每个设备都有唯一的地址。I2C通常用于连接微控制器、传感器和其他外设。在STM32中,I2C总线被实现为硬件和软件两种方式。硬件I2C功能可以直接使用STM32芯片上的I2C外设,而软件I2C需要通过编程实现。

soledade的博客 1万+

libi2c:Linux i2c库,支持CC ++ Python

libi2c Linux用户空间i2c库。 产品特点 支持C / C ++和Python。 支持Python2 +,Python3 + 支持多种总线和设备。 支持7位和10位i2c从地址。 支持1-4字节内部地址,自动转换。 提供读/写/ ioctl功能以操作i2c设备。 支持8/16/32/64/128/256字节页面对齐写,读/写长度不受限制。 使用ioctl函数操作i2c可以忽略i2c设备的ack信号和内部地址。 安装 sudo python setup.py install or sudo make install or sudo make install PYTHON

C++实现nms和softmax

C++实现NMS和softmax

qq_41920323的博客 675

保姆级教程:手把手教你用RKISP TURN为RV1106生成和配置IQfile(附AIQ版本匹配避坑指南)

本文提供RV1106 ISP调试的完整指南,详细讲解如何使用RKISP TURN工具生成和配置IQfile,包括环境搭建、参数调试、设备树配置及常见问题解决方案。特别强调AIQ版本匹配的重要性,帮助开发者避免常见陷阱,提升图像信号处理效率。

weixin_42520796的博客 492

C++实现softmax

Softmax原型如下,常用于神经网络最后一层,将结果转化成(0,1),并且相加等于1的概率。防止上下溢出,可以把xi替换为(xi-x_max)

weixin_46273445的博客 1369

PuTTY使用方法

PuTTY是一款开源SSH/Telnet客户端,主要用于Windows系统连接Linux服务器。使用步骤包括:下载安装PuTTY,输入服务器IP和端口(默认22),可选择保存会话配置。支持密码和SSH密钥认证(需转换.pem为.ppk格式)。首次连接需确认主机密钥,成功登录后可执行Linux命令。其他功能包括会话日志记录、X11转发和端口隧道配置。操作完成后输入exit断开连接。

特网云计算 3157

SWAT模型参数太多搞不定?一篇讲清如何用SWAT-CUP筛选关键敏感参数(含结果图解读)

本文详细解析了如何使用SWAT-CUP进行参数敏感性分析,帮助水文模型初学者从上百个参数中筛选出关键敏感参数。通过实际案例和结果图解读,介绍了敏感性分析的核心价值、SWAT-CUP结果界面解读方法以及参数筛选的四步实战法,显著提升模型调试效率。文章还提供了典型问题排查手册,解决敏感参数与文献不一致、率定后模型变差等常见问题。

weixin_30385925的博客 321

VL53L4CD测距模块C++对象封装。

这是个关于VL53L4CD测距模块的CLASS封装,适用于STM32。

liyong_sbcel的专栏 72

深度学习之基于Pytorch手指静脉识别系统(

一、项目背景与目标手指静脉识别技术是一种新兴的生物特征识别技术,它依据人类手指中流动的血液可吸收特定波长的光线这一科学原理,利用手指内的静脉分布图像来进行身份识别。与传统的生物识别技术(如指纹识别)相比,手指静脉识别技术具有不易伪造、识别精度高、非接触性等特点,因此在安全性要求较高的场景(如金融、医疗、公安等)具有广阔的应用前景。本项目旨在利用PyTorch深度学习框架,构建一套高效、准确的手指静脉识别系统。

Q1744828575的博客 832

C++实现softmax函数功能(附带源码)

Softmax 函数是一种广泛用于 机器学习和深度学习 的归一化函数,主要用于 多分类问题 的概率分布计算

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 837

Android HAL 架构详解,底层开发不再难

HAL Binder 这套机制牛在哪?性能:一次拷贝,快如闪电。规范:HIDL 让接口定义整齐划一,维护省心。兼容:版本管理做得好,新老设备都能跑。有了这套通信体系,HAL 就像打了通脉,上下贯通,硬件操作变得丝滑无比。通信机制搭好了桥,接下来 HAL 得真正把手伸到硬件上。这部分是 HAL 的 “最后一公里”,直接决定硬件能不能被用起来。HAL 的接口定义是整个体系的灵魂,它决定了上层和底层怎么 “说话”。

大模型大数据攻城狮的专栏 1673

在 RAP 中把业务对象“搬到网口上”:service definition 与 service binding 的全流程、范式与实战

本文解析了SAP ABAP开发中service definition和service binding的关键作用。service definition负责选择要暴露的CDS实体和行为,形成服务模型;而service binding则将服务绑定到具体协议(如OData),生成可访问的端点。两者分离带来三大优势:支持同一模型多重发布、降低环境迁移耦合度、强化安全治理。文章通过预订业务对象的端到端示例,展示了如何从CDS建模到生成Fiori Elements预览。最后以售后工单业务为例,说明这种架构如何支持内外服务

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 390

Intel Edison C++ 开发之I2C-深入MRAA开发

这是一篇完整的关于在Intel Edison上进行原生程序开发的系列文章,以爱迪生通过I2C BUS连接温湿度传感器为例,详细地展示如何在 Eclipse上使用 C++ 进行 Edison 开发。文章将会涉及硬件、MRAA库、开发环境的设置、yocto linux 内核等内容,精彩内容不容错过。欢迎加入 Gekius 开发群(Q群: 329401876)深入讨论Intel Edison I

蓝精灵的专栏 2680

飞牛NAS新增虚拟机功能,如果使用虚拟机网卡直通安装ikuai软路由(如何解决OVS网桥绑定失败以及打开ovs后无法访问飞牛nas等问题)

飞牛NAS新增虚拟机功能,如果使用虚拟机网卡直通安装ikuai软路由

XiaoqiangClub的博客 1万+

Micropython——关于I2C和SoftI2C以及SPI和SoftSPI的区别

首先,我们先看下面关于Raspberry Pi Pico的一张引脚图 能够清晰地看到上面框图所圈起来的就是我们常常所说的I2C引脚接口,这里的接口指的就是硬件I2C接口,也就是我们常常在软件中仅用I2C表示即可。 特点: I2C(硬件I2C)是由相应的I2C驱动电路,其使用的I2C管脚也是专用的。 SoftI2C(软件I2C)一般是由电路中常见的GPIO管脚所组成,使用软件来控制管脚状态用以模仿I2C(硬件I2C)进行通信 ...

Xa_L 6688

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

SoftI2CMaster 项目使用教程

SoftI2CMaster 项目使用教程 1. 项目的目录结构及介绍 SoftI2CMaster/ ├── examples/ │ ├── I2CShell/ │ └── README.md ├── LICENSE ├── README.md ├── SoftI2CMaster.cpp ├── SoftI2CMaster.h examples/: 包含示例代码,如 I2CShell,用...

gitblog_01051的博客 389

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

STM32F4 HAL 软件模拟I2C程序

i2c_software.h #ifndef __I2C_SOFTWARE_H__ #define __I2C_SOFTWARE_H__ #include "main.h" #define DEVICE_ADDRESS 0xA0 //7位地址 #define BIT_WRITE 0 #define BIT_READ 1 //引脚定义 /* * SCL——PB6 * SDA——PB7 */ #define IIC1_SDA_IN() {GPIOB->MODER &= ~(3&lt

phmatthaus的专栏 4358

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

第10章 I2C通信

该篇文章是对江科大第十章I2C的笔记

qq_46210601的博客 588

ROS i2c 通信(c++版本)

WiringPi是一个用C语言编写的树莓派(RaspberryPi)软件包,可用于树莓派GPIO引脚控制、串口通信、SPI通信及I2C通信等功能,非常适合熟悉C/C++的人员在树莓派上进行软件开发。WiringPi的作者是Gordon Henderson,其官方网址为http://wiringpi.com。WiringPi遵循GNU GPLv3公约,任何人都可以免费使用该软件包。 1、WiringPi的安装与更新 WiringPi预装(Pre-installed)在标准的树莓派操作系统Raspbin中。可以

lovely_yoshino的博客 6268

【使用C++开发MCU】02-IIC实例之读取温度

基于C++开发MCU,使用NXP S32K146通过IIC读取TMP101温度传感器进行演示,阐述C++开发IIC、传感器。

Kinetis_Linux的博客 1998
上一篇: Python 网络爬虫 005 (编程) 如何编写一个可以 下载(或叫:爬取)一个网页 的网络爬虫
下一篇: ROS Learning-023 (提高篇-001) 准备工作 --- 安装一些必要的软件包
AoboSir
博客等级 码龄10年 996粉丝 285原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值