watercici 发表于 2018-6-14 10:30:39

SPI通信出现时钟紊乱

前几天我发了一篇帖子说的也是SPI通信的问题https://www.stmcu.org.cn/module/forum/thread-616184-1-1.html

,结贴的方式是SPI初始配置的问题。但是今天又出现了同样的问题,说明还有别的地方影响SPI通信。反正现在SPI通信时钟紊乱,不知道是什么问题,上传图片,大家帮忙看看。提供点思路。

watercici 发表于 2018-6-21 09:44:59

toofree 发表于 2018-6-21 09:21
有没有使用操作系统?用的硬件SPI还是软件IO模拟SPI?如果是硬件SPI,那么用的什么型号的芯片?

从图片看 ...

我用的是软件NSS,不带系统,我昨天给错误的地方定位了一下,发现是在我AD采集的过程中会有一个PWM波输出端的切换,我没有切换只是进行了初始化,(因为原来的函数PWM的初始化和切换打开是在一个函数里面,现在我把初始化和PWM切换输出放在了两个函数里面)。现在我把初始化函数去掉改成打开切换PWM波的输出就没有事情了。但是我仍然不知道为什么?
还有您说的中断造成的是什么意思,能详细的说一下吗?
下面是我的PWM波的初始化和打开函数。

void init_timer(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
        TIM_OCInitTypeDefTIM_OCInitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 | RCC_APB2Periph_GPIOA, ENABLE);       
       
        /* GPIOA Configuration:TIM9 Channel1 and 2 as alternate function push-pull */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_11;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//¸´Óù¦ÄÜÍÆÍìÊä³ö
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
       
        GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        /* NVIC Configuration */          
                 


        TIM_DeInit(TIM1);
       
        /* Time base configuration */
//        TIM_TimeBaseStructure.TIM_Period = 49;
        TIM_TimeBaseStructure.TIM_Period = 50;
        TIM_TimeBaseStructure.TIM_Prescaler = 5;
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;                       
        TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
        TIM_OCInitStructure.TIM_Pulse = 25;       
       
        TIM_OC1Init(TIM1, &TIM_OCInitStructure);
        TIM_OC4Init(TIM1, &TIM_OCInitStructure);
}
//SENSOR_A10-PA11-TIM1_CH4SENSOR_A11-PA8-TIM1_CH1
void init_emit_electrode()
{
        if(pwm_output == PWM_OUTPUT_A10)
        {
                pwm_output = PWM_OUTPUT_A11;               
        //TIM_OC1Init(TIM1, &TIM_OCInitStructure);               
                TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);               
        }
        else
        {
                pwm_output = PWM_OUTPUT_A10;
                //TIM_OC4Init(TIM1, &TIM_OCInitStructure);               
                TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);
        }
       
        TIM_ARRPreloadConfig(TIM1, ENABLE);
       
        /* TIM enable counter */
        TIM_Cmd(TIM1, ENABLE);
        TIM_CtrlPWMOutputs(TIM1, ENABLE);                 
        /* TIM IT enable */
        ////TIM_ITConfig(TIM1, TIM_IT_CC1 | TIM_IT_CC2, ENABLE);       
}

watercici 发表于 2018-6-20 13:57:10

本帖最后由 watercici 于 2018-6-20 14:00 编辑

统一回复,该问题没有解决!谢谢大家的意见,为了更好的解决问题,我在说的详细一些:
1:我的SPI是OLED和W25Q16共用一个SPI;
2:单独调试的时候SPI通信成功;但是放在程序里面会出问题;
3:目前初始化的时候会有OLED显示和FLASH是否是首次使用的判断,此时二者的时序是正常的
4:但是进入主循环,先进行AD采集,数据处理判断,然后OLED显示,将测试数据写入FLASH,此时二者的SPI时序开始异常,时钟紊乱。
我知道大家不好定位,但是我希望大家给我看看,出现这种情况可能是什么原因造成的,我好有思路,自己在程序中定位。
谢谢!

butterflyspring 发表于 2018-6-14 10:39:44

把调用函数发一下?我不知道你之前的贴叫什么..

watercici 发表于 2018-6-14 10:47:35

butterflyspring 发表于 2018-6-14 10:39
把调用函数发一下?我不知道你之前的贴叫什么..

调用函数您指的是哪些,是SPI的基本函数和初始化配置函数吗?
我的这个问题就是随机出现的,SPI通信有正常的时候。
就是不知道是什么其他的地方影响了SPI,一开始以为是中断,可是在发送数据前把中断关掉也不行。

zero99 发表于 2018-6-14 10:48:08

butterflyspring 发表于 2018-6-14 10:39
把调用函数发一下?我不知道你之前的贴叫什么..

楼主,你说的是这个吗

SPI通信中奇怪的问题,在线等,谢谢!
https://www.stmcu.org.cn/module/forum/thread-616184-1-1.html

toofree 发表于 2018-6-14 10:53:34

楼主,你想说明什么?
没有工程代码,怎么知道你什么问题,我从没出过这问题。
以前只在IO模拟SPI时出过问题,那时因为在两个IO操作之间没有加延时,STM32又是流水操作,导致了看似指令是顺序的,执行起来就不见得谁先谁后了。

watercici 发表于 2018-6-14 10:57:32

zero99 发表于 2018-6-14 10:48
楼主,你说的是这个吗

SPI通信中奇怪的问题,在线等,谢谢!


是的。您遇到过吗?

watercici 发表于 2018-6-14 11:00:46

toofree 发表于 2018-6-14 10:53
楼主,你想说明什么?
没有工程代码,怎么知道你什么问题,我从没出过这问题。
以前只在IO模拟SPI时出过问 ...

主要是整个工程代码是公司的不方便贴,局部SPI的代码,我查看了好几遍,我觉得从基本配置到读写传输都没有问题,而且他有通信成功的时候。。所以我就是想知道,出现时钟紊乱,可能是哪些机制造成的,我认为应该不是SPI代码的问题,可能是程序中的其他地方影响,需要大家给个思路,我自己查看。

toofree 发表于 2018-6-14 11:05:28

本帖最后由 toofree 于 2018-6-14 11:07 编辑

watercici 发表于 2018-6-14 11:00
主要是整个工程代码是公司的不方便贴,局部SPI的代码,我查看了好几遍,我觉得从基本配置到读写传输都没 ...
只能告诉你,硬件SPI在一个传送周期内,是不会被打断的。除非出错。既然你都认为SPI代码没问题了,而是其它代码出的问题。没有代码的情况下,如何分析。

watercici 发表于 2018-6-14 11:21:18

toofree 发表于 2018-6-14 11:05
只能告诉你,硬件SPI在一个传送周期内,是不会被打断的。除非出错。既然你都认为SPI代码没问题了,而是其 ...

好吧,还是谢谢您。

TLLED 发表于 2018-6-14 14:10:56

可以单独写一个SPI通信程序,单独测试,其他端口不用,查找程序上那儿配置不对。
页: [1] 2 3 4
查看完整版本: SPI通信出现时钟紊乱