/****************************************************************************************
* WS2811 彩灯驱动函数
*
* 调用方法:
* 修改宏定义: #define nWs 1 // 有多少颗WS2811级联
* WS_Init(); // IO初始化
* WsDat[0] = 0x808080;//显存赋值
* WS_SetAll(); // 发送数据
* ColorToColor(unsigned long color0, unsigned long color1);// 颜色渐变算法
*
* 作者:星希望(已校验)
* 日期:2015年6月24日
****************************************************************************************/
#include "includes.h"
#define RCC_PAout RCC_AHBPeriph_GPIOB
#define PORT_PAout GPIOB
#define PIN_PAout GPIO_Pin_15
#define RCC_PEN RCC_AHBPeriph_GPIOB
#define PORT_PEN GPIOB
#define PIN_PEN GPIO_Pin_9
#define PAout_0() PORT_PAout->BRR = PIN_PAout
#define PAout_1() PORT_PAout->BSRR = PIN_PAout
#define PEN_0() PORT_PEN->BRR = PIN_PEN
#define PEN_1() PORT_PEN->BSRR = PIN_PEN
/* 显存 */
unsigned long WsDat[nWs];
uint32_t WsCol[nWs];
/*
*********************************************************************************************************
* 函 数 名: WS_Init
* 功能说明: 初始化WS2811输出GPIO
* 形 参:无
* 返 回 值: 无
*********************************************************************************************************
*/
void WS_Init()
{
GPIO_InitTypeDef GPIO_InitStruct;
//端口时钟,使能
RCC_AHBPeriphClockCmd(RCC_PAout | RCC_PEN, ENABLE);
// 端口配置
GPIO_InitStruct.GPIO_Pin = PIN_PAout; // PIN
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; // 推挽输出
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; // IO口速度为50MHz
GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
GPIO_Init(PORT_PAout, &GPIO_InitStruct); // 根据设定参数初始化
GPIO_InitStruct.GPIO_Pin = PIN_PEN; // PIN
GPIO_Init(PORT_PEN, &GPIO_InitStruct); // 根据设定参数初始化
PEN_1();
}
/*
*********************************************************************************************************
* 函 数 名: delay2us
* 功能说明: 延时2us
* 形 参:无
* 返 回 值: 无
*********************************************************************************************************
*/
void delay2us(void)
{
unsigned char i;
for(i=0; i<12; i++);
}
/*
*********************************************************************************************************
* 函 数 名: delay05us
* 功能说明: 延时0.5us
* 形 参:无
* 返 回 值: 无
*********************************************************************************************************
*/
void delay05us(void)
{
unsigned char i;
for(i=0; i<2; i++);
}
/*
*********************************************************************************************************
* 函 数 名: TX0,TX1
* 功能说明: 高速模式(最快)发送码值0 ,1
* 形 参:无
* 返 回 值: 无
*********************************************************************************************************
*/
void TX0() { PAout_1(); delay05us; PAout_0(); delay_us(2); } // 发送0
void TX1() { PAout_1(); delay_us(2); PAout_0(); delay05us; } // 发送1
/*
*********************************************************************************************************
* 函 数 名: TXL0,TXL1
* 功能说明: 速度降一倍发送码值0 ,1
* 形 参:无
* 返 回 值: 无
*********************************************************************************************************
*/
void TXL0(void) { PAout_1(); delay2us; PAout_0(); delay_us(5); } // 发送0
void TXL1(void) { PAout_1(); delay_us(5); PAout_0(); delay2us; } // 发送1
/*
*********************************************************************************************************
* 函 数 名: WS_Reset
* 功能说明: 发送码值 帧单位
* 形 参:无
* 返 回 值: 无
*********************************************************************************************************
*/void WS_Reset() {PAout_0() ; delay_us(60); PAout_1();}//PAout_0();
/*
*********************************************************************************************************
* 函 数 名: WS_Set1
* 功能说明: 高速发送24Bit数据
* 形 参:dat,发送的数据
* 返 回 值: 无
*********************************************************************************************************
*/
void WS_SetH(unsigned long dat)
{
unsigned char i;
for(i=0; i<24; i++)
{
if(0x800000 == (dat & 0x800000) ) TX1();
else TX0();
dat<<=1; //左移一位
}
}
/*
*********************************************************************************************************
* 函 数 名: WS_SetL
* 功能说明: 低速发送24Bit数据
* 形 参:dat,发送的数据</