打印
[STM32F1]

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

[复制链接]
2302|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
any012|  楼主 | 2016-1-28 17:22 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 any012 于 2016-1-30 14:42 编辑

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


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

#include "adg738.h"

//¸ÃоƬÊÇϽµÑزÉÑù£¬¹ÊÐèÒª¸ü¸Ä¿ÕÏеçƽ
void ADG738_Set(unsigned char value)
{
        SPI_InitTypeDef SPI_InitStructure;
        
        SPI_Cmd(SPI3, DISABLE);
        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
        SPI_InitStructure.SPI_CRCPolynomial = 7;
        SPI_Init(SPI3, &SPI_InitStructure);
        SPI_Cmd(SPI3, ENABLE);
        
        ADG738_CS(OFF);
        SPI3_ReadWriteByte(value);
        ADG738_CS(ON);
        
        SPI_Cmd(SPI3, DISABLE);
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
        SPI_Init(SPI3, &SPI_InitStructure);
        SPI_Cmd(SPI3, ENABLE);
}

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



ADG738 .pdf (103.64 KB)
沙发
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时间啊

使用特权

评论回复
5
any012|  楼主 | 2016-1-29 09:05 | 只看该作者
玄德 发表于 2016-1-28 17:53
一个SPI连接多个芯片?

每个芯片的CS怎么接的?

每个芯片的CS端由单片机IO单独控制。

使用特权

评论回复
6
any012|  楼主 | 2016-1-29 10:06 | 只看该作者
加了个延时,好像行了。

#include "adg738.h"


void ADG738Delay(u16 time)
{
        u16 i;
        for(i = 0; i < time; time++);
}

//¸ÃоƬÊÇϽµÑزÉÑù£¬¹ÊÐèÒª¸ü¸Ä¿ÕÏеçƽ
void ADG738_Set(unsigned char value)
{
        SPI_InitTypeDef SPI_InitStructure;
       
        SPI_Cmd(SPI3, DISABLE);
        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
//        SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
        SPI_InitStructure.SPI_CRCPolynomial = 7;
        SPI_Init(SPI3, &SPI_InitStructure);
        SPI_Cmd(SPI3, ENABLE);
       
        ADG738_CS(ON);
        SPI3_ReadWriteByte(value);
        ADG738_CS(OFF);
       
        ADG738Delay(1);
       
        SPI_Cmd(SPI3, DISABLE);
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
        SPI_Init(SPI3, &SPI_InitStructure);
        SPI_Cmd(SPI3, ENABLE);
}

使用特权

评论回复
7
huangqi412| | 2016-1-29 10:25 | 只看该作者
接过不同时序的SPI一起, 貌似没问题啊。

使用特权

评论回复
8
any012|  楼主 | 2016-1-29 10:45 | 只看该作者
又改了下,修改前加了个延时,发送完后又修改回原来状态,之后再加个延时。
发现ADG738Delay(1);这个函数执行时间有4ms左右,真是慢啊。

使用特权

评论回复
9
llyyff1636| | 2016-1-29 13:44 | 只看该作者
大家说的是不同时序的SPI从设备跟一个设备进行通信吗?

使用特权

评论回复
10
ayl439| | 2016-1-29 14:28 | 只看该作者
无所谓啊,反正各个SPI器件都有相应的CS控制着,控制不同的器件,采用不通的策略

使用特权

评论回复
11
mcu5i51| | 2016-1-29 14:28 | 只看该作者
不用的使能关闭,应该没有影响,你就可以用对应的方式操作了

使用特权

评论回复
12
songchenping| | 2016-1-29 15:27 | 只看该作者
关键要看数据在哪个时段里面有效啊。

使用特权

评论回复
13
coody| | 2016-1-29 16:35 | 只看该作者
SPI是可以设置的

使用特权

评论回复
14
天灵灵地灵灵| | 2016-1-30 10:20 | 只看该作者
是cs设置的不对

使用特权

评论回复
15
zhuotuzi| | 2016-1-30 10:41 | 只看该作者
cs设置的不对?

使用特权

评论回复
16
dongnanxibei| | 2016-1-30 12:35 | 只看该作者
不用的使能关闭,应该没有影响

使用特权

评论回复
17
any012|  楼主 | 2016-1-30 14:39 | 只看该作者

为什么这么说呢?

使用特权

评论回复
18
leonliu_1128| | 2016-1-30 15:06 | 只看该作者
看芯片手册,SPI通信速率最高多少

使用特权

评论回复
19
奥德赛| | 2016-1-30 16:11 | 只看该作者
再找几个普通的GPIO模拟一个SPI不就可以了吗

使用特权

评论回复
20
天灵灵地灵灵| | 2016-2-10 16:48 | 只看该作者
用逻辑分析仪做,就可以了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

35

主题

232

帖子

6

粉丝