【STM32】使用STM32F103实现AW9106LED控制器的驱动程序设计

这里写自定义目录标题

  • 原理图
  • PCB
  • 驱动理论部分
  • 驱动代码部分
  • 结语
  • 原理图

  • 原理图中,第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 */
    }
    

    结语

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

    作者:无风灬幡动

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【STM32】使用STM32F103实现AW9106LED控制器的驱动程序设计

    发表回复