WS2812B驱动不成功

2019-07-20 07:48发布

本人使用的是stm32f407vet6的板子,程序编译也没什么问题就是不知道哪里错了请大神指点暂时先弄得4个灯但是没有一个亮

ws2812b.c

#include "WS2812B.h"
#include "spi.h"
#include "rcc.h"

#define RGBLED_SPI SPI2

void RGB_Config(void)
{
        RCC_Config();
        RGBLED_SPI_Config();
}




void RGB_SetColor(uint8_t RGB_R,uint8_t RGB_G,uint8_t RGB_B)
{
        uint8_t i,j,k;
        for(i=0;i<8;i++)
        {//·¢&#203;í0&#194;&#235;1&#194;&#235;
                if(((RGB_G<<i)&0x80)==0x80)
                {//·¢&#203;í0&#194;&#235;
                        while(SPI_I2S_GetFlagStatus(RGBLED_SPI,SPI_I2S_FLAG_TXE)==RESET);
                        SPI_I2S_SendData(RGBLED_SPI,0XFC);
                }
                else
                        {//·¢&#203;í1&#194;&#235;
                        while(SPI_I2S_GetFlagStatus(RGBLED_SPI,SPI_I2S_FLAG_TXE)==RESET);
                        SPI_I2S_SendData(RGBLED_SPI,0XC0);
                        }
        }
        for(j=0;j<8;j++)
        {
                if(((RGB_R<<j)&0x80)==0x80)
                {
                        while(SPI_I2S_GetFlagStatus(RGBLED_SPI,SPI_I2S_FLAG_TXE)==RESET);
                        SPI_I2S_SendData(RGBLED_SPI,0XFC);
                }
                else
                        {
                        while(SPI_I2S_GetFlagStatus(RGBLED_SPI,SPI_I2S_FLAG_TXE)==RESET);
                        SPI_I2S_SendData(RGBLED_SPI,0XC0);
                        }
        }

        for(k=0;k<8;k++)
        {
                if(((RGB_B<<j)&0x80)==0x80)
                {
                        while(SPI_I2S_GetFlagStatus(RGBLED_SPI,SPI_I2S_FLAG_TXE)==RESET);
                        SPI_I2S_SendData(RGBLED_SPI,0XFC);
                }
                else
                        {
                        while(SPI_I2S_GetFlagStatus(RGBLED_SPI,SPI_I2S_FLAG_TXE)==RESET);
                        SPI_I2S_SendData(RGBLED_SPI,0XC0);
                        }
        }



}

void RGBLED_SPI_Config(void)
{
        SPI_InitTypeDef SPI_InitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;
       
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//ê1&#196;üGPIOAê±&#214;ó
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);//ê1&#196;üSPI1ê±&#214;ó

          //GPIOFB3,4,53&#245;ê&#188;&#187;ˉéè&#214;&#195;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_7;//PB3~5&#184;′ó&#195;1|&#196;üê&#228;3&#246;       
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//&#184;′ó&#195;1|&#196;ü
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//í&#198;íìê&#228;3&#246;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//é&#207;à-
  GPIO_Init(GPIOB, &GPIO_InitStructure);//3&#245;ê&#188;&#187;ˉ

        SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;  //éè&#214;&#195;SPIμ¥&#207;ò&#187;ò&#213;&#223;&#203;&#171;&#207;òμ&#196;êy&#190;Y&#196;£ê&#189;:SPIéè&#214;&#195;&#206;a&#203;&#171;&#207;&#223;&#203;&#171;&#207;òè&#171;&#203;&#171;1¤
        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                //éè&#214;&#195;SPI1¤×÷&#196;£ê&#189;:éè&#214;&#195;&#206;a&#214;÷SPI
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                //éè&#214;&#195;SPIμ&#196;êy&#190;Y′óD&#161;:SPI·¢&#203;í&#189;óê&#213;8&#206;&#187;&#214;&#161;&#189;á11
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low ;                //′&#174;DDí&#172;2&#189;ê±&#214;óμ&#196;&#191;&#213;&#207;D×′ì&#172;&#206;a&#184;&#223;μ&#231;&#198;&#189;
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;        //′&#174;DDí&#172;2&#189;ê±&#214;óμ&#196;μú&#182;t&#184;&#246;ì&#248;±&#228;&#209;&#216;£¨é&#207;éy&#187;ò&#207;&#194;&#189;μ£&#169;êy&#190;Y±&#187;2é&#209;ù
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                //NSSD&#197;o&#197;óéó2&#188;t£¨NSS1ü&#189;&#197;£&#169;&#187;1ê&#199;èí&#188;t£¨ê1ó&#195;SSI&#206;&#187;£&#169;1üàí:&#196;ú2&#191;NSSD&#197;o&#197;óDSSI&#206;&#187;&#191;&#216;&#214;&#198;
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;                //&#182;¨ò&#229;2¨ì&#216;&#194;ê&#212;¤·&#214;&#198;μμ&#196;&#214;μ:2¨ì&#216;&#194;ê&#212;¤·&#214;&#198;μ&#214;μ&#206;a256
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;        //&#214;&#184;&#182;¨êy&#190;Y′&#171;ê&#228;′óMSB&#206;&#187;&#187;1ê&#199;LSB&#206;&#187;&#191;aê&#188;:êy&#190;Y′&#171;ê&#228;′óMSB&#206;&#187;&#191;aê&#188;
        SPI_InitStructure.SPI_CRCPolynomial = 7;        //CRC&#214;μ&#188;&#198;&#203;&#227;μ&#196;&#182;à&#207;&#238;ê&#189;
        SPI_Init(RGBLED_SPI, &SPI_InitStructure);  //&#184;ù&#190;YSPI_InitStruct&#214;D&#214;&#184;&#182;¨μ&#196;2&#206;êy3&#245;ê&#188;&#187;ˉíaéèSPIx&#188;&#196;′&#230;&#198;÷

        SPI_Cmd(RGBLED_SPI,ENABLE);
       

}

ws2812b.h

#ifndef __WS2812B_H
#define __WS2812B_H

#include "stm32f4xx.h"


//typedef struct
//{
//        uint8_t Color_RED_Value;
//        uint8_t Color_GREEN_Value;
//        uint8_t Color_BLUE_Value;


//}RGB_SetColorTypedef;


void RGBLED_SPI_Config(void);
void RGB_Config(void);
void RGB_SetColor(uint8_t RGB_R,uint8_t RGB_G,uint8_t RGB_B);



#endif






rcc.c

#include "rcc.h"
#include "stm32f4xx_rcc.h"


void RCC_Config(void)
{
        ErrorStatus HSEStartUpStatus;
        RCC_DeInit();
        RCC_HSEConfig(RCC_HSE_ON);
        HSEStartUpStatus = RCC_WaitForHSEStartUp();
        if(HSEStartUpStatus == SUCCESS)
        {
                RCC_HCLKConfig(RCC_SYSCLK_Div1);
                RCC_PCLK2Config(RCC_HCLK_Div1);
                RCC_PCLK1Config(RCC_SYSCLK_Div2);
                RCC_PLLConfig(RCC_PLLSource_HSE,4,50,2,4);
                RCC_PLLCmd(ENABLE);
                while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
                {
                }
                RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
                while(RCC_GetSYSCLKSource() != 0x80)
                {
                }
       
        }


}



main.c



//#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "rcc.h"
#include "spi.h"
#include "WS2812B.h"

       
int main(void)
{
                  
       
               
                        RGB_Config();

       
       
                //        RCC_GetClockFreq(RCC_ClocksStruct);
                        while(1)
                        {
                               
                                RGB_SetColor(255,0,0);
                                RGB_SetColor(255,0,0);
                                RGB_SetColor(255,0,0);
                                RGB_SetColor(255,0,0);  
                               
                               
                                delay_ms(200);
                                RGB_SetColor(255,0,0);
                                RGB_SetColor(255,0,0);
                                RGB_SetColor(0,255,0);
                                RGB_SetColor(0,255,0);

                               
                                delay_ms(200);
                                RGB_SetColor(255,0,0);
                                RGB_SetColor(255,0,0);
                                RGB_SetColor(0,0,255);
                                RGB_SetColor(0,0,255);
                       
                        }
       
       
       
       
       
}





友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
时未央
1楼-- · 2019-07-20 08:37
xuexinkun 发表于 2017-9-9 17:52
比较惭愧没有示波器!也没有J-LINK都不知道程序能够走到哪一步

那你就用串口打印呗····
xuexinkun
2楼-- · 2019-07-20 10:54
 精彩回答 2  元偷偷看……
时未央
3楼-- · 2019-07-20 11:51
你用示波器看看你时序要求满足没有
xuexinkun
4楼-- · 2019-07-20 14:23
 精彩回答 2  元偷偷看……
czw555
5楼-- · 2019-07-20 17:34
 精彩回答 2  元偷偷看……

一周热门 更多>