打印

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

[复制链接]
6904|39
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
阮天宇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:
   

}

使用特权

评论回复
5
阮天宇00|  楼主 | 2012-11-15 16:56 | 只看该作者
4# Ryanhsiung

有好几个物理,地址相同呢,咋办?
那样就要用不同的IO分别接了吧

使用特权

评论回复
6
阮天宇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


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

刚才问了好多人,都不明白我问的什么~

使用特权

评论回复
7
coody| | 2012-11-15 18:05 | 只看该作者
器件地址

使用特权

评论回复
8
阮天宇00|  楼主 | 2012-11-15 18:12 | 只看该作者
7# coody
器件地址一样~总么办

使用特权

评论回复
9
阮天宇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头文件了~
:'(

使用特权

评论回复
10
闲来玩玩| | 2012-11-15 18:17 | 只看该作者
学习。

使用特权

评论回复
11
阮天宇00|  楼主 | 2012-11-15 18:23 | 只看该作者
我看能不能在void I2C_Write_Byte()函数里面就选择好硬件接口;
先试试。

使用特权

评论回复
12
icecut| | 2012-11-15 18:39 | 只看该作者
如果sbit不是变量的话.还是使用宏定义吧.一下子生产很多函数
# define ... iicread#part# ...

使用特权

评论回复
13
阮天宇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;
                        
                }
这样行么?
宏定义可以在运行中使用么?

有警告~:'(

使用特权

评论回复
14
阮天宇00|  楼主 | 2012-11-15 19:06 | 只看该作者
12# icecut

没看明白~
可以写的具体点么

使用特权

评论回复
15
piliming| | 2012-11-15 19:10 | 只看该作者
硬件没做好的代价就是软件麻烦,楼主找到好的解决方法告诉大家一声呵。。。也学习一下。

使用特权

评论回复
16
阮天宇00|  楼主 | 2012-11-15 19:15 | 只看该作者
15# piliming
嗯,部分DEVICE ADDRESS不同的可以共用一个I2C接口~
但是还有7个I2C接口~

使用特权

评论回复
17
zhhbncwu| | 2012-11-15 19:49 | 只看该作者
用宏定义应该可行

使用特权

评论回复
18
T_X_T| | 2012-11-15 20:09 | 只看该作者
一组IO口吗?还是多组?

使用特权

评论回复
19
dong_abc| | 2012-11-15 21:46 | 只看该作者
一般i2c器件都有地址线的,如24CXX 都有A0 ,A1 ,A2 . 可以设置不同的器件地址,应该可以接8个的,楼主试试。

使用特权

评论回复
20
sxhhhjicbb| | 2012-11-15 22:45 | 只看该作者
IIC可是总线啊,为什么不总线寻址呢.

使用特权

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

本版积分规则

38

主题

592

帖子

3

粉丝