简介
IS31FL3743A 是一款通用的 18×n (n=1~11) LED 矩阵,可通过 1MHz I2C 兼容接口进行编程。每个 LED 均可使用 8 位 PWM 数据和 8 位 DC 缩放数据单独调光,从而实现 256 级线性 PWM 调光和 256 级 DC 电流可调级别。
特征
- 1MHz I2C 兼容接口
- 24kHz 脉宽调制频率
- 256 个单独的 LED PWM 控制
引脚说明
I²C相关
IS31FL3743A设备地址是7位地址,A0是读写位(写:0 、读:1)、设备地址的值由ADDR1、和ADDR2的连接来决定,具体参见下表
地址自动递增
要将多个字节的数据写入 IS31FL3743A,需发送第一个数据字节所需的数据寄存器的地址。在IS31FL3743A 确认接收数据字节期间,内部地址指针将加1。发送到 IS31FL3743A 的下一个数据字节将被放置在新地址中,依此类推。只要数据继续写入 IS31FL3743A,地址就会继续自动递增。
读取寄存器
要读取寄存器值,必须先发送写寄存器操作,再发送读寄存器操作,例如:
- 从机地址+写
- 寄存器地址
- 从机地址+读
- 寄存器地址
例如要读取 FCh、FEh,在 I2C 启动条件后,总线主机必须使用 R/W 发送 IS31FL3743A 设备地址位设置为“0”,后跟寄存器地址(FEh 或 F1h),用于确定访问哪个寄存器。然后重新启动I2C,总线主机应发送带有R/W的IS31FL3743A设备地址位设置为“1”。来自寄存器定义的数据然后命令字节从 IS31FL3743A 发送到主机。要读取第 0 页到第 3 页的寄存器,FDh 应写入 00h,然后再按照顺序读取数据。也就是说,当要读取Page 0的寄存器时,FDh应该先指向Page 0,然后才能读取Page 0的数据。
写寄存器
发送:
- 从机地址+写
- 寄存器地址
- 发送data
寄存器定义
- FEh:用于解除写锁定,写寄存器前需向该寄存器写入0xC5,解除锁定,FDh允许修改一次,修改FDh后FEh将立即重置为0x00。再次写入FDh寄存器需重新解锁。
- FDh:命令寄存器,上电被锁定,写入该寄存器前需要先解锁。取值:00(PWM寄存器)、01(DC寄存器)、10(功能寄存器)
- FCh:ID寄存器
FDh 命令寄存器
配置寄存器
需要根据产品具体使用LED数量,修改配置寄存器SWS位。
全局电流控制寄存器
可以同时控制所有LED电流,控制所有LED为同一亮度
其他
关机模式
关机模式可用作降低功耗的一种手段。在关断模式期间,所有寄存器都保留其数据。
软件关闭
通过将配置寄存器的 SSD 位(PG2,00h)设置为“0”,IS31FL3743A 将在软件关断模式下运行。当 IS31FL3743A 处于软件关闭状态时,所有电流源均关闭,从而使矩阵消隐。所有寄存器均可操作。典型电流消耗为 1.3μA。
硬件关闭
当SDB引脚被拉低时,芯片进入硬件关闭状态。硬件关闭期间所有模拟电路均被禁用,当SDB引脚被拉高时,芯片释放硬件关闭。在硬件关闭状态下,可以对功能寄存器进行操作。如果在 SDB 拉低期间 VCC 有下降到 1.75V 以下但高于 0.1V 的风险,请在 SDB 拉高之前重新初始化所有功能寄存器。
参考代码
#include<Wire.h>
#include<avr/pgmspace.h>
#define Addr_GND_GND 0x40
void setup() {
//put your setup code here, to run once:
pinMode(13, OUTPUT);//ARDUINO BOARD LED control
Wire.begin();
Wire.setClock(400000);//I2C 400kHz
}
byte PWM_Gamma64[64]=
{
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
0x08,0x09,0x0b,0x0d,0x0f,0x11,0x13,0x16,
0x1a,0x1c,0x1d,0x1f,0x22,0x25,0x28,0x2e,
0x34,0x38,0x3c,0x40,0x44,0x48,0x4b,0x4f,
0x55,0x5a,0x5f,0x64,0x69,0x6d,0x72,0x77,
0x7d,0x80,0x88,0x8d,0x94,0x9a,0xa0,0xa7,
0xac,0xb0,0xb9,0xbf,0xc6,0xcb,0xcf,0xd6,
0xe1,0xe9,0xed,0xf1,0xf6,0xfa,0xfe,0xff
};
void IS_IIC_WriteByte(uint8_t Dev_Add,uint8_t Reg_Add,uint8_t Reg_Dat)//writing an LED register
{
Wire.beginTransmission(Dev_Add/2);
Wire.write(Reg_Add); // sends regaddress
Wire.write(Reg_Dat); // sends regaddress
Wire.endTransmission(); // stop transmitting
}
void loop() {
// put your main code here, to run repeatedly:
mainloop();
}
void Init3743A(void)
{
int i,j;
IS_IIC_WriteByte(Addr_GND_GND,0xfe,0xc5);
IS_IIC_WriteByte(Addr_GND_GND,0xfd,0x00);//page 0
for(i=0; i<0xC7; i++)
{
IS_IIC_WriteByte(Addr_GND_GND,i,0);//PWM
}
IS_IIC_WriteByte(Addr_GND_GND,0xfe,0xc5);
IS_IIC_WriteByte(Addr_GND_GND,0xfd,0x01);//page 1
for(i=1; i<0xC7; i++)
{
IS_IIC_WriteByte(Addr_GND_GND,i,0xff);//scaling
}
IS_IIC_WriteByte(Addr_GND_GND,0xfe,0xc5);
IS_IIC_WriteByte(Addr_GND_GND,0xfd,0x02);//page 2
IS_IIC_WriteByte(Addr_GND_GND,0x02,0x70);
IS_IIC_WriteByte(Addr_GND_GND,0x01,0xFF);//GCC
IS_IIC_WriteByte(Addr_GND_GND,0x00,0x01);//
}
void mainloop(void)//
{
int i,j;
Init3743A();
digitalWrite(13, LOW); // turn the ARDUINO BOARD LED on (HIGH is the voltage level)
while(1)
{
//BLUE
digitalWrite(13, HIGH); // turn the ARDUINO BOARD LED on (HIGH is the voltage level)
IS_IIC_WriteByte(Addr_GND_GND,0xfe,0xc5);
IS_IIC_WriteByte(Addr_GND_GND,0xfd,0x00);//page 0
for(j=0; j<64; j++)
{
for(i=1; i<0xC7; i=i+3)
{
IS_IIC_WriteByte(Addr_GND_GND,i,PWM_Gamma64[j]);//PWM}
}
}
delay(500);
digitalWrite(13, LOW); // turn the ARDUINO BOARD LED OFF (HIGH is the voltage level)
IS_IIC_WriteByte(Addr_GND_GND,0xfe,0xc5);
IS_IIC_WriteByte(Addr_GND_GND,0xfd,0x00);//page 0
for(j=63; j>=0; j--)
{
for(i=1; i<0xC7; i=i+3)
{
IS_IIC_WriteByte(Addr_GND_GND,i,PWM_Gamma64[j]);//PWM}
}
}
delay(500);
//GREEN
digitalWrite(13, HIGH); // turn the ARDUINO BOARD LED on (HIGH is the voltage level)
IS_IIC_WriteByte(Addr_GND_GND,0xfe,0xc5);
IS_IIC_WriteByte(Addr_GND_GND,0xfd,0x00);//page 0
for(j=0; j<64; j++)
{
for(i=2; i<0xC7; i=i+3)
{
IS_IIC_WriteByte(Addr_GND_GND,i,PWM_Gamma64[j]);//PWM}
}
}
delay(500);
digitalWrite(13, LOW); // turn the ARDUINO BOARD LED OFF (HIGH is the voltage level)
IS_IIC_WriteByte(Addr_GND_GND,0xfe,0xc5);
IS_IIC_WriteByte(Addr_GND_GND,0xfd,0x00);//page 0
for(j=63; j>=0; j--)
{
for(i=2; i<0xC7; i=i+3)
{
IS_IIC_WriteByte(Addr_GND_GND,i,PWM_Gamma64[j]);//PWM}
}
}
delay(500);
//RED
digitalWrite(13, HIGH); // turn the ARDUINO BOARD LED on (HIGH is the voltage level)
IS_IIC_WriteByte(Addr_GND_GND,0xfe,0xc5);
IS_IIC_WriteByte(Addr_GND_GND,0xfd,0x00);//page 0
for(j=0; j<64; j++)
{
for(i=3; i<0xC7; i=i+3)
{
IS_IIC_WriteByte(Addr_GND_GND,i,PWM_Gamma64[j]);//PWM}
}
}
delay(500);
digitalWrite(13, LOW); // turn the ARDUINO BOARD LED OFF (HIGH is the voltage level)
IS_IIC_WriteByte(Addr_GND_GND,0xfe,0xc5);
IS_IIC_WriteByte(Addr_GND_GND,0xfd,0x00);//page 0
for(j=63; j>=0; j--)
{
for(i=3; i<0xC7; i=i+3)
{
IS_IIC_WriteByte(Addr_GND_GND,i,PWM_Gamma64[j]);//PWM}
}
}
delay(500);
//WHITE
digitalWrite(13, HIGH); // turn the ARDUINO BOARD LED on (HIGH is the voltage level)
IS_IIC_WriteByte(Addr_GND_GND,0xfe,0xc5);
IS_IIC_WriteByte(Addr_GND_GND,0xfd,0x00);//page 0
for(j=0; j<64; j++)
{
for(i=1; i<0xC7; i++)
{
IS_IIC_WriteByte(Addr_GND_GND,i,PWM_Gamma64[j]);//PWM}
}
}
delay(500);
digitalWrite(13, LOW); // turn the ARDUINO BOARD LED OFF (HIGH is the voltage level)
IS_IIC_WriteByte(Addr_GND_GND,0xfe,0xc5);
IS_IIC_WriteByte(Addr_GND_GND,0xfd,0x00);//page 0
for(j=63; j>=0; j--)
{
for(i=1; i<0xC7; i++)
{
IS_IIC_WriteByte(Addr_GND_GND,i,PWM_Gamma64[j]);//PWM}
}
}
delay(500);
}
}