你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【求助】SPI+DMA数据提前一个时钟周期发送

[复制链接]
1453111536 提问时间:2017-2-10 17:17 /

逻辑分析仪

逻辑分析仪


频率在256分频到64分频就出现这种情况,MISO第一位数据在上一时钟周期就发送出去,
32分频到2分频,没有这种情况出现,
是哪里出问题?
收藏 1 评论8 发布时间:2017-2-10 17:17

举报

8个回答
埃斯提爱慕 回答时间:2017-2-11 18:22:38
提示: 作者被禁止或删除 内容自动屏蔽
donatello1996 回答时间:2017-2-12 14:58:11
厉害了我的哥,还用上逻辑分析仪了
1453111536 回答时间:2017-2-13 11:45:04
顶一下,没有没人遇到类似的情况,
或者有什么可能,提下意见吧
xmshao 回答时间:2017-2-14 10:18:06
具体哪个STM32系列的芯片? 工作在什么模式?
查查相关芯片系列的勘误手册,看有无相关描述。
1453111536 回答时间:2017-2-14 11:32:24
xmshao 发表于 2017-2-14 10:18
具体哪个STM32系列的芯片? 工作在什么模式?
查查相关芯片系列的勘误手册,看有无相关描述。 ...

f407ve
看过勘误手册没有相关的
而且这种情况只在低频率出现
xmshao 回答时间:2017-2-16 14:34:05
1453111536 发表于 2017-2-14 11:32
f407ve
看过勘误手册没有相关的
而且这种情况只在低频率出现

哦 它工作在什么哪个模式?主模式?从模式? 什么样的配置?
1453111536 回答时间:2017-2-17 09:56:14
xmshao 发表于 2017-2-16 14:34
哦 它工作在什么哪个模式?主模式?从模式? 什么样的配置?

从模式

  1. <blockquote>void DMA2_Stream0_IRQHandler(void)
复制代码


1453111536 回答时间:2017-2-17 10:07:35

void DMA2_Stream0_IRQHandler(void)
{       
        if(DMA_GetITStatus(DMA2_Stream0,DMA_IT_TCIF0)==SET)
        {
                DMA_Cmd(DMA2_Stream0,DISABLE);
                DMA_ClearITPendingBit(DMA2_Stream0,DMA_IT_TCIF0);       
                DMA_Cmd(DMA2_Stream5, ENABLE);
        }
}
void DMA2_Stream5_IRQHandler(void)
{       
        if(DMA_GetITStatus(DMA2_Stream5,DMA_IT_TCIF5)==SET)
        {
                DMA_Cmd(DMA2_Stream5,DISABLE);
                DMA_ClearITPendingBit(DMA2_Stream5,DMA_IT_TCIF5);
        }
}

void EXTI15_10_IRQHandler(void )
{
        if(EXTI_GetITStatus(EXTI_Line15) != RESET)
        {
                if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15) == Bit_RESET)
                {       
                        DMA_Cmd(DMA2_Stream0, ENABLE);
                }
                if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15) == Bit_SET)
                {
                        DMA_Cmd(DMA2_Stream5, DISABLE);       
                        DMA_Cmd(DMA2_Stream0, DISABLE);
                }
                EXTI_ClearITPendingBit(EXTI_Line15);
        }
       
}


void SPISCfgPort(void)
{
  GPIO_InitTypeDef    GPIO_InitStructure;
  SPI_InitTypeDef                  SPI_InitStructure;
        NVIC_InitTypeDef    NVIC_InitStructure;
        DMA_InitTypeDef     DMA_InitStructure;
        EXTI_InitTypeDef   EXTI_InitStructure;
       
  RCC_AHB1PeriphClockCmd (RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOA, ENABLE);

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1 |RCC_APB2Periph_SYSCFG, ENABLE);
       
        RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_DMA2 , ENABLE);
        //复用
        GPIO_PinAFConfig(GPIOB,GPIO_PinSource3,GPIO_AF_SPI1);
        GPIO_PinAFConfig(GPIOB,GPIO_PinSource4,GPIO_AF_SPI1);
        GPIO_PinAFConfig(GPIOB,GPIO_PinSource5,GPIO_AF_SPI1);
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource15,GPIO_AF_SPI1);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;  

  GPIO_Init(GPIOB, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  GPIO_Init(GPIOB, &GPIO_InitStructure);  

       
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
               
//EXIT
        SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, GPIO_PinSource15);
        EXTI_ClearITPendingBit(EXTI_Line15);
        EXTI_InitStructure.EXTI_Line = EXTI_Line15;      
        EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;   
        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;   
        EXTI_InitStructure.EXTI_LineCmd = ENABLE;     
        EXTI_Init(&EXTI_InitStructure);

//NVIC
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);     
        NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream0_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
       
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);     
        NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream5_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
       
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);        
        NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;      
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;   
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   
        NVIC_Init(&NVIC_InitStructure);

//DMA
        DMA_DeInit(DMA2_Stream0);
       DMA_DeInit(DMA2_Stream5);
        DMA_InitStructure.DMA_Channel  = DMA_Channel_3;
        DMA_InitStructure.DMA_BufferSize = MAX_BUFF_LEN;
        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
        DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;       
        DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull ;
        DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single ;
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
        DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&(SPI1->DR));
        DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
        DMA_InitStructure.DMA_Priority = DMA_Priority_High;
       
        /* Configure TX DMA */
        DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;  
        DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)Buff.BuffTx;                        
        DMA_Init(DMA2_Stream5, &DMA_InitStructure);
        DMA_ITConfig(DMA2_Stream5,DMA_IT_TC,ENABLE);
       
        /* Configure RX DMA */
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory ;
        DMA_InitStructure.DMA_Memory0BaseAddr =(uint32_t)Buff.BuffRx;
        DMA_Init(DMA2_Stream0,&DMA_InitStructure);
        DMA_ITConfig(DMA2_Stream0,DMA_IT_TC,ENABLE);

        //SPI1设置
       SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
       SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
       SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
       SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
       SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
       SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
       SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
      SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
      SPI_InitStructure.SPI_CRCPolynomial = 7;
      SPI_Init(SPI1, &SPI_InitStructure);
        SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Tx, ENABLE);
        SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Rx, ENABLE);
        SPI_Cmd(SPI1, ENABLE);
        DMA_Cmd(DMA2_Stream5, DISABLE);
        DMA_Cmd(DMA2_Stream0, DISABLE);

}

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版