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

多个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-156411 回答时间: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-156411 回答时间: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. }
复制代码
12下一页

所属标签

相似问题

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