打印

IO口模拟SPI总线问题

[复制链接]
8712|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 Designner 于 2012-2-10 15:06 编辑

请教各位老大,如下是网络上找的IO口模拟SPI总线发送接收数据的程序,已知从设备上升沿采集数据,下降沿输出数据。有几个问题不明白,用红色标出来了,请老大指点一下,谢谢!
INT8U SpiTxRxByte(INT8U dat)
{
INT8U i,temp;
temp = 0;
SCK = 0;                  //已知从设备上升沿采集。时钟置低,准备发送一BIT数据
for(i=0; i<8; i++)
{
  if(dat & 0x80)
  {
         MOSI = 1;        //数据已经准备好
  }
  else MOSI = 0;
  dat <<= 1;
  SCK = 1;                //时钟置高,制造一个上升沿,数据打入从设备
  _nop_;
  _nop_;
  _nop_;
  _nop_;
  temp <<= 1;       //这里开始不明白了,怎么没有制造下降沿就读从设备的数据呢。从设备是下降沿才出数据的啊。我感觉是"temp<<1;"应该放在SCK=0之
if(MISO)temp++;    //后才对
  SCK = 0;
  _nop_;
  _nop_;
}
return temp;
}

请老大解释一下为什么这样写,谢谢了哈!

时序.jpg (124.29 KB )

时序.jpg

相关帖子

沙发
airwill| | 2012-2-10 16:40 | 只看该作者
就是为了符合 下面那张图的时序要求呀

使用特权

评论回复
板凳
dqyubsh| | 2012-2-10 16:47 | 只看该作者
SPI有几种类型的,不一定别人的程序刚好满足你的要求。看看别人的死路,自己写一个好了。

使用特权

评论回复
地板
billyliang89| | 2012-3-3 12:37 | 只看该作者
根据你所提供的图“SO”那一行,输出数据也是上升沿锁存,即上升沿使设备锁存MOSI的数据的同时在MISO上送出数据,懂了没?

使用特权

评论回复
5
sunhq02| | 2012-3-3 21:04 | 只看该作者
SPI的时序虽然是那样子没错
但是作为主设备,时序的控制权在主设备手里
从设备遵守的原则是,在主设备时钟前沿发出后的一定时间之内准备好数据
,并在主设备时钟后沿发出后一定时间之内保持数据
,也就是说,主设备时钟后沿前后的这段时间里面,读从设备数据,都是安全的
,前一个指令或者后一个指令并没有关系

使用特权

评论回复
6
NE5532| | 2012-3-3 21:10 | 只看该作者
呵呵,这么高的分哪,给我吧,我告诉你咋回事。

1.从图上看出来,CSn拉低以后,MISO的第一个BIT就已经上线了,所以说这个时序严格来说在读“上一个”下降沿送出的数据。
2.既然数据时在下降沿上线,那么没有发生“这一个”下降沿之前,上一个数据一直在线上。所以只要在上升沿之前读数都可以。
3.不知道这个程序用的啥单片机,多高频率,但是写程序的这个人明显没搞过汇编,最后两个NOP根本不需要,“return temp;”编译出来,加上下一次的调用语句,绝对不止4条汇编语句。而且很少见到什么单片机端口速度能超过SPI的(主频几十M的哪种除外)

使用特权

评论回复
7
sunhq02| | 2012-3-3 23:19 | 只看该作者
NE5532说的第三点是对的

使用特权

评论回复
8
sunhq02| | 2012-3-3 23:23 | 只看该作者
第2点,那个数据并不是一直在线上
SPI的协议规定从设备有义务在时钟后沿维持数据一段时间,但不是一直都在
并不一定维持到时钟前沿

使用特权

评论回复
9
yewuyi| | 2012-3-4 11:34 | 只看该作者
呵呵,这种东西如果对着时序表还看不明白,就直接打屁股10下把

使用特权

评论回复
10
amwrdfe| | 2012-3-4 13:22 | 只看该作者
i2c,uart,对着时序图来搞,没什么难的。

使用特权

评论回复
11
guess| | 2012-10-9 15:42 | 只看该作者
学习了 正在学习中~

使用特权

评论回复
12
dlyt_test001| | 2012-10-9 16:11 | 只看该作者
最好做个通用的,定义一个数据结构吧!上升沿还是下降沿有效可设置;
附图上的所有时间间隔可设置。
:lol

使用特权

评论回复
13
reduct| | 2015-1-7 19:03 | 只看该作者
人家写的这个程序其实没什么问题的,tem<<1将最低位报持为0,如果放在SCK=0之后的话,就少了一个位了。

使用特权

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

本版积分规则

个人签名:On My  Way!

34

主题

171

帖子

1

粉丝