打印
[C语言]

如何使两组IIC总线公用一个驱动程序

[复制链接]
1960|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qinlu123|  楼主 | 2016-9-2 11:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
ayb_ice| | 2016-9-2 12:34 | 只看该作者
用参数控制gpio,

使用特权

评论回复
板凳
kk118a| | 2016-9-2 12:39 | 只看该作者
重定义端口

使用特权

评论回复
地板
jrcsh| | 2016-9-2 13:01 | 只看该作者
楼上还可以共用  LK 么 省下一个IO 是一个IO阿

使用特权

评论回复
5
qinlu123|  楼主 | 2016-9-2 13:16 | 只看该作者
jrcsh 发表于 2016-9-2 13:01
楼上还可以共用  LK 么 省下一个IO 是一个IO阿

我IO多的用不了,但是为了好布线,就一人一个总线了

使用特权

评论回复
6
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( )

你把你的引脚宏定义,函数都多传一个参数,作为器件选择,控制不同的引脚。

使用特权

评论回复
7
949155525| | 2016-9-2 19:47 | 只看该作者
不是有独立的器件号吗

使用特权

评论回复
8
ccxlslr| | 2016-9-2 22:03 | 只看该作者
我会为每个IIC总线,定义下面三个函数:
我的评价是,虽然效率不高,但结构化不错,应用方便。可以有多个IIC。

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

void iic1_scl(miic_lin_t state)
{
    if (state == LIN_STA_LO) {
        BC(PORTD, 0);
    }
    else {
        BS(PORTD, 0);
    }
}

unsigned char iic1_sda(miic_lin_t state)
{
    switch (state) {
    case LIN_STA_LO:
        BC(PORTD, 1);
        break;
    case LIN_STA_HI:
        BS(PORTD, 1);
        break;
    case SDA_STA_DOUT:
        BS(DDRD, 1);
        break;
    case SDA_STA_DIN:
        BC(DDRD, 1);
        break;
    case SDA_STA_IN:
        return BCK(PIND, 1);
        break;
    }
    return 0;
}


void iic1_delay()
{
    volatile unsigned char i;
    for (i = 1; i < 5; i++);
}


IIC结构如下:

/** \brief IIC总线控制结构 */
typedef struct {
    /** \brief SCL线控制
    *   \param state            SCL线状态
    *   \warning 本模块不会配置SCL线的输出方向,因此必须事先配置SCL方向为输出
    *       \arg LIN_STA_LO     SCL线输出低电平
    *       \arg LIN_STA_HI     SCL线输出高电平
    */
    void (*scl)(miic_lin_t state);
   
    /** \brief SDA线控制
    *   \param state            SDA线状态
    *       \arg LIN_STA_LO     SDA线输出低电平
    *       \arg LIN_STA_HI     SDA线输出高电平
    *       \arg SDA_STA_DOUT   设置SDA方向为输出
    *       \arg SDA_STA_DIN    设置SDA方向为输入
    *       \arg SDA_STA_IN     读取SDA状态
    *   \return SDA线状态,只有参数state为SDA_STA_IN时才有意义
    *       \retval 0     SDA线为低电平   
    *       \retval 其它  SDA线为高电平
    */
    unsigned char (*sda)(miic_lin_t state);
   
    /** \brief SCL延时
    *
    *   降低总线时钟频率,一定要保证总线时钟适应设备的总线频率,一般设备为100K或400K
    */
    void (*delay)(void);
} miic;



使用特权

评论回复
9
liang@bj| | 2016-9-3 16:10 | 只看该作者
定义IIC结构体数组(结构体成员即为GPIO组和管脚),初始化每个IIC(结构体数组的下标改变)即是 初始化GPIO

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

147

主题

1430

帖子

12

粉丝