多个SPI器件,有的上升沿采样,有的下降沿采样,怎么破?
本帖最后由 any_014 于 2016-1-30 14:46 编辑一个板子上有多个SPI元件,有一个元件通讯不对,研究了多半天,才发现这个是SCL下降沿时采样的,其他的都是上升沿时采样。
如果用硬件SPI的话,如何解决这个问题?每次和这个元件通讯时,先改下SPI设置?
---------------------------------20160130---------------------------------
控制这个芯片还是有问题,更新下控制时序图及手册。
没有什么关系。 跟谁通信用哪种配置。 现在是通过SPI和ADG738多路开关通信,每分钟通信一次。
现在是只让通道1导通,结果测试,过一会就是通道2导通了。
8个导通通道和SPI发送的8位数的位对应。随意怀疑是通讯采样时出错了。 如果是跑OS,多线程操作的话就要注意一些。
若只是轮询的话,只要切换模式之后清一下读取数据寄存器清一下就好 waiman-156411 发表于 2016-1-26 17:06
如果是跑OS,多线程操作的话就要注意一些。
若只是轮询的话,只要切换模式之后清一下读取数据寄存器清一下 ...
不跑OS。
为什么要清读取数据寄存器? any_014 发表于 2016-1-26 17:19
不跑OS。
为什么要清读取数据寄存器?
是为了避免切换模式的时候,发生其他异常,清一下数据寄存器和标志位是有必要的。 waiman-156411 发表于 2016-1-27 11:29
是为了避免切换模式的时候,发生其他异常,清一下数据寄存器和标志位是有必要的。 ...
谢谢,受教了。 这样改了下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);
}
用示波器观察SCL和MOSI的波形;
现在是每1秒通讯一次,感觉SCL空闲电平的极性没有变化,倒是MOSI的空闲电平变化了... 加了个延时,好像行了。
#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