你好,
我对DA14585上的多个I2C总线有所了解。我正在使用MCP9600热电偶放大器,每个放大器每个都有8个可能的地址。我需要将这些传感器中的64个连接到DA14585,并在〜1Hz读取它们。
我的计划是设置8个单独的总线,每个总线都有自己的数据线和一个共享时钟(在DA14585上使用总共9个引脚)。DA14585将基于它想要与该总线完成的哪些总线进行配置的I2C控制器,让数据线保持高。从I2C的角度来看,非活动总线上的芯片会看到常量1的总线时,当它们的总线未激活时,这对于其他配置是优选的,其中每个配置都有其自己的时钟,并且芯片看到恒定的停止/启动命令。
我唯一不确定的是如何在代码中实现这一点。我想把它设置成这样,这样我就可以在公共汽车上切换了。RESERVE GPIO()命令是必要的,还是会让事情变得混乱?否则我想这会管用的
void init_mcp(void){letail_gpio(,all_scl_port,all_scl_pin,pid_i2c_scl);保留_gpio(,bus1_sda_port,bus1_sda_pin,pid_i2c_sda); // ????保留_gpio(,bus2_sda_port,bus2_sda_pin,pid_i2c_sda); // ????剩余的引脚... gpio_configurepin(all_scl_port,all_scl_pin,输入,pid_i2c_scl,false);void select_mcp_bus(uint8_t bus_number){switch bus_number:case 1:gpio_configurepin(bus1_sda_port,bus1_sda_pin,输入,pid_i2c_sda,false);for(所有其他总护)GPIO_CONFIGUREPIN(BUS1_SDA_PORT,BUS1_SDA_PIN,INPUT,PID_GPIO,FALSE);休息;案例2:gpio_configurepin(bus2_sda_port,bus2_sda_pin,输入,pid_i2c_sda,false);for(所有其他总护)GPIO_CONFIGUREPIN(BUS1_SDA_PORT,BUS1_SDA_PIN,INPUT,PID_GPIO,FALSE);休息; case 3: remaining busses... } void send_temperature(){ for(all 8 busses){ select_MCP_BUS(bus#) for(all 8 MCPs){ sample_send_temp(MCP#) } } }
我知道我可以使用一个i2c mux来完成这一点,但我们的空间有限,它只是一个可能失败的额外组件
设备:

嗨,阿希格斯,
感谢您的在线提问和详细描述。我们没有这样一个示例来演示所描述的功能,但这可能是一种可行的方法。每次您想更改“总线号”时,都应该将相应的GPIO重新配置为I2C引脚。你在硬件设置上测试过这个吗?
谢谢,PM_DIALOG.
你好,
谢谢你的及时回复。我只在一条总线上用MCP9600测试了硬件设置,但它工作了。我还没有设计测试板来测试整个系统。如果有人感兴趣,这里有一段代码用于此设置
嗨,阿希格斯,
谢谢你的意见。如果您有任何其他问题,请提出一个新的论坛线程。
谢谢,PM_DIALOG.