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

[复制链接]
2847|19
 楼主| any012 发表于 2016-1-28 17:22 | 显示全部楼层 |阅读模式
本帖最后由 any012 于 2016-1-30 14:42 编辑

其他元件都是SCL空闲电平为高电平,然后是上升沿采样。
只有一个是上升沿时数据改变,下降沿时采样。
现在想到的办法是:
把SPI设置为SCL空闲电平为高电平,第二个边沿数据采样;
和这个期间通讯前,更改SPI模式,改为SCL空闲电平为低电平,仍是第二个边沿数据采样;
通讯结束后,再把SPI模式改回来。


结果,通讯不成功,用示波器观测了下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. }

----------------------20160130------------------------------
主楼更新下手册,及读写时续截图。
好像有两位朋友怀疑是CS不对,不知道这么猜测有什么依据?

124.jpg

ADG738 .pdf (103.64 KB, 下载次数: 0)
 楼主| any012 发表于 2016-1-28 17:39 | 显示全部楼层
用示波器观察SCL和MOSI的波形;
现在是每1秒通讯一次,感觉SCL空闲电平的极性没有变化,倒是MOSI的空闲电平变化了...
玄德 发表于 2016-1-28 17:53 | 显示全部楼层

一个SPI连接多个芯片?

每个芯片的CS怎么接的?


cowboy2014 发表于 2016-1-28 20:42 | 显示全部楼层
这个有可能是cs设置的不对,这么做会不会太浪费CPU时间啊
 楼主| any012 发表于 2016-1-29 09:05 | 显示全部楼层
玄德 发表于 2016-1-28 17:53
一个SPI连接多个芯片?

每个芯片的CS怎么接的?

每个芯片的CS端由单片机IO单独控制。
 楼主| any012 发表于 2016-1-29 10:06 | 显示全部楼层
加了个延时,好像行了。

  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. }
huangqi412 发表于 2016-1-29 10:25 | 显示全部楼层
接过不同时序的SPI一起, 貌似没问题啊。
 楼主| any012 发表于 2016-1-29 10:45 | 显示全部楼层
又改了下,修改前加了个延时,发送完后又修改回原来状态,之后再加个延时。
发现ADG738Delay(1);这个函数执行时间有4ms左右,真是慢啊。
llyyff1636 发表于 2016-1-29 13:44 | 显示全部楼层
大家说的是不同时序的SPI从设备跟一个设备进行通信吗?
ayl439 发表于 2016-1-29 14:28 | 显示全部楼层
无所谓啊,反正各个SPI器件都有相应的CS控制着,控制不同的器件,采用不通的策略
mcu5i51 发表于 2016-1-29 14:28 | 显示全部楼层
不用的使能关闭,应该没有影响,你就可以用对应的方式操作了
songchenping 发表于 2016-1-29 15:27 | 显示全部楼层
关键要看数据在哪个时段里面有效啊。
coody 发表于 2016-1-29 16:35 | 显示全部楼层
SPI是可以设置的
天灵灵地灵灵 发表于 2016-1-30 10:20 | 显示全部楼层
是cs设置的不对
zhuotuzi 发表于 2016-1-30 10:41 | 显示全部楼层
cs设置的不对?
dongnanxibei 发表于 2016-1-30 12:35 | 显示全部楼层
不用的使能关闭,应该没有影响
 楼主| any012 发表于 2016-1-30 14:39 | 显示全部楼层

为什么这么说呢?
leonliu_1128 发表于 2016-1-30 15:06 | 显示全部楼层
看芯片手册,SPI通信速率最高多少
奥德赛 发表于 2016-1-30 16:11 | 显示全部楼层
再找几个普通的GPIO模拟一个SPI不就可以了吗
天灵灵地灵灵 发表于 2016-2-10 16:48 | 显示全部楼层
用逻辑分析仪做,就可以了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

35

主题

232

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部