打印

SPI 时序图 求解

[复制链接]
8500|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zzjb|  楼主 | 2010-7-3 08:59 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
沙发
black.lu| | 2010-7-3 11:38 | 只看该作者
按时序图来看,
DI:在时钟的下降沿数据被改变了,所以上升沿应该读数据数据。
DO:也是在下降沿,但是有一个小延时后tCD0H,数据才改变。
数据等待时间,要看你时钟的频率,上面没有看到特殊的说明,一般边沿都是ns级别的,所以感觉一个时钟的上升沿的时间,到下一个下降沿到来之前,数据保持就可以了吧。

使用特权

评论回复
板凳
zzjb|  楼主 | 2010-7-4 12:12 | 只看该作者
2# black.lu
谢谢你

看时序图式CLK在CE之前是高,是说要先拉高CLK 再拉高CE吗

使用特权

评论回复
地板
acgean| | 2010-7-4 15:43 | 只看该作者
3# zzjb

是的,
但是我们注意到, 时序图上的 CLK 线 在刚开始时, 有高低电平两条线都在.
可以设定成 高或低 两种模式,
具体采用哪种模式, 由用户根据外围(从设备) 的特性来确定.

有的从器件 在没有送 CLK 时, 首位数据已经送到 DI 线上, 那就要置 CLK 低了, 否则会丢掉一位数据了

使用特权

评论回复
5
zzjb|  楼主 | 2010-7-4 16:03 | 只看该作者
本帖最后由 zzjb 于 2010-7-4 22:45 编辑

我写的驱动如下,但是就是读不到数据,大家能在帮我看看哪里有问题吗,谢谢了
void dp_DataOut(uchar *DataP,uchar d_txLen)
{
uchar i,b,d_txBuff;
ulong d_Key;

P_DISP_CE = 1;
P_DISP_CLK = 1;     /* LCD-CLK */
for (i = 0 ; i < d_txLen ; i ++){
  d_txBuff = DataP[ i ];
  for (b = 0 ; b < 8 ; b ++){
   P_DISP_CLK = 0;
   if(d_txBuff & B10000000)
    P_DISP_DI = 1;
   else
    P_DISP_DI = 0;
   d_txBuff = d_txBuff << 1;
   P_DISP_CLK = 1;
  }
}
P_DISP_CE = 0;
}

ulong data_Read(void)
{
uchar i,d_test;
ulong d_data;
P_DISP_CE = 1;
d_data = 0;
  nop();        
  nop();        
  nop();        
  nop();        
  nop();        
  nop();        
  nop();        
  nop();        
  nop();        
  nop();        
P_DISP_CLK = 1;
  nop();        
  nop();        
  nop();        
  nop();        
  nop();        
  nop();        
  nop();        
  nop();        
  nop();        
  nop();        
for (i = 0 ; i < 31 ; i ++){
  P_DISP_CLK = 0;
  nop();        
  nop();        
  nop();        
  nop();        
  nop();        
  nop();        
  nop();        
  nop();        
  nop();        
  nop();        
  d_test = P_DISP_DO;
  d_data |= d_test;
  d_data = d_data << 1;
  P_DISP_CLK = 1;
  nop();        
  nop();        
  nop();        
  nop();        
  nop();        
  nop();        
  nop();        
  nop();        
  nop();        
  nop();        
}
P_DISP_CE = 0;
return(d_data);
}

}

使用特权

评论回复
6
black.lu| | 2010-7-4 21:44 | 只看该作者
d_txBuff = DataP;
LZ这是什么意思?

使用特权

评论回复
7
zzjb|  楼主 | 2010-7-4 22:42 | 只看该作者
本帖最后由 zzjb 于 2010-7-4 22:45 编辑

6# black.lu

不好意思 是d_txBuff = DataP [ i ]; copy'的时候弄错了,改正了
这个读数据的时序写的哪里有问题 我一直不知道 但是就是数据读不到 很郁闷

使用特权

评论回复
8
zzjb|  楼主 | 2010-7-5 08:46 | 只看该作者
对了 SIFDI SIFDO  指的都是从设备的DI DO.它的DI DO对从来说的,对我来说DO是输入,DI是我输出的.

使用特权

评论回复
9
black.lu| | 2010-7-5 19:55 | 只看该作者
这个不是的吧,SPI有主从模式,输入与输出的定义也不一样的,我记得好像是,我之前写SD卡的时候接触到过。这样光看程序看不出来,调试的方法要注意好,如果有仿真器,或者示波器,如果发送数据0xAA,你观察是不是在时钟跳变的时候,端口有输出,调试程序需要耐心,遇到问题不能怀疑这怀疑那,从源头抓起,首先初始化是否正确、系统稳定延时是否足够、系统时钟配置是否正常、寄存器初始化是否正确、单片机的特殊功能寄存器SPI是否配置正确、IO口的配置是否正确,最后就从最基本的程序调试,我调时序要求较高的IC一般都借助示波器,LZ可以再考虑下。

使用特权

评论回复
10
zzjb|  楼主 | 2010-7-5 20:07 | 只看该作者
这个不是的吧,SPI有主从模式,输入与输出的定义也不一样的,我记得好像是,我之前写SD卡的时候接触到过。这样光看程序看不出来,调试的方法要注意好,如果有仿真器,或者示波器,如果发送数据0xAA,你观察是不是在 ...
black.lu 发表于 2010-7-5 19:55


是这样的,我是通过单片机IO口模拟SPI通讯,这几张图是单片机控制的IC的datasheet上的。
示波器现在手上还没有,只能通过仿真器,但是通过仿真器写了数据之后,老收不到IC的回馈数据。
对了,DI DO的数据都是在下降沿改变,那就是说MCU是在下降沿对DI写数据,在上升沿从DO读数据。我理解的对吗?
还有关于setuptime和waittime 在下降沿之后 我延时了几个nop,每个nop是100ns,时间是够了,那要读DO数据,最好是在拉高之前的setup之后读,还是在拉高之后等待一会再读呢,谢谢了!

使用特权

评论回复
11
black.lu| | 2010-7-7 08:45 | 只看该作者
第一个问题:一般数据更新的时候数据都是不稳定的,所以下降沿写数据、上升沿读稳定数据。
第二:读DO数据,时钟的上升沿只是提供一个信号,这时候数据已经是稳定的,所以不需要延时。
第三:你要注意方向,如果这是IC的时序,那说明
IC     MCU
DI----DO
DO---DI
所以如果MCU读取DO数据,那就是在上升沿。

使用特权

评论回复
12
zzjb|  楼主 | 2010-7-9 19:02 | 只看该作者
谢谢楼上的,再顶一下

使用特权

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

本版积分规则

2

主题

13

帖子

1

粉丝