【STM32】使用STM32F103实现AW9106LED控制器的驱动程序设计
这里写自定义目录标题
原理图

PCB
驱动电路也非常简单,芯片体积也很小,宽电压输入:2.5V~5.5V。嘉立创有内置的原理图库和封装库,直接可以拖进来使用,大大减少开发时间。
驱动理论部分
需要注意的有,在规格书中描述的是IIC最大速率400kHz,平时模拟IIC的速度都可以达到500kHz了,所以一定要注意IIC的传输速度。
经过逻辑分析仪的抓取,可以看到,我将速率控制在100kHz左右,经过验证,可以完美读写。
IIC地址的计算,我们知道,IIC总线上可以挂很多设备,通过地址进行区分,AW9106上的两个Pin作为地址引脚,在地址冲突的情况下可以改变芯片地址,或者可以在一条IIC总线上挂4片IC。
根据规格书bit 1和bit 2作为地址引脚,根据硬件电路设计的高低电平来区别地址。bit 0作为读写标志引脚,1为读操作,0为写操作。
所以根据原理图计算,读操作的地址为0xB7,写操作的地址为0xB6。
驱动代码部分
aw9106.c程序
#include "aw9106.h"
#include "myiic.h"
#include "delay.h"
//0xB6写 0xB7读 根据原理图AD0,AD1去算
//9106半自动呼吸模式
void AW9106_SMART_FADE()
{
AW9106_WriteOneByte(EN_BRE,0xff);//设置呼吸使能
AW9106_WriteOneByte(CTL,0x03);//设置电流大小
AW9106_WriteOneByte(GPMD_A,0x00);//设置为输出LED模式
AW9106_WriteOneByte(GPMD_B,0x00);//设置为输出LED模式
AW9106_WriteOneByte(GPIO_CFG_A,0x00);//设置为输出模式
AW9106_WriteOneByte(GPIO_CFG_B,0x00);//设置为输出模式
AW9106_WriteOneByte(FADE_TMR,0x24);//设置呼吸时间
//使用下面两个函数控制亮灭
// AW9106_WriteOneByte(GPIO_OUTPUT_A,0xff);//开灯
// AW9106_WriteOneByte(GPIO_OUTPUT_B,0xff);//
//
// AW9106_WriteOneByte(GPIO_OUTPUT_A,0x00);//关灯
// AW9106_WriteOneByte(GPIO_OUTPUT_B,0x00);//
}
//9106RGB模式
void AW9106_SET_RGB(u8 red,u8 green,u8 blue)
{
AW9106_WriteOneByte(CTL,0x03);//设置电流大小
AW9106_WriteOneByte(GPMD_A,0x00);//设置为输出LED模式
AW9106_WriteOneByte(GPMD_B,0x00);//设置为输出LED模式
AW9106_WriteOneByte(DIM0,red);//LED1_R
AW9106_WriteOneByte(DIM1,blue);//LED1_B
AW9106_WriteOneByte(DIM2,green);//LED1_G
AW9106_WriteOneByte(DIM3,red);//LED2_R
AW9106_WriteOneByte(DIM4,blue);//LED2_B
AW9106_WriteOneByte(DIM5,green);//LED2_G
}
//在AW9106指定地址读出一个数据
//ReadAddr:开始读数的地址
//返回值 :读到的数据
u8 AW9106_ReadOneByte(u16 ReadAddr)
{
u8 temp=0;
IIC_Start();
IIC_Send_Byte(0xB6); //发送写命令
IIC_Wait_Ack();
IIC_Send_Byte(ReadAddr); //发送地址
IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte(0xB7); //进入接收模式
IIC_Wait_Ack();
temp=IIC_Read_Byte(0);
IIC_Stop();//产生一个停止条件
return temp;
}
//在AW9106指定地址写入一个数据
//WriteAddr :写入数据的目的地址
//DataToWrite:要写入的数据
void AW9106_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
{
IIC_Start();
IIC_Send_Byte(0xB6); //发送写命令
IIC_Wait_Ack();
IIC_Send_Byte(WriteAddr); //发送地址
IIC_Wait_Ack();
IIC_Send_Byte(DataToWrite); //发送字节
IIC_Wait_Ack();
IIC_Stop();//产生一个停止条件
delay_ms(10);
}
aw9106.h程序
#ifndef __AW9106_H
#define __AW9106_H
#include "sys.h"
#define GPIO_OUTPUT_A 0x02
#define GPIO_OUTPUT_B 0x03
#define GPIO_CFG_A 0x04
#define GPIO_CFG_B 0x05
#define CTL 0x11
#define GPMD_A 0x12
#define GPMD_B 0x13
#define EN_BRE 0x14
#define FADE_TMR 0x15
#define FULL_TMR 0x16
#define DLY0_BRE 0x17
#define DLY1_BRE 0x18
#define DLY2_BRE 0x19
#define DLY3_BRE 0x1A
#define DLY4_BRE 0x1B
#define DLY5_BRE 0x1C
#define DIM0 0x20
#define DIM1 0x21
#define DIM2 0x22
#define DIM3 0x23
#define DIM4 0x24
#define DIM5 0x25
#define RESET 0x7F
u8 AW9106_ReadOneByte(u16 ReadAddr);
void AW9106_WriteOneByte(u16 WriteAddr,u8 DataToWrite);
void AW9106_SMART_FADE(void);
void AW9106_SET_RGB(u8 red,u8 green,u8 blue);
#endif
主函数部分
#include "main.h"
#include "gpio.h"
#include "myiic.h"
#include "aw9106.h"
#include "delay.h"
void SystemClock_Config(void);
int main(void)
{
/* USER CODE BEGIN 1 */
u8 data;
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
HAL_GPIO_WritePin(SHDN_GPIO_Port,SHDN_Pin,GPIO_PIN_SET);
/* Infinite loop */
/* USER CODE BEGIN WHILE */
AW9106_WriteOneByte(RESET,0x00);//软件复位
AW9106_SMART_FADE();
while (1)
{
/* USER CODE END WHILE */
//操纵0和1的写入可以实现呼吸效果
AW9106_WriteOneByte(GPIO_OUTPUT_A,0xff);//开灯
AW9106_WriteOneByte(GPIO_OUTPUT_B,0xff);//
HAL_delay(5000);
AW9106_WriteOneByte(GPIO_OUTPUT_A,0x00);//关灯
AW9106_WriteOneByte(GPIO_OUTPUT_B,0x00);//
HAL_delay(5000);
//AW9106_SET_RGB(185,205,246);
//AW9106_SET_RGB(255,0,0);
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
结语
程序写的比较随意,并不是很规范,主要是为了验证其是否具有想要的功能。如有哪里有错误,麻烦大佬指出一下,感激不尽,感激不尽。
作者:无风灬幡动