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

为什么使用C++进行MCU开发

我从18年开始在STM32等上使用C++编程,在医疗器械行业进行IVD仪器开发,在此之前的项目开发中我是使用C语言。初次在MCU上使用C++,我有很多疑惑:C语言不挺好的吗?MCU上居然可以使用C++? 为什么选择C++?

工作七八年了,以前都没写过博客,现在开始记录一点东西吧!

尽管18年时使用C语言进行MCU开发已经相当熟练,但C++我是刚入茅庐,才会有那些疑问,并还专门请教了部门经理。这几年,随着工作经验的积累,愈发的认通C++在产品开发中的优点,那些疑惑也随之解开。
使用C++进行MCU开发,不代表只用C++,C语言也是可以混用的,特别是原厂提供的一些SDK,可以用C++封装这层SDK,后续、上层驱动业务进行C++开发。

场景描述

这里使用NXP的S32K1系列MCU,使用TI的TMP101温度传感器做示例。开发环境使用NXP的S32DS,使用其C库SDK,编程语言为C++。为了使用C++演示,建立工程时选择C++语言,不选择SDK,SDK部分由我们自行导入工程。
原理框图

软件架构

这里进行演示,架构较为简单,在SDK基础上封装IIC驱动CI2C(C++),基于IIC驱动实现TMP101驱动CTmp(C++),板级相关时钟、引脚封装在CBoard中(C++),最后App中的main.cpp实现读取温度。
软件架构

工程结构

基于上述软件架构[在SDK基础上封装IIC驱动CI2C(C++),基于IIC驱动实现TMP101驱动CTmp(C++),板级相关时钟、引脚封装在CBoard中(C++),最后App中的main.cpp实现读取温度。]实现工程结构:
工程结构

CI2C类

参见NXP S32K1 IIC Driver接口与实现实现该C++类。

头文件:CI2C.h中主要实现初始化、读从机数据、写从机数据三大接口,为了省事,将板机相关的从机枚举、从机地址和波特率等也塞在了这里。

#ifndef CI2C_H_
#define CI2C_H_

#include "stdint.h"
#include "lpi2c.h"

class CI2C{
   

public:
	void init(void);
	void deinit(void);
	bool read(uint8_t slave, uint8_t addr, uint8_t *data, uint16_t len);
	bool write(uint8_t slave, uint8_t addr, const uint8_t *data, uint16_t len);
	static CI2C *getInstance(void);

	enum SLAVE
	{
   
			SLAVE_TMP101 = 0x00,
			SLAVE_COUNT
	};

private:
	static CI2C *pI2CInstance;
	void config(uint8_t slave);
	const 
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是CLRC66301HN的IIC版本开发例程: 1. 确认硬件连接 首先,需要确认CLRC66301HN芯片的硬件连接是否正确。在IIC版本中,通常使用两个引脚SCL和SDA连接到主控芯片的IIC总线上。请检查这两个引脚是否正确连接。 2. 初始化IIC总线 在开始使用CLRC66301HN芯片之前,需要初始化IIC总线。以下是一个简单的例程,可以初始化IIC总线: ```c void i2c_init(void) { // 初始化IIC总线 // 设置IIC时钟频率为100kHz TWBR = 72; // 打开IIC总线 TWCR = (1 << TWEN); } ``` 3. 写入寄存器 在使用CLRC66301HN芯片之前,需要将一些寄存器设置为正确的值。以下是一个写入寄存器的例程: ```c void write_register(uint8_t reg, uint8_t value) { // 发送起始信号 TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN); while (!(TWCR & (1 << TWINT))); // 检查状态码 if ((TWSR & 0xF8) != TW_START) return; // 发送从地址和写入位 TWDR = CLRC66301HN_I2C_ADDR << 1; TWCR = (1 << TWINT) | (1 << TWEN); while (!(TWCR & (1 << TWINT))); // 检查状态码 if ((TWSR & 0xF8) != TW_MT_SLA_ACK) return; // 发送寄存器地址 TWDR = reg; TWCR = (1 << TWINT) | (1 << TWEN); while (!(TWCR & (1 << TWINT))); // 检查状态码 if ((TWSR & 0xF8) != TW_MT_DATA_ACK) return; // 发送数据 TWDR = value; TWCR = (1 << TWINT) | (1 << TWEN); while (!(TWCR & (1 << TWINT))); // 检查状态码 if ((TWSR & 0xF8) != TW_MT_DATA_ACK) return; // 发送停止信号 TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN); } ``` 这个例程将一个字节写入指定的寄存器中。 4. 读取寄存器 如果需要读取CLRC66301HN芯片中的某个寄存器的值,可以使用以下例程: ```c uint8_t read_register(uint8_t reg) { uint8_t value = 0; // 发送起始信号 TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN); while (!(TWCR & (1 << TWINT))); // 检查状态码 if ((TWSR & 0xF8) != TW_START) return 0; // 发送从地址和写入位 TWDR = CLRC66301HN_I2C_ADDR << 1; TWCR = (1 << TWINT) | (1 << TWEN); while (!(TWCR & (1 << TWINT))); // 检查状态码 if ((TWSR & 0xF8) != TW_MT_SLA_ACK) return 0; // 发送寄存器地址 TWDR = reg; TWCR = (1 << TWINT) | (1 << TWEN); while (!(TWCR & (1 << TWINT))); // 检查状态码 if ((TWSR & 0xF8) != TW_MT_DATA_ACK) return 0; // 发送重启信号 TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN); while (!(TWCR & (1 << TWINT))); // 检查状态码 if ((TWSR & 0xF8) != TW_REP_START) return 0; // 发送从地址和读取位 TWDR = (CLRC66301HN_I2C_ADDR << 1) | 0x01; TWCR = (1 << TWINT) | (1 << TWEN); while (!(TWCR & (1 << TWINT))); // 检查状态码 if ((TWSR & 0xF8) != TW_MR_SLA_ACK) return 0; // 读取数据 TWCR = (1 << TWINT) | (1 << TWEN); while (!(TWCR & (1 << TWINT))); value = TWDR; // 发送停止信号 TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN); return value; } ``` 这个例程将返回指定寄存器中存储的一个字节的值。 5. 总结 这是一个非常简单的CLRC66301HN IIC版本的开发例程。您可以将其用作基础,以构建更复杂的应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值