你好,
我有一个关于在DA14585上使用多个I2C总线的问题。我正在使用MCP9600热电偶放大器,每个有8个可能的地址。我需要将64个传感器连接到DA14585,并以~1Hz读取它们。
我的计划是设置8个独立的总线,每个总线都有自己的数据线和一个共享时钟(在DA14585上总共使用9个引脚)。DA14585将设置I2C控制器的基础上,它想要交谈的总线和当它完成这个总线,让数据线保持高。从I2C的角度来看,非活动总线上的芯片在总线不活动时看到的是常数1,这比其他配置更好,在其他配置中每个芯片都有自己的时钟,芯片看到的是常数停止/启动命令。
我唯一不确定的是如何在代码中完成这一点。我想将其设置为这样,以便我可以通过公共汽车切换。是必要的保留_gpio()命令,或者会让事情混淆吗?否则我认为这会有效
void init_MCP(void){RESERVE_GPIO(,ALL_SCL_PORT, ALL_SCL_PIN, PID_I2C_SCL);RESERVE_GPIO (BUS1_SDA_PORT BUS1_SDA_PIN, PID_I2C_SDA); / / ? ?RESERVE_GPIO (BUS2_SDA_PORT BUS2_SDA_PIN, PID_I2C_SDA); / / ? ?剩余的针……GPIO_ConfigurePin(ALL_SCL_PORT, ALL_SCL_PIN, INPUT, 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, INPUT, PID_I2C_SDA, false);for(所有其他总线)GPIO_ConfigurePin(BUS1_SDA_PORT, BUS1_SDA_PIN, INPUT, PID_GPIO, false);打破;case 2: GPIO_ConfigurePin(BUS2_SDA_PORT, BUS2_SDA_PIN, INPUT, PID_I2C_SDA, false);for(所有其他总线)GPIO_ConfigurePin(BUS1_SDA_PORT, BUS1_SDA_PIN, INPUT, PID_GPIO, false); break; 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来完成这个,但我们的空间有限,它只是一个额外的组件,可能会失败
设备:
嗨ahiggs,
感谢您在线的问题,详细描述。我们没有演示所描述的功能的示例,但这可能是一种可能的方法。每次要更改“BUS_NUMBER”时,您应该将适当的GPIO重新配置为I2C引脚。你在HW设置上测试了吗?
谢谢,PM_Dialog
你好,
感谢你的及时回复。我只在其中一个总线上使用MCP9600S测试了硬件设置,但它有效。我还没有设计电路板以测试完整的系统。如果有人有兴趣,这是这个设置的代码片段
嗨ahiggs,
谢谢你的意见。如果您有任何其他问题,请提出一个新的论坛线程。
谢谢,PM_Dialog