[技术问答]

WS2812 有人用过H32F460驱动成功吗?

[复制链接]
762|9
手机看帖
扫描二维码
随时随地手机跟帖
sapoiuyt|  楼主 | 2022-1-12 01:07 | 显示全部楼层 |阅读模式
        /* Enable DMA channel */
        DMA_ChannelCmd(SPI_DMA_UNIT, SPI_DMA_TX_CHANNEL, Enable);
        /* Enable SPI to start DMA */
        SPI_Cmd(SPI_UNIT, Enable);
        while (Reset == DMA_GetIrqFlag(SPI_DMA_UNIT, SPI_DMA_TX_CHANNEL, TrnCpltIrq))
        {
        }
        DMA_ClearIrqFlag(SPI_DMA_UNIT, SPI_DMA_TX_CHANNEL, TrnCpltIrq);
        /* Disable SPI */
        SPI_Cmd(SPI_UNIT, Disable);

执行了一次之后卡死在 while (Reset == DMA_GetIrqFlag(SPI_DMA_UNIT, SPI_DMA_TX_CHANNEL, TrnCpltIrq))

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

配置方法是

#define SPI_UNIT                                                   (M4_SPI1)
#define SPI_UNIT_CLOCK                                        (PWC_FCG1_PERIPH_SPI1)
#define SPI_MOSI_PORT                (PortC)
#define SPI_MOSI_PIN                        (Pin10)
#define SPI_MOSI_FUNC   (Func_Spi1_Mosi)

       
#define SPI_DMA_UNIT                                                        (M4_DMA1)
#define SPI_DMA_CLOCK_UNIT                                                                         (PWC_FCG0_PERIPH_DMA1)
#define SPI_DMA_TX_CHANNEL                                   (DmaCh0)
#define SPI_DMA_TX_TRIG_SOURCE          (EVT_SPI1_SPTI)     

static void Spi_DmaConfig(void)
{
    stc_dma_config_t stcDmaCfg;
                stc_irq_regi_conf_t stcIrqRegiCfg;
       
    /* configuration structure initialization */
    MEM_ZERO_STRUCT(stcDmaCfg);

    /* Configuration peripheral clock */
    PWC_Fcg0PeriphClockCmd(SPI_DMA_CLOCK_UNIT, Enable);
    PWC_Fcg0PeriphClockCmd(PWC_FCG0_PERIPH_AOS, Enable);

    /* Configure TX DMA */
    stcDmaCfg.u16BlockSize = 1u;
    stcDmaCfg.u16TransferCnt = PIXEL_NUM * 24;
    stcDmaCfg.u32SrcAddr = (uint32_t)(pixelBuffer);
    stcDmaCfg.u32DesAddr = (uint32_t)(&SPI_UNIT->DR);
    stcDmaCfg.stcDmaChCfg.enSrcInc = AddressIncrease;
    stcDmaCfg.stcDmaChCfg.enDesInc = AddressFix;
    stcDmaCfg.stcDmaChCfg.enTrnWidth = Dma8Bit;
    stcDmaCfg.stcDmaChCfg.enIntEn = Disable;
    DMA_InitChannel(SPI_DMA_UNIT, SPI_DMA_TX_CHANNEL, &stcDmaCfg);


    DMA_SetTriggerSrc(SPI_DMA_UNIT, SPI_DMA_TX_CHANNEL, SPI_DMA_TX_TRIG_SOURCE);


                 /* Enable DMA. */
    DMA_Cmd(SPI_DMA_UNIT, Enable);
}

void WS2812C_Init(void)
{
        stc_spi_init_t stcSpiInit;

        /* configuration structure initialization */
        MEM_ZERO_STRUCT(stcSpiInit);

        /* Configuration peripheral clock */
        PWC_Fcg1PeriphClockCmd(SPI_UNIT_CLOCK, Enable);

        /* Configuration SPI pin */
        PORT_SetFunc(SPI_MOSI_PORT, SPI_MOSI_PIN, SPI_MOSI_FUNC, Disable);

        /* Configuration SPI structure */
        stcSpiInit.enClkDiv = SpiClkDiv32;
        stcSpiInit.enFrameNumber = SpiFrameNumber1;
        stcSpiInit.enDataLength = SpiDataLengthBit8;       
        stcSpiInit.enFirstBitPosition = SpiFirstBitPositionMSB;
        stcSpiInit.enSckPolarity = SpiSckIdleLevelLow;
        stcSpiInit.enSckPhase = SpiSckOddChangeEvenSample;
        stcSpiInit.enReadBufferObject = SpiReadReceiverBuffer;
        stcSpiInit.enWorkMode = SpiWorkMode3Line;
        stcSpiInit.enTransMode = SpiTransFullDuplex;
        stcSpiInit.enCommAutoSuspendEn = Disable;
        stcSpiInit.enModeFaultErrorDetectEn = Disable;
        stcSpiInit.enParitySelfDetectEn = Disable;
        stcSpiInit.enParityEn = Disable;
        stcSpiInit.enParity = SpiParityEven;

        stcSpiInit.enMasterSlaveMode = SpiModeMaster;
        stcSpiInit.stcDelayConfig.enSsSetupDelayOption = SpiSsSetupDelayCustomValue;
        stcSpiInit.stcDelayConfig.enSsSetupDelayTime = SpiSsSetupDelaySck1;
        stcSpiInit.stcDelayConfig.enSsHoldDelayOption = SpiSsHoldDelayCustomValue;
        stcSpiInit.stcDelayConfig.enSsHoldDelayTime = SpiSsHoldDelaySck1;
        stcSpiInit.stcDelayConfig.enSsIntervalTimeOption = SpiSsIntervalCustomValue;
        stcSpiInit.stcDelayConfig.enSsIntervalTime = SpiSsIntervalSck6PlusPck2;
       
        SPI_Init(SPI_UNIT, &stcSpiInit);

        Spi_DmaConfig();
}


使用特权

评论回复
七毛钱| | 2022-1-19 09:45 | 显示全部楼层
表示没接触过

使用特权

评论回复
luohao316| | 2022-1-21 11:23 | 显示全部楼层
用 gpio 吧。延时调一下就好。没必要用SPI,搞得复杂了。

使用特权

评论回复
磨砂| | 2022-2-5 09:39 | 显示全部楼层
使用的是spi通讯方式吗

使用特权

评论回复
晓伍| | 2022-2-5 09:52 | 显示全部楼层
能正常初始化吗

使用特权

评论回复
八层楼| | 2022-2-5 15:47 | 显示全部楼层
跟使用其他芯片驱动有什么不一样吗

使用特权

评论回复
tpgf| | 2022-2-5 15:51 | 显示全部楼层
我总是闹不清这些驱动指的是什么

使用特权

评论回复
观海| | 2022-2-5 15:57 | 显示全部楼层
可以使用普通io口模拟

使用特权

评论回复
guanjiaer| | 2022-2-5 16:06 | 显示全部楼层
楼主具体是哪里遇到问题了呢

使用特权

评论回复
一刀一级| | 2022-2-11 10:22 | 显示全部楼层
初始化可以正常运行不

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

2

帖子

0

粉丝