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

[复制链接]
 楼主| 阮天宇00 发表于 2012-11-15 16:20 | 显示全部楼层 |阅读模式
本帖最后由 阮天宇00 于 2012-11-15 16:27 编辑

一个单片机要用到很多I2C的口,I2C管脚不是按照规律排列的~
请问:
我先定义
sbit SDA = P0^0;
sbit SCL  = P0^1;

我要怎么操作后,
实现:SDA = P1^0;
         SCL = P1^1;

我感觉好像不太可能:dizzy:

但是那样的话,我就要写十几个一样的I2C头文件,而且这些头文件就只有sbit SDA = xxx;sbit SCL = xxx;中的XXX不同~
请问我后面的理解有问题么?
 楼主| 阮天宇00 发表于 2012-11-15 16:21 | 显示全部楼层
自己顶一下~等待有高人来
 楼主| 阮天宇00 发表于 2012-11-15 16:40 | 显示全部楼层
给点提示嘛~
Ryanhsiung 发表于 2012-11-15 16:48 | 显示全部楼层
I2C是有地址的,不要接那么多,只要有一组即可。

若你确定你要多个的话,操作SDA时 用SWITCH来做,将置低 置高、读取做成底层代I2C函数调用。
如:
void I2C_SetDaPort( uint8_t num)
{
switch(num) // 第几个I2C

case 0x00:
   

}
 楼主| 阮天宇00 发表于 2012-11-15 16:56 | 显示全部楼层
4# Ryanhsiung

有好几个物理,地址相同呢,咋办?
那样就要用不同的IO分别接了吧
 楼主| 阮天宇00 发表于 2012-11-15 17:20 | 显示全部楼层
I2C是有地址的,不要接那么多,只要有一组即可。

若你确定你要多个的话,操作SDA时 用SWITCH来做,将置低 置高、读取做成底层代I2C函数调用。
如:
void I2C_SetDaPort( uint8_t num)
{
switch(num) // 第几个I2C
...
Ryanhsiung 发表于 2012-11-15 16:48


我明白你的意思了~
谢谢~
就是这个方法~

刚才问了好多人,都不明白我问的什么~
coody 发表于 2012-11-15 18:05 | 显示全部楼层
器件地址
 楼主| 阮天宇00 发表于 2012-11-15 18:12 | 显示全部楼层
7# coody
器件地址一样~总么办
 楼主| 阮天宇00 发表于 2012-11-15 18:17 | 显示全部楼层
I2C是有地址的,不要接那么多,只要有一组即可。

若你确定你要多个的话,操作SDA时 用SWITCH来做,将置低 置高、读取做成底层代I2C函数调用。
如:
void I2C_SetDaPort( uint8_t num)
{
switch(num) // 第几个I2C
...
Ryanhsiung 发表于 2012-11-15 16:48


刚写了几行,这种方法不太可行~
那I2C得多慢呀~
每次一个位发生变化都要执行一个函数~:L
switch()
{
case 0x00:
……
case 0x0a:
break;
}
忒慢了~
没好办法只能在程序里面放10个I2C头文件了~
:'(
闲来玩玩 发表于 2012-11-15 18:17 | 显示全部楼层
学习。
 楼主| 阮天宇00 发表于 2012-11-15 18:23 | 显示全部楼层
我看能不能在void I2C_Write_Byte()函数里面就选择好硬件接口;
先试试。
icecut 发表于 2012-11-15 18:39 | 显示全部楼层
如果sbit不是变量的话.还是使用宏定义吧.一下子生产很多函数
# define ... iicread#part# ...
 楼主| 阮天宇00 发表于 2012-11-15 18:48 | 显示全部楼层
本帖最后由 阮天宇00 于 2012-11-15 19:06 编辑

switch(num)
                {        case 0:
                                #define SDA SDA_FPGA_First
                                break;
                        case 1:
                                #define SDA SDA_FPGA_Second
                                break;
                        default:
                                #define SDA SDA_FPGA_Second
                              berak;
                        
                }
这样行么?
宏定义可以在运行中使用么?

有警告~:'(
 楼主| 阮天宇00 发表于 2012-11-15 19:06 | 显示全部楼层
12# icecut

没看明白~
可以写的具体点么
piliming 发表于 2012-11-15 19:10 | 显示全部楼层
硬件没做好的代价就是软件麻烦,楼主找到好的解决方法告诉大家一声呵。。。也学习一下。
 楼主| 阮天宇00 发表于 2012-11-15 19:15 | 显示全部楼层
15# piliming
嗯,部分DEVICE ADDRESS不同的可以共用一个I2C接口~
但是还有7个I2C接口~
zhhbncwu 发表于 2012-11-15 19:49 | 显示全部楼层
用宏定义应该可行
T_X_T 发表于 2012-11-15 20:09 | 显示全部楼层
一组IO口吗?还是多组?
dong_abc 发表于 2012-11-15 21:46 | 显示全部楼层
一般i2c器件都有地址线的,如24CXX 都有A0 ,A1 ,A2 . 可以设置不同的器件地址,应该可以接8个的,楼主试试。
sxhhhjicbb 发表于 2012-11-15 22:45 | 显示全部楼层
IIC可是总线啊,为什么不总线寻址呢.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

38

主题

591

帖子

3

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