[CW32F030系列]

关于SPI+DMA的问题

[复制链接]
796|6
手机看帖
扫描二维码
随时随地手机跟帖
丿沙漏丨|  楼主 | 2023-12-25 22:45 | 显示全部楼层 |阅读模式
1、SPI配置为只发送,SCK = 8MHZ,  User_initli里面正常发送数据,但在 WS2812_senddata(uint8 * sendbuff)中无法发送
2、逻辑分析仪 抓取   ,采样时钟 16MHz   ,    时钟概率会出现一次错误

请大佬看一下啥问题?
1703515471808.jpg
1703513828012.jpg
1703513299836.jpg
1703513170421.jpg

使用特权

评论回复
丿沙漏丨|  楼主 | 2023-12-25 23:14 | 显示全部楼层
这是main函数中的
1703517245517.jpg

使用特权

评论回复
pssyx| | 2023-12-26 11:58 | 显示全部楼层
本帖最后由 pssyx 于 2023-12-26 15:47 编辑

执行USER_Spi_init();之后,DMA就完成了此次传输。
DAM传输完成后,必须重新设置部分修改过的参数,比如:cnt值等,简单处理可以直接再调用一次DMA初始化代码。如下代码,请参考!
int32_t main(void)
{
    //...
    while(1)
    {
        //...
        WS2812_senddata(TxBuffer1);
        SysTickDelay(30);
    }        
}

void WS2812_senddata(uint8_t *sendbuff)
{
    for(uint8_t i = 0; i < 24; i++)
    {
        TxBuffer1 = sendbuff;
    }
    SPI_DMACmd(SPIy, SPI_DMAReq_Tx, DISABLE);
    SPI_FlushSendBuff(SPIy);
    SPI_DMACmd(SPIy, SPI_DMAReq_Tx, ENABLE);   
    //...
    DMA_Cmd(CW_DMACHANNEL1, DISABLE);  //不能DMA
    CW_DMACHANNEL1->CNT      = 0x10000 | 0x18; //重置CNT计数:24 Bytes
    //CW_DMACHANNEL1->DSTADDR  = (uint32_t)( &SPIy->DR ); //重置目的地址
    CW_DMACHANNEL1->SRCADDR  = (uint32_t)( TxBuffer1 ); //重置源地址
    DMA_Cmd(CW_DMACHANNEL1, ENABLE);  //使能DMA
   
    while(DMA_GetFlagStatus(CW_DMACHANNEL1)!= DMA_CHANNEL_STATUS_TRANSCOMPLETE);

    DMA_ClearITPendingBit(DMA_IT_TC1);
    //while(DMA_GetFlagStatus(CW_DMACHANNEL1)!= DMA_CHANNEL_STATUS_STOPREQ);
}


使用特权

评论回复
评论
丿沙漏丨 2023-12-26 13:26 回复TA
感谢技术支持,关于滴二个问题,1、逻辑分析仪采样的时钟信号虽然出现异常但DATA的数据按照8MHz算却是对的, 所以猜测会不会是IO输出时钟波形电压异常导致逻辑分析仪抓取时钟信号错误;而IC内部时钟源是没有问题的。2、或 输出时钟的IO与其他功能复用导致? 
中国龙芯CDX| | 2024-1-9 15:25 | 显示全部楼层
时钟概率会出现一次错误?这个如果是规律性的就应该容易排查

使用特权

评论回复
jf101| | 2024-2-25 18:00 | 显示全部楼层

DAM传输完成后,必须重新设置部分修改过的参数,比如:cnt值等,简单处理可以直接再调用一次DMA初始化代码。

使用特权

评论回复
执行USER_Spi_init();DMA就完成了此次传输

使用特权

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

本版积分规则

15

主题

90

帖子

2

粉丝