watercici 发表于 2018-6-14 14:34:52

TLLED 发表于 2018-6-14 14:10
可以单独写一个SPI通信程序,单独测试,其他端口不用,查找程序上那儿配置不对。 ...

嗯呢,好的,谢谢。

butterflyspring 发表于 2018-6-14 16:01:03

如果是被其他中断打乱了,可以用DMA 模式,看不到代码都不知你用的是什么模式了

feixiang20 发表于 2018-6-15 00:52:49

要么,多参考点资料【STM32F103的SPI通信时钟SCLK的一些现象和疑问】【STM32L431之SPI时钟过高导致无法通信】【用SPI模块进行通讯时的时钟速度设置】【SPI及其时钟配置】

he129807 发表于 2018-6-18 08:53:00

你是使用的硬件SPI吗?硬件SPI一般不会受到其他代码的影响。
你看看是不是外部信号影响。有没有可能是硬件干扰问题。
你要排除软件问题也简单,就找一个SPI的例程,别的啥也不跑,再测测波形。

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时序开始异常,时钟紊乱。
我知道大家不好定位,但是我希望大家给我看看,出现这种情况可能是什么原因造成的,我好有思路,自己在程序中定位。
谢谢!

toofree 发表于 2018-6-21 09:21:29

有没有使用操作系统?用的硬件SPI还是软件IO模拟SPI?如果是硬件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);       
}

wenyangzeng 发表于 2018-6-21 09:53:45

watercici 发表于 2018-6-20 13:57
统一回复,该问题没有解决!谢谢大家的意见,为了更好的解决问题,我在说的详细一些:
1:我的SPI是OLED和W ...

SPI共用和OLED和W25Q16时,OLED和W25Q16应该有不同的片选信号,才不会出现冲突。楼主硬件和软件是否实现了?

watercici 发表于 2018-6-21 10:15:09

wenyangzeng 发表于 2018-6-21 09:53
SPI共用和OLED和W25Q16时,OLED和W25Q16应该有不同的片选信号,才不会出现冲突。楼主硬件和软件是否实现 ...

是不同的片选信号,OLED接在了SPI的NSS引脚(软件模式),W25Q16接在了普通IO上

す疯Ⅱ恒す 发表于 2018-6-21 10:21:57

我看你的CS线一直是低电平,即一直选中的状态。我估计是两个CS都选中了导致冲突了。
我建议你:1,先把其中一个CS拉高,单独去测试一个器件,然后调换过来再测试。2.如果上面都可以通过,那么把两个器件一起控制的时候一定要分开不同时间驱动,保证同时只有一个CS拉低。保证操作完一个器件之后把该CS拉高。
页: 1 [2] 3 4
查看完整版本: SPI通信出现时钟紊乱