[C语言] 如何使两组IIC总线公用一个驱动程序

[复制链接]
2359|8
 楼主| qinlu123 发表于 2016-9-2 11:40 | 显示全部楼层 |阅读模式
我的板子上有两个IIC器件,但是由于某些原因他俩没有挂在同一组总线上(每个器件由独立的IO控制)。我并不想在每一个器件驱动里加入独立的IIC驱动,我想让他们俩公用一个IIC驱动。应该怎么实现呢?
ayb_ice 发表于 2016-9-2 12:34 来自手机 | 显示全部楼层
用参数控制gpio,
kk118a 发表于 2016-9-2 12:39 | 显示全部楼层
重定义端口
jrcsh 发表于 2016-9-2 13:01 | 显示全部楼层
楼上还可以共用  LK 么 省下一个IO 是一个IO阿
 楼主| qinlu123 发表于 2016-9-2 13:16 | 显示全部楼层
jrcsh 发表于 2016-9-2 13:01
楼上还可以共用  LK 么 省下一个IO 是一个IO阿

我IO多的用不了,但是为了好布线,就一人一个总线了
yu515301489 发表于 2016-9-2 19:08 | 显示全部楼层
fxmxh 发表于 2016-9-2 12:58
#define IIC_SDA_L     SDA_L( )
#define IIC_SDA_H     SDA_H( )
#define IIC_SCL_L     SCL_L( )

你把你的引脚宏定义,函数都多传一个参数,作为器件选择,控制不同的引脚。
949155525 发表于 2016-9-2 19:47 来自手机 | 显示全部楼层
不是有独立的器件号吗
ccxlslr 发表于 2016-9-2 22:03 | 显示全部楼层
我会为每个IIC总线,定义下面三个函数:
我的评价是,虽然效率不高,但结构化不错,应用方便。可以有多个IIC。

对于大多数应用,单片机时间是够用的,所以不一定要处处关心执行效率。

  1. void iic1_scl(miic_lin_t state)
  2. {
  3.     if (state == LIN_STA_LO) {
  4.         BC(PORTD, 0);
  5.     }
  6.     else {
  7.         BS(PORTD, 0);
  8.     }
  9. }

  10. unsigned char iic1_sda(miic_lin_t state)
  11. {
  12.     switch (state) {
  13.     case LIN_STA_LO:
  14.         BC(PORTD, 1);
  15.         break;
  16.     case LIN_STA_HI:
  17.         BS(PORTD, 1);
  18.         break;
  19.     case SDA_STA_DOUT:
  20.         BS(DDRD, 1);
  21.         break;
  22.     case SDA_STA_DIN:
  23.         BC(DDRD, 1);
  24.         break;
  25.     case SDA_STA_IN:
  26.         return BCK(PIND, 1);
  27.         break;
  28.     }
  29.     return 0;
  30. }


  31. void iic1_delay()
  32. {
  33.     volatile unsigned char i;
  34.     for (i = 1; i < 5; i++);
  35. }


IIC结构如下:

  1. /** \brief IIC总线控制结构 */
  2. typedef struct {
  3.     /** \brief SCL线控制
  4.     *   \param state            SCL线状态
  5.     *   \warning 本模块不会配置SCL线的输出方向,因此必须事先配置SCL方向为输出
  6.     *       \arg LIN_STA_LO     SCL线输出低电平
  7.     *       \arg LIN_STA_HI     SCL线输出高电平
  8.     */
  9.     void (*scl)(miic_lin_t state);
  10.    
  11.     /** \brief SDA线控制
  12.     *   \param state            SDA线状态
  13.     *       \arg LIN_STA_LO     SDA线输出低电平
  14.     *       \arg LIN_STA_HI     SDA线输出高电平
  15.     *       \arg SDA_STA_DOUT   设置SDA方向为输出
  16.     *       \arg SDA_STA_DIN    设置SDA方向为输入
  17.     *       \arg SDA_STA_IN     读取SDA状态
  18.     *   \return SDA线状态,只有参数state为SDA_STA_IN时才有意义
  19.     *       \retval 0     SDA线为低电平   
  20.     *       \retval 其它  SDA线为高电平
  21.     */
  22.     unsigned char (*sda)(miic_lin_t state);
  23.    
  24.     /** \brief SCL延时
  25.     *
  26.     *   降低总线时钟频率,一定要保证总线时钟适应设备的总线频率,一般设备为100K或400K
  27.     */
  28.     void (*delay)(void);
  29. } miic;



liang@bj 发表于 2016-9-3 16:10 | 显示全部楼层
定义IIC结构体数组(结构体成员即为GPIO组和管脚),初始化每个IIC(结构体数组的下标改变)即是 初始化GPIO
您需要登录后才可以回帖 登录 | 注册

本版积分规则

199

主题

2209

帖子

14

粉丝
快速回复 在线客服 返回列表 返回顶部