使用 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

也可以在CSDN里面下载:http://download.csdn.net/detail/github_35160620/9626553



小结:

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

STM32 C++编程 005 I2c(Soft)类的更多相关文章

  1. STM32 C++编程 004 Adc (数模转换)类

    使用 C++ 语言给 STM32 编写一个 Adc 类 我使用的STM32芯片:STM32F103ZET6 我们使用的STM32库版本:V3.5.0 注意: 想学习本套 STM32 C++编程 的专栏 ...

  2. STM32 C++编程 003 USART(串口)类

    使用 C++ 语言给 STM32 编写一个 Usart 类 我使用的STM32芯片:STM32F103ZET6 我们使用的STM32库版本:V3.5.0 注意: 想学习本套 STM32 C++编程 的 ...

  3. STM32 C++编程 002 GPIO类

    使用 C++ 语言给 STM32 编写一个 Gpio 类 我使用的STM32芯片:STM32F103ZET6 我们使用的STM32库版本:V3.5.0 注意: 想学习本套 STM32 C++编程 的专 ...

  4. STM32 C++编程 001 工程模板

    将 STM32的官方工程模板 修改为我们这套教材的:STM32 C++工程模板 我使用的 STM32 库的版本 : V3.5.0 注意: 想学习本套 STM32 C++编程 的专栏是有点门槛的.你需要 ...

  5. Socket网络编程(TCP/IP/端口/类)和实例

    Socket网络编程(TCP/IP/端口/类)和实例 原文:C# Socket网络编程精华篇 转自:微冷的雨 我们在讲解Socket编程前,先看几个和Socket编程紧密相关的概念: TCP/IP层次 ...

  6. Java学习day7面向对象编程1-对象和类

    一.Java编程中对象和类的概念 1,什么是类? 答:类是客观存在的,抽象的,概念的东西. 2,什么是对象? 答:对象是具体的,实际的,代表一个事物.例如:车是一个类,汽车,自行车就是他的对象. 关于 ...

  7. Python - 面向对象编程 - 什么是 Python 类、类对象、实例对象

    什么是对象和类 https://www.cnblogs.com/poloyy/p/15178423.html Python 类 类定义语法 最简单的类定义看起来像这样 class ClassName: ...

  8. STM32库函数编程、Keli/MDK、stm32f103zet6

    catalogue . Cortex-M3地址空间 . 基于标准外设库的软件开发 . 基于固件库实现串口输出(发送)程序 . 红外接收实验 . 深入分析流水灯例程 . GPIO再举例之按键实验 . 串 ...

  9. 《寒江独钓_Windows内核安全编程》中修改类驱动分发函数

    最近在阅读<寒江独钓_Windows内核安全编程>一书的过程中,发现修改类驱动分发函数这一技术点,书中只给出了具体思路和部分代码,没有完整的例子. 按照作者的思路和代码,将例子补充完整,发 ...

随机推荐

  1. element-ui dialog组件添加可拖拽位置 可拖拽宽高

    edge浏览器下作的gifhttp://www.lanourteam.com/%E6... 有几个点需要注意一下 每个弹窗都要有唯一dom可操作 指令可以做到 拖拽时要添加可拖拽区块 header 由 ...

  2. Eclipse中Maven的本地仓库引导配置

    简单整理一下,方便理解操作. 1.本地拷贝maven文件后,打开maven中的.setting 文件: 2.配置文件: <?xml version="1.0" encodin ...

  3. Topshelf 和 Katana:统一的 Web 和服务体系结构

    Topshelf 和 Katana:统一的 Web 和服务体系结构 Wes McClure 下载代码示例 使用 IIS 托管 ASP.NET Web 应用程序已成为业界标准十年有余.构建此类应用程序的 ...

  4. layui.js框架的启发

    最近做前台设计的MM,应用了layui.js框架,是一个可以按模块加载的js框架,可以实现UI上的一些效果,比如"手风琴折叠"面板.我看了下源码,抽出了其框架,应用到公司的项目中, ...

  5. C#面向对象(三):多态

    前文链接: C#面向对象(一):明确几个简单的概念作为开胃菜 C#面向对象(二):封装和继承 今天来聊聊面向对象的多态,这部分算是比较重要和核心的,很多工作2年多的程序员其实对于面向对象和多态的理解也 ...

  6. LeetCode Maximum Distance in Arrays

    原题链接在这里:https://leetcode.com/problems/maximum-distance-in-arrays/description/ 题目: Given m arrays, an ...

  7. 第十篇 javascript基础语法

    1)基本概念 a) 语句(statement)是为了完成某种任务而进行的操作,语句以分号结尾,一个分号就表示一个语句结束.:如:var a = 1; b) 表达式(expression),指一个为了得 ...

  8. POJ1274(二分图最大匹配)

    The Perfect Stall Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 23356   Accepted: 104 ...

  9. hihoCoder#1067(离线算法求LCA)

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上上回说到,小Hi和小Ho用非常拙劣——或者说粗糙的手段山寨出了一个神奇的网站,这个网站可以计算出某两个人的所有共同祖先中 ...

  10. minidump-DMP文件的生成和使用

    转载地址点击打开链接 1.生成dmp的程序 #include  <dbghelp.h> #pragma comment(lib,  "dbghelp.lib") //设 ...