any_014 发表于 2016-1-26 16:23:01

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

本帖最后由 any_014 于 2016-1-30 14:46 编辑

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

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




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信号,并且这个间隔是在变化的。



#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);
}


any_014 发表于 2016-1-28 17:38:54

用示波器观察SCL和MOSI的波形;
现在是每1秒通讯一次,感觉SCL空闲电平的极性没有变化,倒是MOSI的空闲电平变化了...

any_014 发表于 2016-1-29 10:06:38

加了个延时,好像行了。

#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);
}
页: [1] 2
查看完整版本: 多个SPI器件,有的上升沿采样,有的下降沿采样,怎么破?