[stm32]如何抽象模拟的I2C驱动,模拟的I2C驱动封装

一般的,I2C驱动的速率并不高,最高貌似只有400KHz,而且使用stm32硬件IIC会出现这样那样的问题,所以使用IO口模拟是最好的选择。
那么我就在想了,能不能把模拟的I2C驱动当做一个对象给封装起来,以后使用的时候直接调用即可,不用再过多的去配置IO和调试I2C的时序了。

  • 如果是用C++,我们可以直接使用类将其封装起来
class simulate_IIC{
public:
	simulate_IIC();
	~simulate_IIC();
	void send_byte(uint8_t dat);
	uint8_t read_byte(void);
	void send_buffer(uint8_t *ibuff, uint16_t ilen);
	void read_buffer(uint8_t *rbuff, uint16_t rlen);
	...
private:
	uint16_t dev_ID;
	GPIO_PortTypeDef* SCL_Port;
	GPIO_PortTypeDef* SDA_Port;
	uint16_t SCL_Pin;
	uint16_t SDA_Pin;
	uint16_t ntime;
	void Conf_IIC_IO(GPIO_TypeDef*);
	void IIC_start(void);
	void IIC_stop(void);
	void master_ack(bool sta);
	bool get_ack(void);
	...
}
  • 其实我们还可以再把IIC的驱动中的硬件和调用抽象出来,如下表:
硬件层IO配置+系统延时
驱动层IIC时序
调用层IIC读写
  • 那么硬件层就可以
class Conf_IO{
public:
	Conf_IO();
	~Conf_IO();
	void Delay_us(uint32_t cnt);
	...
protected:
	GPIO_TypeDef  *GPIO_SCL;
	GPIO_TypeDef  *GPIO_SDA;
	uint32_t SCL_Pin;
	uint32_t SDA_Pin;
	uint8_t idle_delay;	//空闲延时
	uint8_t speed_delay;	//速率调整
	uint8_t timeout;	//超时
	...
}
  • I2C驱动层,继承硬件层
class IIC_Protocol:protected Conf_IO{	//继承并将其隐藏
public:
	IIC_Protocol();
	~IIC_Protocol();
	void send_byte(uint8_t dat);
	uint8_t read_byte(void);
	void send_buffer(uint8_t *sDat, uint16_t sLen);
	void read_buffer(uint8_t *rDat, uint16_t rLen);
	...
private:
	void IIC_start(void);
	void IIC_stop(void);
	void master_ack(bool sta);
	bool get_ack(void);
	uint16_t dev_ID;
	...
}
  • 因为协议层有向外提供读写单字节和读写多个字节的接口,能够基本满足日常的IIC设备的使用要求了。
  • 我们为什么要把硬件层抽象出来呢,如果是IO复用呢,复用为串口,spi,ADC等等
class uart:protected Conf_IO{
...
}
class spi:protected Conf_IO{
...
}
...
这样做的好处是什么呢?

那么可能大家会想了,有必要弄这么复杂吗。我直接网上复杂一段模拟IIC的驱动进行适当的改造就能够完全为我所用了啊。
其实上面的过程是把模拟的IIC进行抽象化,然后再进行封装,作为一个对象供开发者进行调用,开发者只需要构造函数中实例化IO和延时即可,中间的过程完全不用理会。
而从网上找的模拟IIC,你还需要找到对应IO配置的地方,然后改为设备对应的IO,然后再调整延时函数。而且各种变量定义看起来乱糟糟的,不美观,而且很难作为一个库来供开发者使用。
不过上面的封装是用C++写的,有很多嵌入式的开发人员不一定看得懂啊,能不能用C语言进行封装啊,答案是可以的。C语言模拟IIC驱动的封装下一次再给大家分享吧,把类换成结构体,然后将一些保护函数改为函数指针来供外部调用。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值