TLLED 发表于 2018-6-14 14:10
可以单独写一个SPI通信程序,单独测试,其他端口不用,查找程序上那儿配置不对。 ...
嗯呢,好的,谢谢。
如果是被其他中断打乱了,可以用DMA 模式,看不到代码都不知你用的是什么模式了
要么,多参考点资料【STM32F103的SPI通信时钟SCLK的一些现象和疑问】【STM32L431之SPI时钟过高导致无法通信】【用SPI模块进行通讯时的时钟速度设置】【SPI及其时钟配置】
你是使用的硬件SPI吗?硬件SPI一般不会受到其他代码的影响。
你看看是不是外部信号影响。有没有可能是硬件干扰问题。
你要排除软件问题也简单,就找一个SPI的例程,别的啥也不跑,再测测波形。
本帖最后由 watercici 于 2018-6-20 14:00 编辑
统一回复,该问题没有解决!谢谢大家的意见,为了更好的解决问题,我在说的详细一些:
1:我的SPI是OLED和W25Q16共用一个SPI;
2:单独调试的时候SPI通信成功;但是放在程序里面会出问题;
3:目前初始化的时候会有OLED显示和FLASH是否是首次使用的判断,此时二者的时序是正常的
4:但是进入主循环,先进行AD采集,数据处理判断,然后OLED显示,将测试数据写入FLASH,此时二者的SPI时序开始异常,时钟紊乱。
我知道大家不好定位,但是我希望大家给我看看,出现这种情况可能是什么原因造成的,我好有思路,自己在程序中定位。
谢谢!
有没有使用操作系统?用的硬件SPI还是软件IO模拟SPI?如果是硬件SPI,那么用的什么型号的芯片?
从图片看,可能是软件模拟SPI吧?如果是软件模拟SPI,并且没有使用操作系统,那么有可能是某些中断造成的。
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
统一回复,该问题没有解决!谢谢大家的意见,为了更好的解决问题,我在说的详细一些:
1:我的SPI是OLED和W ...
SPI共用和OLED和W25Q16时,OLED和W25Q16应该有不同的片选信号,才不会出现冲突。楼主硬件和软件是否实现了?
wenyangzeng 发表于 2018-6-21 09:53
SPI共用和OLED和W25Q16时,OLED和W25Q16应该有不同的片选信号,才不会出现冲突。楼主硬件和软件是否实现 ...
是不同的片选信号,OLED接在了SPI的NSS引脚(软件模式),W25Q16接在了普通IO上
我看你的CS线一直是低电平,即一直选中的状态。我估计是两个CS都选中了导致冲突了。
我建议你:1,先把其中一个CS拉高,单独去测试一个器件,然后调换过来再测试。2.如果上面都可以通过,那么把两个器件一起控制的时候一定要分开不同时间驱动,保证同时只有一个CS拉低。保证操作完一个器件之后把该CS拉高。