发新帖我要提问
12
返回列表
打印

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

[复制链接]
楼主: 阮天宇00
手机看帖
扫描二维码
随时随地手机跟帖
21
forgot| | 2012-11-16 08:34 | 只看该作者 回帖奖励 |倒序浏览
器件地址不一样   如24c02   A0A1A2可以设置为2的3次方   也就是8个器件地址

写或者读I2C器件的时候是要操作地址的

使用特权

评论回复
22
david-xia| | 2012-11-16 08:45 | 只看该作者
学习ing。。。。。。。。。

使用特权

评论回复
23
阮天宇00|  楼主 | 2012-11-16 09:53 | 只看该作者
本帖最后由 阮天宇00 于 2012-11-16 09:54 编辑

21# forgot
接口PIN不一样~
就是有很多根I2C接口~
而且不少器件的物理地址都是一样的哟

使用特权

评论回复
24
阮天宇00|  楼主 | 2012-11-16 09:55 | 只看该作者
多组IO口
18# T_X_T

使用特权

评论回复
25
阮天宇00|  楼主 | 2012-11-16 09:56 | 只看该作者
很多器件的物理地址一样
20# sxhhhjicbb

使用特权

评论回复
26
supreme42| | 2012-11-16 11:48 | 只看该作者
IIC从器件硬件上要设置为不同地址啊,用一根总线就可连接。软件按IIC协议先发地址来操作不同的IIC器件啊

使用特权

评论回复
27
Ryanhsiung| | 2012-11-16 13:30 | 只看该作者
你的速度要求多少,我那样写不会慢多少。 用内联函数的方式来实现,出就多了些指令而以。

使用特权

评论回复
28
robnetcn| | 2012-11-16 14:02 | 只看该作者
等待解释。。。

使用特权

评论回复
29
阮天宇00|  楼主 | 2012-11-16 14:39 | 只看该作者
本帖最后由 阮天宇00 于 2012-11-16 14:49 编辑

不会用内联函数,先学习学习
就是我还是要写不同的SDA1 SDA2 SDA3……?
只是我调用的时候弄个函数,switch一下?
27# Ryanhsiung

使用特权

评论回复
30
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
*/

使用特权

评论回复
31
闲来玩玩| | 2012-11-16 17:26 | 只看该作者
学习。

使用特权

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

估计也就节省点代码,时间上比调用函数好些吧

使用特权

评论回复
33
starlite_jason| | 2012-11-16 21:42 | 只看该作者
用宏有些编译器可能不支持,可以用函数指针,封装好IO的读写,代码简洁,速度也比直接CASE要快。

使用特权

评论回复
34
Ryanhsiung| | 2012-11-18 22:03 | 只看该作者
本帖最后由 Ryanhsiung 于 2012-11-18 22:08 编辑

32L的想法不错,感觉还差了点,支持端口不多啊!  我觉的可以将还是以32L结构体的方式来实现,不过里面加的就应该是指针了,指向那个PORT,再加几个参数,指向那个具体的位。

使用特权

评论回复
35
阮天宇00|  楼主 | 2012-11-22 17:46 | 只看该作者
谢谢大家~
的确是没有好办法~
所有I2C读取/写入的数据也很少,所有管脚加起来就4K左右吧。

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

还真没什么好办法,只有一个一个的读/写~

使用特权

评论回复
36
demaxiya| | 2012-11-23 09:52 | 只看该作者
:L I2C是总线 任何一个器件出低电平都将拉低总线的电平 寻址寻器件地址就可以 不是来改SDA和SCL对应的端口

使用特权

评论回复
37
阮天宇00|  楼主 | 2012-11-23 13:09 | 只看该作者
你们看明白问题哟~
我说的是物理层连接不同~
36# demaxiya

使用特权

评论回复
38
ohy3686| | 2012-11-26 09:58 | 只看该作者
每个IIC器件的地址都不同的,直接挂在一个总线上就行了啊。
在编程的时候通过地址选择设备就OK了。
不要那么麻烦的。

使用特权

评论回复
39
T_X_T| | 2012-11-26 11:00 | 只看该作者
地址线区分啊

使用特权

评论回复
40
T_X_T| | 2012-11-26 11:05 | 只看该作者
不懂为什么把器件地址搞成一样,人家A0,A1,A2,就是为了区分器件。。。

使用特权

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

本版积分规则