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

SPI通信出现时钟紊乱  

[复制链接]
watercici 提问时间:2018-6-14 10:30 /
阅读主题, 点击返回1楼
收藏 2 评论39 发布时间:2018-6-14 10:30
39个回答
watercici 回答时间:2018-6-14 14:34:52
TLLED 发表于 2018-6-14 14:10
可以单独写一个SPI通信程序,单独测试,其他端口不用,查找程序上那儿配置不对。 ...

嗯呢,好的,谢谢。
butterflyspring 回答时间:2018-6-14 16:01:03
如果是被其他中断打乱了,可以用DMA 模式,看不到代码都不知你用的是什么模式了

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

feixiang20 回答时间:2018-6-15 00:52:49
要么,多参考点资料【STM32F103的SPI通信时钟SCLK的一些现象和疑问】【STM32L431之SPI时钟过高导致无法通信】【用SPI模块进行通讯时的时钟速度设置】【SPI及其时钟配置】
he129807 回答时间:2018-6-18 08:53:00
你是使用的硬件SPI吗?硬件SPI一般不会受到其他代码的影响。
你看看是不是外部信号影响。有没有可能是硬件干扰问题。
你要排除软件问题也简单,就找一个SPI的例程,别的啥也不跑,再测测波形。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

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,并且没有使用操作系统,那么有可能是某些中断造成的。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

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

从图片看 ...

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

  1. void init_timer(void)
  2. {  
  3.         GPIO_InitTypeDef GPIO_InitStructure;
  4.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  5.         TIM_OCInitTypeDef  TIM_OCInitStructure;
  6.        
  7.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 | RCC_APB2Periph_GPIOA, ENABLE);       
  8.        
  9.         /* GPIOA Configuration:TIM9 Channel1 and 2 as alternate function push-pull */
  10.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_11;
  11.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//¸´Óù¦ÄÜÍÆÍìÊä³ö
  12.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  13.        
  14.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  15.        
  16.         /* NVIC Configuration */          
  17.                  


  18.         TIM_DeInit(TIM1);
  19.        
  20.         /* Time base configuration */
  21. //        TIM_TimeBaseStructure.TIM_Period = 49;
  22.         TIM_TimeBaseStructure.TIM_Period = 50;
  23.         TIM_TimeBaseStructure.TIM_Prescaler = 5;
  24.         TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  25.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;                       
  26.         TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

  27.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  28.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  29.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  30.         TIM_OCInitStructure.TIM_Pulse = 25;       
  31.        
  32.         TIM_OC1Init(TIM1, &TIM_OCInitStructure);
  33.         TIM_OC4Init(TIM1, &TIM_OCInitStructure);
  34. }
  35. //SENSOR_A10-PA11-TIM1_CH4  SENSOR_A11-PA8-TIM1_CH1
  36. void init_emit_electrode()
  37. {
  38.         if(pwm_output == PWM_OUTPUT_A10)
  39.         {
  40.                 pwm_output = PWM_OUTPUT_A11;               
  41.         //TIM_OC1Init(TIM1, &TIM_OCInitStructure);                 
  42.                 TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);               
  43.         }
  44.         else
  45.         {
  46.                 pwm_output = PWM_OUTPUT_A10;
  47.                 //TIM_OC4Init(TIM1, &TIM_OCInitStructure);                 
  48.                 TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);
  49.         }
  50.        
  51.         TIM_ARRPreloadConfig(TIM1, ENABLE);
  52.        
  53.         /* TIM enable counter */
  54.         TIM_Cmd(TIM1, ENABLE);
  55.         TIM_CtrlPWMOutputs(TIM1, ENABLE);                 
  56.         /* TIM IT enable */
  57.         ////TIM_ITConfig(TIM1, TIM_IT_CC1 | TIM_IT_CC2, ENABLE);       
  58. }
复制代码
wenyangzeng 回答时间:2018-6-21 09:53:45
watercici 发表于 2018-6-20 13:57
统一回复,该问题没有解决!谢谢大家的意见,为了更好的解决问题,我在说的详细一些:
1:我的SPI是OLED和W ...

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

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

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蝴蝶豆 +4 收起 理由
zero99 + 4

查看全部评分

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版