瑞昱rtl8762芯片通过I2C操作AW20108,从而实现多个LED的控制
本人还在学习、摸索rtl8762,如有错误之处,欢迎指出。
1、引脚分布
引脚名称 | 引脚编号 |
---|---|
SCK | P3_2 |
DATA | P3_3 |
INTN | P2_2 |
EN | P0_2 |
2、了解AW20108
资料来源:艾为官方,有需要的同学可以自取。
1)了解IC引脚
从下图可以看到,需要通过软件控制的IO口有4根,分别是:SDA、SCL、INTN、EN。硬件上目前是将EN直接拉高,所以EN不需要操作。
2)如何控制
a、通信方式
aw20108是通过I2C控制,最大速率为400khz。器件地址通过由第25pin AD选择,硬件上与GND连接,所以器件地址为0x3A(如下图所示),大家根据自身硬件连接修改器件地址。
b、如何点亮LED
aw20108可以同时控制108颗LED,而它是通过扫描控制。那么作为程序员,应该如何点亮LED呢?其实很简单,数据手册给出了两种方案:
1、将ALLON位置1,通过改变某个LED的电流来点亮LED;
2、将所有LED电流设为非0值(即有电流),再通过控制寄存器LEDONx来点亮LED;
两种方式各有优点:
第一种:代码量略多,可以单独控制某个LED,从而不影响别的LED状态;
第二种:代码量少,编写方便。由于一个寄存器LEDONx中,包含6个LED的状态,同时LEDONx是只写的,如果想做到点亮LED0的同时,不影响LED1的话,只能代码上使用变量保存寄存器的值。
所以,目前代码实现上使用的是第一种操作方式,以下代码也会以第一种方式展现。
3、代码添加
1)引脚宏定义
/***************************** IIC *****************************/
#define I2C_CLK_PIN P3_2 //< I2C 时钟线
#define I2C_DATA_PIN P3_3 //< I2C 数据线
/************************** LED DRIVER **************************/
#define LED_DRIVER_I2C I2C0
#define LED_INTN_PIN P2_2
#define LED_EN_PIN P0_2 //< led驱动使能
#define LED_INTN_PIN_NUM GPIO_GetPin(LED_INTN_PIN)
#define LED_EN_PIN_NUM GPIO_GetPin(LED_EN_PIN)
2)初始化GPIO
初始化GPIO分为两组,1组为spi的引脚初始化,1组为普通IO的引脚初始化。
/**
* @brief :引脚初始化
* @param :NULL
* @retval :NULL
*/
static void gpio_init(void)
{
RCC_PeriphClockCmd(APBPeriph_GPIO, APBPeriph_GPIO_CLOCK, ENABLE);
Pad_Config(I2C_CLK_PIN, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_UP,
PAD_OUT_ENABLE, PAD_OUT_HIGH);
Pad_Config(I2C_DATA_PIN, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_UP,
PAD_OUT_ENABLE, PAD_OUT_HIGH);