如何为Adafruit ADS1115配置Arduino第二I2C总线(Sercom)
适配Adafruit Grand Central M4第二I2C总线的ADS1115非阻塞代码修改
核心修改逻辑
Grand Central M4的第二I2C总线对应Wire1对象,默认映射引脚为24(SCL1)和25(SDA1)。要将ADS1115迁移至该总线,需对原nonblocking.ino完成以下关键调整:
- 替换默认I2C实例
Wire为Wire1 - 在ADS1115初始化时传入
Wire1对象,明确指定使用第二总线 - 显式初始化
Wire1并绑定对应引脚(可选但更严谨)
修改后的完整代码
#include <Adafruit_ADS1X15.h> Adafruit_ADS1115 ads; // 16位ADS1115使用此定义 // Adafruit_ADS1015 ads; // 12位ADS1015使用此定义 // 显式定义第二I2C总线引脚(Grand Central M4的Wire1默认对应24/25) #define SCL1_PIN 24 #define SDA1_PIN 25 void setup(void) { Serial.begin(9600); while (!Serial); Serial.println("ADS1115 Non-Blocking Test"); // 初始化第二I2C总线 Wire1.begin(SDA1_PIN, SCL1_PIN); // 绑定Wire1初始化ADS1115,指定设备地址0x48(可根据硬件跳线修改) if (!ads.begin(0x48, &Wire1)) { Serial.println("ADS1115初始化失败"); while (1); } // 启动单次非阻塞转换,完成后等待下次触发 ads.startADCReading(ADS1X15_REG_CONFIG_MUX_SINGLE_0, /*continuous=*/false); } void loop(void) { // 检查转换是否完成 if (ads.conversionComplete()) { int16_t rawValue = ads.getLastConversionResults(); float voltage = ads.computeVolts(rawValue); Serial.print("AIN0原始值: "); Serial.print(rawValue); Serial.print(" | 电压: "); Serial.print(voltage); Serial.println("V"); // 启动下一次非阻塞转换 ads.startADCReading(ADS1X15_REG_CONFIG_MUX_SINGLE_0, /*continuous=*/false); } // 此处可添加其他任务逻辑,非阻塞模式下不会阻塞主循环 delay(10); // 示例延迟,可根据实际需求调整 }
额外注意事项
- 接线验证:确认ADS1115的SDA接引脚25、SCL接引脚24,VCC/GND连接正确
- 库版本要求:确保使用最新版Adafruit_ADS1X15库(支持传入自定义I2C对象)
- FreeRTOS适配:多任务环境下需为
Wire1操作添加互斥锁,避免总线访问冲突,示例片段:SemaphoreHandle_t i2cSemaphore; // 任务初始化阶段创建互斥锁 i2cSemaphore = xSemaphoreCreateMutex(); // 访问ADS1115前获取锁 if(xSemaphoreTake(i2cSemaphore, portMAX_DELAY) == pdTRUE){ if (ads.conversionComplete()) { // 执行转换读取逻辑 } xSemaphoreGive(i2cSemaphore); }
内容的提问来源于stack exchange,提问作者ChrisB
相关产品推荐
相关产品推荐

