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

SPI通信出现时钟紊乱  

[复制链接]
watercici 提问时间:2018-6-14 10:30 /
阅读主题, 点击返回1楼
收藏 2 评论39 发布时间:2018-6-14 10:30
39个回答
七哥 回答时间: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上
疯de_恒 回答时间:2018-6-21 10:21:57
我看你的CS线一直是低电平,即一直选中的状态。我估计是两个CS都选中了导致冲突了。
我建议你:1,先把其中一个CS拉高,单独去测试一个器件,然后调换过来再测试。2.如果上面都可以通过,那么把两个器件一起控制的时候一定要分开不同时间驱动,保证同时只有一个CS拉低。保证操作完一个器件之后把该CS拉高。

评分

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

查看全部评分

x5y4z3 回答时间:2018-6-21 11:29:50
楼主的程序是否架构于 uC/OS 或啥 OS 之上?!
若是的话,要请留意关于任务等待号志  Semaphore 的使用,不然同一个 SPI 就被两个任务给占用了!

评分

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

查看全部评分

watercici 回答时间:2018-6-21 11:36:15
x5y4z3 发表于 2018-6-21 11:29
楼主的程序是否架构于 uC/OS 或啥 OS 之上?!
若是的话,要请留意关于任务等待号志  Semaphore 的使用,不 ...

没有,我这是不带系统的
watercici 回答时间:2018-6-21 11:36:39
x5y4z3 发表于 2018-6-21 11:29
楼主的程序是否架构于 uC/OS 或啥 OS 之上?!
若是的话,要请留意关于任务等待号志  Semaphore 的使用,不 ...

谢谢您!
wenyangzeng 回答时间:2018-6-21 12:32:25
watercici 发表于 2018-6-21 10:15
是不同的片选信号,OLED接在了SPI的NSS引脚(软件模式),W25Q16接在了普通IO上 ...

应该不接到NSS上,与W25Q16同样另外接一个IO口,这样2个SPI片选条件才一致。
馒头弟 回答时间:2018-6-21 15:29:27
其他外设功能初始化先屏蔽,一个个打开,再测试看看

评分

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

查看全部评分

xmshao 回答时间:2018-6-21 15:49:52
1. 确认管脚配置上没有冲突;
2.你到底是时钟紊乱还是发送数据紊乱,如果前者硬件及配置原因居多。如果后者,你的
SPI数据是怎样发送的,有无受到其它中断打断或干扰?

评分

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

查看全部评分

七哥 回答时间:2018-6-21 16:41:01
从来就没说过用的什么芯片
zhjb1 回答时间:2018-6-21 17:35:18
看了讨论大致了解一点了。SPI方式硬件中断处理两个或以上事件是不会有问题的。我想的可能原因与前边有位网友的一件相似——用1个SPI处理两个事件上排他性做的不够。是否考虑硬件上1个IO口或NSS信号非门给另一个片子,是两者在硬件上排他性,如果此两者也需要控制,在再加个与信号使能这两个事件就应该没有问题了。软件模拟,可以考虑采用状态机的模式来告知OLED或FLASH分别执行。仅供参考。试试吧

评分

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

查看全部评分

watercici 回答时间:2018-6-22 09:31:11
butterflyspring 发表于 2018-6-14 10:39
把调用函数发一下?我不知道你之前的贴叫什么..

您好,问题算是解决了,但是我不知道原因,就是有一个和SPI无关的函数调用错了,就是上面帖子中PWM波的两个函数,本来应该用第二个,结果我写成了第一个,改了之后就没事了。
watercici 回答时间:2018-6-22 09:31:36
TLLED 发表于 2018-6-14 14:10
可以单独写一个SPI通信程序,单独测试,其他端口不用,查找程序上那儿配置不对。 ...

单独测试是没有问题的

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版