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

多个SPI器件,有的上升沿采样,有的下降沿采样,怎么破?

[复制链接]
any_014 提问时间:2016-1-26 16:23 /
本帖最后由 any_014 于 2016-1-30 14:46 编辑

一个板子上有多个SPI元件,有一个元件通讯不对,研究了多半天,才发现这个是SCL下降沿时采样的,其他的都是上升沿时采样。
如果用硬件SPI的话,如何解决这个问题?每次和这个元件通讯时,先改下SPI设置?
---------------------------------20160130---------------------------------

控制这个芯片还是有问题,更新下控制时序图及手册。

124.jpg

ADG738 .pdf (103.64 KB, 下载次数: 1)
收藏 评论11 发布时间:2016-1-26 16:23

举报

11个回答
xmshao 回答时间:2016-1-26 16:48:46
没有什么关系。 跟谁通信用哪种配置。
any_014 回答时间:2016-1-26 17:05:39
现在是通过SPI和ADG738多路开关通信,每分钟通信一次。
现在是只让通道1导通,结果测试,过一会就是通道2导通了。
8个导通通道和SPI发送的8位数的位对应。随意怀疑是通讯采样时出错了。
waiman 回答时间:2016-1-26 17:06:34
如果是跑OS,多线程操作的话就要注意一些。
若只是轮询的话,只要切换模式之后清一下读取数据寄存器清一下就好
any_014 回答时间:2016-1-26 17:19:30
waiman-156411 发表于 2016-1-26 17:06
如果是跑OS,多线程操作的话就要注意一些。
若只是轮询的话,只要切换模式之后清一下读取数据寄存器清一下 ...

不跑OS。
为什么要清读取数据寄存器?
waiman 回答时间:2016-1-27 11:29:51
any_014 发表于 2016-1-26 17:19
不跑OS。
为什么要清读取数据寄存器?

是为了避免切换模式的时候,发生其他异常,清一下数据寄存器和标志位是有必要的。
any_014 回答时间:2016-1-27 13:30:09
waiman-156411 发表于 2016-1-27 11:29
是为了避免切换模式的时候,发生其他异常,清一下数据寄存器和标志位是有必要的。 ...

谢谢,受教了。
any_014 回答时间:2016-1-28 17:19:13
这样改了下SPI的模式。
在调试用SPI3读写函数前,关断SPI3,然后配置为空闲时SCL为低电平,使能SPI3;
然后调用SPI3读写函数,和ADG738通讯;
通讯结束后关断SPI3,更改SPI模式为空闲时SCL为高电平,使能SPI3.

结果,通讯不成功,用示波器观测了下MOSI和SCL信号,不同步,有时候SCL信号出现了几个以后才有MOSI信号,并且这个间隔是在变化的。



  1. #include "adg738.h"

  2. //¸ÃоƬÊÇϽµÑزÉÑù£¬¹ÊÐèÒª¸ü¸Ä¿ÕÏеçƽ
  3. void ADG738_Set(unsigned char value)
  4. {
  5.         SPI_InitTypeDef SPI_InitStructure;
  6.        
  7.         SPI_Cmd(SPI3, DISABLE);
  8.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  9.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  10.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  11.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
  12.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
  13.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  14.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
  15.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  16.         SPI_InitStructure.SPI_CRCPolynomial = 7;
  17.         SPI_Init(SPI3, &SPI_InitStructure);
  18.         SPI_Cmd(SPI3, ENABLE);
  19.        
  20.         ADG738_CS(OFF);
  21.         SPI3_ReadWriteByte(value);
  22.         ADG738_CS(ON);
  23.        
  24.         SPI_Cmd(SPI3, DISABLE);
  25.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
  26.         SPI_Init(SPI3, &SPI_InitStructure);
  27.         SPI_Cmd(SPI3, ENABLE);
  28. }
复制代码



any_014 回答时间:2016-1-28 17:38:54
用示波器观察SCL和MOSI的波形;
现在是每1秒通讯一次,感觉SCL空闲电平的极性没有变化,倒是MOSI的空闲电平变化了...
any_014 回答时间:2016-1-29 10:06:38
加了个延时,好像行了。

  1. #include "adg738.h"


  2. void ADG738Delay(u16 time)
  3. {
  4.         u16 i;
  5.         for(i = 0; i < time; time++);
  6. }

  7. //¸ÃоƬÊÇϽµÑزÉÑù£¬¹ÊÐèÒª¸ü¸Ä¿ÕÏеçƽ
  8. void ADG738_Set(unsigned char value)
  9. {
  10.         SPI_InitTypeDef SPI_InitStructure;
  11.        
  12.         SPI_Cmd(SPI3, DISABLE);
  13.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  14.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  15.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  16.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
  17. //        SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
  18.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
  19.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  20.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
  21.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  22.         SPI_InitStructure.SPI_CRCPolynomial = 7;
  23.         SPI_Init(SPI3, &SPI_InitStructure);
  24.         SPI_Cmd(SPI3, ENABLE);
  25.        
  26.         ADG738_CS(ON);
  27.         SPI3_ReadWriteByte(value);
  28.         ADG738_CS(OFF);
  29.        
  30.         ADG738Delay(1);
  31.        
  32.         SPI_Cmd(SPI3, DISABLE);
  33.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
  34.         SPI_Init(SPI3, &SPI_InitStructure);
  35.         SPI_Cmd(SPI3, ENABLE);
  36. }
复制代码
any_014 回答时间:2016-1-29 10:46:06
又改了下,修改前加了个延时,发送完后又修改回原来状态,之后再加个延时。
发现ADG738Delay(1);这个函数执行时间有4ms左右,真是慢啊。
any_014 回答时间:2016-1-30 14:46:15
控制这个芯片还是有问题,更新下控制时序图及手册。

所属标签

相似问题

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