IS31FL3743A介绍

简介

        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);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值