单片机IO上挂很多个i2c主控制接口,怎么区分它们。在线等了

[复制链接]
forgot 发表于 2012-11-16 08:34 | 显示全部楼层
器件地址不一样   如24c02   A0A1A2可以设置为2的3次方   也就是8个器件地址

写或者读I2C器件的时候是要操作地址的
david-xia 发表于 2012-11-16 08:45 | 显示全部楼层
学习ing。。。。。。。。。
 楼主| 阮天宇00 发表于 2012-11-16 09:53 | 显示全部楼层
本帖最后由 阮天宇00 于 2012-11-16 09:54 编辑

21# forgot
接口PIN不一样~
就是有很多根I2C接口~
而且不少器件的物理地址都是一样的哟
 楼主| 阮天宇00 发表于 2012-11-16 09:55 | 显示全部楼层
多组IO口
18# T_X_T
 楼主| 阮天宇00 发表于 2012-11-16 09:56 | 显示全部楼层
很多器件的物理地址一样
20# sxhhhjicbb
supreme42 发表于 2012-11-16 11:48 | 显示全部楼层
IIC从器件硬件上要设置为不同地址啊,用一根总线就可连接。软件按IIC协议先发地址来操作不同的IIC器件啊
Ryanhsiung 发表于 2012-11-16 13:30 | 显示全部楼层
你的速度要求多少,我那样写不会慢多少。 用内联函数的方式来实现,出就多了些指令而以。
robnetcn 发表于 2012-11-16 14:02 | 显示全部楼层
等待解释。。。
 楼主| 阮天宇00 发表于 2012-11-16 14:39 | 显示全部楼层
本帖最后由 阮天宇00 于 2012-11-16 14:49 编辑

不会用内联函数,先学习学习
就是我还是要写不同的SDA1 SDA2 SDA3……?
只是我调用的时候弄个函数,switch一下?
27# Ryanhsiung
AppBaby 发表于 2012-11-16 15:47 | 显示全部楼层
给你个方法,但估计也节省不了多少书写时间. 最少每口都要定义一个独立的 Readbyte和WriteByte的函数.

#include "stdafx.h"

//有多少个Port就定义多少个ReadBytex 函数
unsigned char ReadByte1()
{
        printf("Reading Port 1\n");
        return 0x11;
}

unsigned char ReadByte2()
{
        printf("Reading Port 2\n");
        return 0x22;
}

//用宏定义封装,便于调用. ##是连接符号. 不一定每个编译器都支持.
#define ReadByte(PORT_NUM) ReadByte##PORT_NUM()


int main(int argc, char* argv[])
{
        unsigned char data,total;

        data=ReadByte(1);
        total=ReadByte(2)+data;
        
        printf("Total is : %x\n",total);
        
        return 0;
}

/* 下面是运行结果
Reading Port 1
Reading Port 2
Total is : 33
Press any key to continue
*/
闲来玩玩 发表于 2012-11-16 17:26 | 显示全部楼层
学习。
joyme 发表于 2012-11-16 18:05 | 显示全部楼层
纠结啥啊,用带参数的宏就搞定,最好IO是一个PORT里的,如果不是一个port,会麻烦一点
e.g.
#define   Ctrl_Port0                   PORTA
#define   Ctrl_Port1                   PORTB
#define   MAX_I2C_NUM            3
typedef struct        I2C_ASSIGNMENT
{
        BYTE                usePortA;
        BYTE                clk_index;
        BYTE                sda_index;
}I2C_Assignment;

I2C_Assignment   I2C_Array[MAX_I2C_NUM];
#define   SET_CLK(index)    SETBIT(I2C_Array[index].usePortA?Ctrl_PORT0:Ctrl_PORT1,I2C_Array[index].clk_index)
#define   SET_SDA(index)    SETBIT(I2C_Array[index].usePortA?Ctrl_PORT0:Ctrl_PORT1,I2C_Array[index].sda_index)

估计也就节省点代码,时间上比调用函数好些吧
starlite_jason 发表于 2012-11-16 21:42 | 显示全部楼层
用宏有些编译器可能不支持,可以用函数指针,封装好IO的读写,代码简洁,速度也比直接CASE要快。
Ryanhsiung 发表于 2012-11-18 22:03 | 显示全部楼层
本帖最后由 Ryanhsiung 于 2012-11-18 22:08 编辑

32L的想法不错,感觉还差了点,支持端口不多啊!  我觉的可以将还是以32L结构体的方式来实现,不过里面加的就应该是指针了,指向那个PORT,再加几个参数,指向那个具体的位。
 楼主| 阮天宇00 发表于 2012-11-22 17:46 | 显示全部楼层
谢谢大家~
的确是没有好办法~
所有I2C读取/写入的数据也很少,所有管脚加起来就4K左右吧。

仔细琢磨了下,发现画原理图的时候有点问题,其实很多管脚都可以合并的~不过做第一版,这样弄也可以,就是有点罗嗦。

还真没什么好办法,只有一个一个的读/写~
demaxiya 发表于 2012-11-23 09:52 | 显示全部楼层
:L I2C是总线 任何一个器件出低电平都将拉低总线的电平 寻址寻器件地址就可以 不是来改SDA和SCL对应的端口
 楼主| 阮天宇00 发表于 2012-11-23 13:09 | 显示全部楼层
你们看明白问题哟~
我说的是物理层连接不同~
36# demaxiya
ohy3686 发表于 2012-11-26 09:58 | 显示全部楼层
每个IIC器件的地址都不同的,直接挂在一个总线上就行了啊。
在编程的时候通过地址选择设备就OK了。
不要那么麻烦的。
T_X_T 发表于 2012-11-26 11:00 | 显示全部楼层
地址线区分啊
T_X_T 发表于 2012-11-26 11:05 | 显示全部楼层
不懂为什么把器件地址搞成一样,人家A0,A1,A2,就是为了区分器件。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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