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

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

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

逻辑分析仪

逻辑分析仪


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

举报

8个回答
dsjsjf 回答时间: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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版