新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 嵌入式硬件通信接口协议-IIC(二)分层架构设计模拟接口

嵌入式硬件通信接口协议-IIC(二)分层架构设计模拟接口

作者:时间:2019-03-08来源:网络收藏

  关于分层设计的思想,在之前的一篇文章中《硬件通信接口协议-SPI(二)分层架构设计模拟接口》介绍SPI接口设计时,已经做了详细的设计过程讲解,在此就不赘述了。

本文引用地址:http://www.eepw.com.cn/article/201903/398335.htm

  现在参考SPI的BSP层设计思路,用同样的方法来设计接口的BSP层代码模块。

  本文将要讲解和实现的内容主要分为两个部分:代码实现接口管理、代码实现时序。

  IIC接口管理

  接口管理的目的是想在后期扩展时,一个工程里可使用多个IIC接口。

  这里暂不考虑使用复杂的数据结构,仅仅采用简单的宏定义,放在头文件中,省去麻烦的内存申请、分配这一些操作。

  以IIC接口序号“1”开始向后排,新增IIC接口时,直接参考当前示例来定义后续的IIC接口序号和管脚即可:

  #define IIC_1 1

  #define IIC1_PORT_SCL PORTB

  #define IIC1_PIN_SCL 6

  #define IIC1_PORT_SDA PORTA

  #define IIC1_PIN_SDA 2

  此处要实现的,依然是位于BSP层的IIC模块代码,这个层介于芯片驱动(寄存器)和应用库之间,要考虑到在后期的移植开发,此IIC模块可能由IO模拟,也可能由芯片厂商提供的驱动demo实现,所以这里所封装出来的BSP层接口,一定要考虑到后期的扩展。

  所以这里的做法是把参数都放在函数中传递,并且均设计成带有uint8_t类型的函数返回值。这里如此设计的原因和习惯问题,可以参考《【编程】函数返回类型设计》一文。

  打开STM32CubeMX工具可以看到,在配置IIC接口时,参数可配置内容如下截图:

  


  参考以上,暂且在结构体中定义:地址位宽、时钟速率,来定义一个IIC接口对象。如下头文件中的bsp_iic_obj_t结构体类型。

  


  IIC时序

  从上一篇《硬件通信接口协议-IIC(一)协议基础》中,我们知道IIC的时序中有这几种信号特征,现在就根据这几个信号特征,用代码逐一实现。

  


  实际上在互联网上已经有很多关于IIC时序模拟的实现代码,最简单的可以从github开源社区、百度百科、各类技术网站,具体到很多的技术论坛都有IIC应用实例,都能找到IIC接口的源码。

  因此IIC时序的模拟已经大同小异了,然而在这里再“造轮子”的目的是,集成、优化、完善自有项目BSP层的代码,提高项目的扩展性和应用,对屡清代码的整体框架也有很大帮助!

  说白了也是想把这篇文章写详细些。废话少说,立即上码:

  起始标志:

  


  

  这段起始标志的代码,思路很简单,首先确保SDA所使用的IO引脚为输出,在本BSP层的IIC模块中使用了iic_set_io(iic_n, 0);函数,将指定IIC接口序号的SDA管脚设为输出,之后的电平设置,就是完成信号时序的过程。

  结束标志

  



  思路类似于上,略。


上一页 1 2 3 下一页

关键词: 嵌入式 IIC

评论

技术专区

关闭