【STM32】使用STM32F103驱动AW9106LED控制器程序

原理图

  • 原理图中,第6脚和第19脚是地址配置引脚,通过不同的配置可以在一条IIC总线上挂4片AW9106。我这里挂的都是高电平,计算地址的方法下文有写。
  • 此原理图是根据AW9106规格书中电路设计,目的是驱动两个RGB灯珠。
  • 如MCU连接的就是三个引脚,SCL,SDA,SHDN。其中SDA,SDL是IIC协议的引脚,SHDN是复位引脚,低电平有效。使用时需要将SHDN拉高。
    在这里插入图片描述

PCB

驱动电路也非常简单,芯片体积也很小,宽电压输入:2.5V~5.5V。嘉立创有内置的原理图库和封装库,直接可以拖进来使用,大大减少开发时间。
PCB 2D版本
PCB 3D版本

驱动理论部分

需要注意的有,在规格书中描述的是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 */
}

结语

程序写的比较随意,并不是很规范,主要是为了验证其是否具有想要的功能。如有哪里有错误,麻烦大佬指出一下,感激不尽,感激不尽。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值