ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

QMK 固件 IS31FL3737 驱动完全指南:I²C 12×12 LED 矩阵芯片的配置、接线映射与 API 详解

QMK 固件 IS31FL3737 驱动完全指南:I²C 12×12 LED 矩阵芯片的配置、接线映射与 API 详解 QMK 固件 IS31FL3737 驱动完全指南I²C 12×12 LED 矩阵芯片的配置、接线映射与 API 详解【免费下载链接】qmk_firmwareOpen-source keyboard firmware for Atmel AVR and Arm USB families项目地址: https://gitcode.com/GitHub_Trending/qm/qmk_firmware本文围绕 QMK 固件仓库中 Lumissil IS31FL3737 驱动docs/drivers/is31fl3737.md展开系统讲解这款 I²C 12×12 LED 矩阵芯片在键盘固件中的启用方式、I²C 地址配置、PWM 频率与去鬼影电阻调节、LED 输出映射以及驱动层完整的 C API。读完本文你将能够独立为单色背光LED Matrix或 RGB 矩阵RGB Matrix键盘接入 IS31FL3737并理解驱动源码层面的缓冲与分页机制。一、芯片与驱动概览IS31FL3737 是 Lumissil 出品的一款 I²C 接口 12×12 LED 矩阵驱动芯片数据手册见 IS31FL3737 Datasheet。QMK 对它的支持具有以下能力边界最多支持4 片IS31FL3737 级联每片芯片可驱动144 颗单色 LED每片芯片也可按 RGB 方式驱动48 颗 RGB LED每颗占用 R/G/B 三个通道驱动代码位于 drivers/led/issi/ 目录包含单色is31fl3737-mono.c/.h与 RGBis31fl3737.c/.h两套实现。在 QMK 中IS31FL3737 并非只能裸调当你通过RGB_MATRIX_IS31FL3737或LED_MATRIX_IS31FL3737选项使用 RGB Matrix 或 LED Matrix 功能时驱动会被自动编译并通过统一的驱动接口间接调用。以 quantum/rgb_matrix/rgb_matrix_drivers.c 为例is31fl3737_init_drivers、is31fl3737_flush、is31fl3737_set_color、is31fl3737_set_color_all被注册为驱动回调单色路径quantum/led_matrix/led_matrix_drivers.c则注册is31fl3737_set_value与is31fl3737_set_value_all。二、启用驱动独立使用与随特性自动编译2.1 通过 LED/RGB Matrix 自动引入如果你的键盘已经启用了 LED Matrix 或 RGB Matrix 功能并在配置中把驱动指定为is31fl3737那么驱动源码会被构建系统自动加入无需手动编写rules.mk。此时请直接使用 LED/RGB Matrix 提供的 API 操作灯光效果。2.2 独立使用Standalone如果需要绕过矩阵特性、直接操作驱动请在键盘的rules.mk中添加COMMON_VPATH $(DRIVER_PATH)/led/issi SRC is31fl3737-mono.c # For single-color SRC is31fl3737.c # For RGB I2C_DRIVER_REQUIRED yes其中单色键盘添加is31fl3737-mono.cRGB 键盘添加is31fl3737.c两者也可按需同时保留但通常二选一I2C_DRIVER_REQUIRED yes会拉入 QMK 的 I²C 主控层对应 drivers/i2c_master.h这是驱动与芯片通信的前提。三、基础配置项启用驱动后在键盘的config.h中按需定义以下宏DefineDefaultDescriptionIS31FL3737_SDB_PINNot defined连接到驱动芯片 shutdown 引脚的 GPIOIS31FL3737_I2C_TIMEOUT100I²C 传输超时时间毫秒IS31FL3737_I2C_PERSISTENCE0I²C 传输失败后的重试次数IS31FL3737_I2C_ADDRESS_1Not defined驱动 0 的 I²C 地址IS31FL3737_I2C_ADDRESS_2Not defined驱动 1 的 I²C 地址IS31FL3737_I2C_ADDRESS_3Not defined驱动 2 的 I²C 地址IS31FL3737_I2C_ADDRESS_4Not defined驱动 3 的 I²C 地址IS31FL3737_PWM_FREQUENCYIS31FL3737_PWM_FREQUENCY_8K4_HZLED 的 PWM 频率仅 IS31FL3737B 支持IS31FL3737_SW_PULLUPIS31FL3737_PUR_0_OHMSWx引脚的上拉电阻值IS31FL3737_CS_PULLDOWNIS31FL3737_PDR_0_OHMCSx引脚的下拉电阻值IS31FL3737_GLOBAL_CURRENT0xFF全局电流控制值0~255上述默认值在源码 drivers/led/issi/is31fl3737.c 中通过#ifndef ... #define ...方式兜底定义这意味着即使你不写这些宏驱动也能以默认参数工作。3.1 硬件相关IS31FL3737_SDB_PINIS31FL3737_SDB_PIN用于控制芯片的 shutdown 引脚。定义后驱动在is31fl3737_init_drivers()中会先把该引脚配置为输出并拉高见 drivers/led/issi/is31fl3737.c使芯片退出硬件关断状态。未定义时驱动跳过该步骤需要硬件上自行处理 SDB 引脚。3.2 I²C 可靠性参数IS31FL3737_I2C_TIMEOUT单次 I²C 写操作的超时阈值默认 100 msIS31FL3737_I2C_PERSISTENCE传输重试次数默认 0不重试。设置为大于 0 时源码会循环尝试直至成功或耗尽次数见is31fl3737_write_register()中基于#if IS31FL3737_I2C_PERSISTENCE 0的分支drivers/led/issi/is31fl3737.c。四、I²C 寻址配置IS31FL3737 根据ADDR引脚的接法可选用4 种 7 位 I²C 地址。在config.h中将IS31FL3737_I2C_ADDRESS_nn 为驱动索引 1~4设为下列值之一DefineValueIS31FL3737_I2C_ADDRESS_GND0x50IS31FL3737_I2C_ADDRESS_SCL0x55IS31FL3737_I2C_ADDRESS_SDA0x5AIS31FL3737_I2C_ADDRESS_VCC0x5F这些常量同样定义在 drivers/led/issi/is31fl3737.h。需要注意两点驱动数量由地址宏自动推导源码通过#if defined(IS31FL3737_I2C_ADDRESS_4) ... #elif defined(IS31FL3737_I2C_ADDRESS_1)链式判断drivers/led/issi/is31fl3737.h定义到ADDRESS_n即声明有 n 片驱动。因此多片级联时必须从ADDRESS_1开始连续定义。I²C 总线地址是 8 位形式驱动在写寄存器时执行i2c_write_register(i2c_addresses[index] 1, ...)把 7 位器件地址左移一位拼成带读写位的 8 位地址drivers/led/issi/is31fl3737.c。真实键盘示例keyboards/zsa/planck_ez/config.h单驱动IS31FL3737_I2C_ADDRESS_1 IS31FL3737_I2C_ADDRESS_GNDkeyboards/mt/mt84/config.h双驱动ADDRESS_1 GND、ADDRESS_2 VCC。五、PWM 频率调节IS31FL3737BIS31FL3737B 支持通过配置寄存器调整 LED 的 PWM 频率。在config.h中加入#define IS31FL3737_PWM_FREQUENCY IS31FL3737_PWM_FREQUENCY_8K4_HZ合法取值如下DefineFrequencyIS31FL3737_PWM_FREQUENCY_8K4_HZ8.4 kHz (默认)IS31FL3737_PWM_FREQUENCY_4K2_HZ4.2 kHzIS31FL3737_PWM_FREQUENCY_26K7_HZ26.7 kHzIS31FL3737_PWM_FREQUENCY_2K1_HZ2.1 kHzIS31FL3737_PWM_FREQUENCY_1K05_HZ1.05 kHz从源码看PWM 频率最终被写入 Function 页的配置寄存器((IS31FL3737_PWM_FREQUENCY 0b111) 3) | 0x01drivers/led/issi/is31fl3737.c即把频率编码0b000~0b100左移 3 位放入 PFS 位域同时将最低位置 1 以解除软件关断。若你的板子使用 IS31FL3737B 且对刷新率/噪声有要求可通过此宏调节更高频率可减少人耳可闻噪声但会以功耗为代价。实际项目示例keyboards/frooastboard/walnut将频率设为IS31FL3737_PWM_FREQUENCY_26K7_HZ见 keyboards/frooastboard/walnut/config.h。六、去鬼影De-Ghosting电阻配置LED 矩阵扫描时相邻行/列可能因寄生路径出现“鬼影”微亮。IS31FL3737 允许分别配置SWy引脚的上拉电阻和CSx引脚的下拉电阻来抑制该现象。原理细节可参考数据手册第 23 页。在config.h中设置#define IS31FL3737_SW_PULLUP IS31FL3737_PUR_0_OHM #define IS31FL3737_CS_PULLDOWN IS31FL3737_PDR_0_OHMIS31FL3737_SW_PULLUP合法值DefineResistanceIS31FL3737_PUR_0_OHMNone (默认)IS31FL3737_PUR_0K5_OHM0.5 kΩIS31FL3737_PUR_1K_OHM1 kΩIS31FL3737_PUR_2K_OHM2 kΩIS31FL3737_PUR_4K_OHM4 kΩIS31FL3737_PUR_8K_OHM8 kΩIS31FL3737_PUR_16K_OHM16 kΩIS31FL3737_PUR_32K_OHM32 kΩIS31FL3737_CS_PULLDOWN合法值DefineResistanceIS31FL3737_PDR_0_OHMNone (默认)IS31FL3737_PDR_0K5_OHM0.5 kΩIS31FL3737_PDR_1K_OHM1 kΩIS31FL3737_PDR_2K_OHM2 kΩIS31FL3737_PDR_4K_OHM4 kΩIS31FL3737_PDR_8K_OHM8 kΩIS31FL3737_PDR_16K_OHM16 kΩIS31FL3737_PDR_32K_OHM32 kΩ这些取值在头文件中以 3 位二进制常量定义drivers/led/issi/is31fl3737.h初始化时分别写入 Function 页的IS31FL3737_FUNCTION_REG_SW_PULLUP0x0F与IS31FL3737_FUNCTION_REG_CS_PULLDOWN0x10寄存器。七、全局电流控制IS31FL3737_GLOBAL_CURRENT控制CSx引脚吸收的电流取值 0~255默认最大0xFF。降低该值可以整体调暗所有 LED 的亮度上限。在config.h中#define IS31FL3737_GLOBAL_CURRENT 0xFF写入位置为 Function 页的IS31FL3737_FUNCTION_REG_GLOBAL_CURRENT0x01寄存器drivers/led/issi/is31fl3737.c。注意它与 PWM 占空比是两个独立维度全局电流限制“最大亮度”PWM 决定“当前亮度”。八、ARM/ChibiOS 平台的 I²C 配置在 ARMChibiOS平台上仅定义上述宏还不够。你需要根据键盘对应的 ChibiOS 板级配置在键盘层面启用并配置 I²C 外设。具体包括 I²C 引脚的复用alternate function、时钟频率等这部分属于平台级配置与驱动本身解耦。AVR 平台通常无需额外步骤。九、LED 映射把每个输出绑到 LED 索引驱动本身不知道你的 PCB 上哪颗 LED 接在哪个引脚因此必须在键盘源文件keyboard.c中定义映射表把“LED 索引 → 驱动编号 PWM 寄存器地址”对应起来。9.1 RGB 驱动const is31fl3737_led_t PROGMEM g_is31fl3737_leds[IS31FL3737_LED_COUNT] { /* Driver * | R G B */ {0, SW1_CS1, SW1_CS2, SW1_CS3}, // etc... };上例中驱动 0 的 LED 索引 0 其 R/G/B 三个通道的阴极都接到SW1引脚阳极分别接到CS1、CS2、CS3引脚。9.2 单色驱动单色驱动的原理相同只是每个 LED 只有一个通道const is31fl3737_led_t PROGMEM g_is31fl3737_leds[IS31FL3737_LED_COUNT] { /* Driver * | V */ {0, SW1_CS1}, // etc... };9.3 映射值含义与寄存器索引SWx_CSy这类符号并非任意名称而是直接对应芯片 PWM 寄存器地址例如SW1_CS1 0x00、SW1_CS12 0x0D、SW12_CS12 0xBD完整定义见 drivers/led/issi/is31fl3737.h。这些数值与数据手册第 15 页 Figure 9 中 PWM 寄存器索引一一对应。映射时请对照你的 PCB 原理图确认每颗 LED 的阴极SW 行与阳极CS 列实际接法再填表。IS31FL3737_LED_COUNT在启用 RGB Matrix / LED Matrix 时分别由RGB_MATRIX_LED_COUNT/LED_MATRIX_LED_COUNT提供见 drivers/led/issi/is31fl3737.h 与 drivers/led/issi/is31fl3737-mono.h因此独立使用时你也要在别处定义该宏。十、源码级原理寄存器分页与缓冲机制理解驱动的行为有助于排查问题。IS31FL3737 采用分页寄存器架构通过命令寄存器0xFD切换页面切换前需先向写锁寄存器0xFE写入解锁魔数0xC5Page 0 — LED ControlLED 开关On/Off控制共 24 个寄存器Page 1 — PWM每通道 8 位 PWM 亮度寄存器空间为 192 字节实际使用 144Page 2 — Auto Breath自动呼吸模式驱动默认保持 PWM 模式未单独配置Page 3 — Function配置寄存器含配置0x00、全局电流0x01、SW 上拉0x0F、CS 下拉0x10、复位0x11。初始化流程drivers/led/issi/is31fl3737.c为先选 LED Control 页关闭所有 LED → 选 PWM 页把所有 PWM 清 0 → 选 Function 页写入去鬼影电阻、全局电流最后通过配置寄存器解除软件关断并wait_ms(10)等待芯片唤醒。注释特别说明之所以最后解除关断是为了避免芯片带着寄存器中的脏数据驱动 LED。驱动还维护了两套软件缓冲pwm_buffer与led_control_buffer并带有脏标记dirty flagis31fl3737_set_color()/is31fl3737_set_value()只改写缓冲并置脏不会立即刷新到芯片is31fl3737_update_pwm_buffers()仅在缓冲为脏时才切换 PWM 页并以 16 字节为一组共 12 次传输批量写入is31fl3737_update_led_control_registers()同理刷新 LED 控制寄存器头文件注释提醒update_pwm_buffers不应在中断如定时器中断中调用应在矩阵扫描间隙的空闲期调用drivers/led/issi/is31fl3737.h。十一、API 参考以下为驱动对外公开的 C API单色/RGB 两套头文件均声明见 drivers/led/issi/is31fl3737.h 与 drivers/led/issi/is31fl3737-mono.h。struct is31fl3737_led_t描述单颗 LED 通道与其所属驱动的结构体。成员uint8_t driver所属驱动索引取值 0~3位域2 bituint8_t r红色通道的 PWM 寄存器地址仅 RGB 驱动uint8_t g绿色通道的 PWM 寄存器地址仅 RGB 驱动uint8_t b蓝色通道的 PWM 寄存器地址仅 RGB 驱动uint8_t vLED 的 PWM 寄存器地址仅单色驱动。RGB 版结构体定义见 drivers/led/issi/is31fl3737.h单色版为{uint8_t driver; uint8_t v;}drivers/led/issi/is31fl3737-mono.h。void is31fl3737_init(uint8_t index)初始化指定索引的 LED 驱动应最先调用。参数uint8_t index驱动索引0~3。void is31fl3737_write_register(uint8_t index, uint8_t reg, uint8_t data)向指定寄存器写入一个字节。参数uint8_t index驱动索引uint8_t reg寄存器地址uint8_t data要写入的值。void is31fl3737_select_page(uint8_t index, uint8_t page)切换当前配置页。参数uint8_t index驱动索引uint8_t page目标页号对应IS31FL3737_COMMAND_*常量。void is31fl3737_set_color(int index, uint8_t red, uint8_t green, uint8_t blue)设置单颗 LED 的颜色仅 RGB 驱动。不会立即生效完成后需调用is31fl3737_update_pwm_buffers()刷新。参数int indexLED 索引即g_is31fl3737_leds数组下标uint8_t red红色值uint8_t green绿色值uint8_t blue蓝色值。void is31fl3737_set_color_all(uint8_t red, uint8_t green, uint8_t blue)设置所有 LED 的颜色仅 RGB 驱动。内部循环调用is31fl3737_set_color()。参数uint8_t red/uint8_t green/uint8_t blueRGB 值。void is31fl3737_set_value(int index, uint8_t value)设置单颗 LED 的亮度仅单色驱动。不会立即生效需随后调用is31fl3737_update_pwm_buffers()。参数int indexLED 索引uint8_t value亮度值。void is31fl3737_set_value_all(uint8_t value)设置所有 LED 的亮度仅单色驱动。参数uint8_t value亮度值。void is31fl3737_set_led_control_register(uint8_t index, bool red, bool green, bool blue)配置单颗 LED 的 LED Control 寄存器开关仅 RGB 驱动。不会立即生效需调用is31fl3737_update_led_control_registers()。实现上按reg 通道寄存器地址 / 8、bit 地址 % 8定位到对应控制位drivers/led/issi/is31fl3737.c。参数uint8_t indexLED 索引bool red是否启用红色通道bool green是否启用绿色通道bool blue是否启用蓝色通道。void is31fl3737_set_led_control_register(uint8_t index, bool value)配置单颗 LED 的 LED Control 寄存器仅单色驱动。不会立即生效需调用is31fl3737_update_led_control_registers()。参数uint8_t indexLED 索引bool value启用或禁用该 LED。void is31fl3737_update_pwm_buffers(uint8_t index)把 PWM 缓冲刷新到驱动芯片仅在缓冲为脏时执行实际传输。参数uint8_t index驱动索引。void is31fl3737_update_led_control_registers(uint8_t index)把 LED Control 缓冲刷新到驱动芯片仅在缓冲为脏时执行。参数uint8_t index驱动索引。void is31fl3737_flush(void)对所有已启用驱动调用一次is31fl3737_update_pwm_buffers()是 RGB/LED Matrix 框架中统一的刷新入口。十二、典型接入流程小结要在 QMK 键盘上点亮 IS31FL3737完整步骤如下确认 PCB 上芯片的ADDR引脚接法确定 I²C 地址在rules.mk中启用驱动或通过RGB_MATRIX_IS31FL3737/LED_MATRIX_IS31FL3737自动引入在config.h中定义IS31FL3737_I2C_ADDRESS_1多片则继续定义到_n按需调整IS31FL3737_PWM_FREQUENCY、IS31FL3737_SW_PULLUP、IS31FL3737_CS_PULLDOWN、IS31FL3737_GLOBAL_CURRENT、IS31FL3737_SDB_PIN对照原理图在keyboard.c中编写g_is31fl3737_leds[]映射表ARM 平台按需完成 I²C 外设的板级配置参考 docs/drivers/i2c.md编译烧录并验证亮度与颜色若出现鬼影再逐步调大去鬼影电阻值。按照上述流程配合 QMK 的 LED Matrix / RGB Matrix 上层框架即可让单色背光或 RGB 灯效在 IS31FL3737 驱动的键盘上稳定运行。【免费下载链接】qmk_firmwareOpen-source keyboard firmware for Atmel AVR and Arm USB families项目地址: https://gitcode.com/GitHub_Trending/qm/qmk_firmware创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表