打印
[ZLG-ARM]

周工:LPC2210中有关SPI的若干疑问!

[复制链接]
2653|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
火光|  楼主 | 2007-7-30 19:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

周工:
  我仔细地看了您写的<ARM微控制器基础与实战>和<ARM嵌入式系统基础教程>,
  对SPI那里有几个地方不太明白,想请教您一下:

  1.书上的例子中每收发一个字节都是把SSEL激活一次的,比如
    MSendData这个函数就是这样实现的.
       SSEL变低电平-->发送,接受1个字节-->SSEL变高电平
    如果要发送一个字符串,是不是要把SSEL激活很多次,能不能在一次SSEL
    激活中把多个字符全部发出去?

  2.使得SPINT的中断标志置位的条件是什么?<ARM嵌入式系统基础教程>中P270页说是 SPIF + MODF,而P272页说的是 SPIF + WCOL . 不知道终究该是什么?

  3.在SPI中是否存在类似I2C那种暂时阻止对方发送信息的机制?比如I2C可以
用I2CONSET中的SI位来遏止对方,使通讯延迟...
    在SPI中有没有这样的机制呢?我没有看到.
    对主SPI倒是没有什么.对从SPI的话,压力就大了,稍微延迟就可能收到
    ROVRWCOL错误信息了
  
  4.SPI状态寄存器SPSR中的SPIF到底是谁来清除的?
    <ARM微控制器基础与实战>P201页说是要通过"读或者写SPI数据寄存器来清零SPIF状态位",而P203页说"当第一次读取该寄存器时,该位清零"...
    搞不明白了...

    所以,在这里请教您一下...
    

相关帖子

沙发
火光|  楼主 | 2007-7-30 21:34 | 只看该作者

哈哈,真的有些问题!


 刚才用周立功公司带来的例子程序试了一下,发现
 开始时候SSEL低电平-->然后发送16个字节-->然后再把SSEL变高电平,,,
 这个办法是不灵的.
 我用的就是基础实验中的 25号SPI实验的代码

 似乎就是必须每发送一个字节就变一变SSEL的电平

 那是个非常简单的程序,几句话的小程序...

使用特权

评论回复
板凳
zlgARM| | 2007-7-31 09:47 | 只看该作者

火光

您好:
    正在撰写一个全面而清晰的回复,争取能较好地解答您的疑惑!
    您对我们的书阅读十分仔细,总能找出问题,对此非常感谢!若有机会,也许会请您为我们的SmartARM2300配套的新版教材提建议。热心而好学,严谨而仔细的读者,是我们的教材的最好校对者之一。

使用特权

评论回复
地板
火光|  楼主 | 2007-7-31 10:17 | 只看该作者

哈哈,谢谢您!


  是了,你们公司总的说来是很不错的!

  开发速度快了,难免会出错的.
  

使用特权

评论回复
5
zlgARM| | 2007-7-31 14:19 | 只看该作者

火光

您好:
    谢谢您的关心!其实开发慢了,也难免出错,错误是不可能完全避免的!
    现在依序回复您的问题。

    1:关于SSEL的问题
    首先要搞清楚一点,SSEL的电平要怎样变化并不取决于您的想法。SSEL的电平如何变化,这是由和处理器接口的从SPI器件决定的。打个比方,A国的人他只能听懂A语,但您非要和他说B语,那么岂不是**同鸭讲?两个器件要能正常通讯,也存在着用什么“语言”沟通的问题。我们必须选取两个器件都能“听懂的语言”!!这个比方里的“语言”,就对应着“时序”、“帧格式”概念。
    建议您找来SST25VF016B的数据手册来看看,看看它的时序图,理解“时序”的意义。
    思考一下,如果处理器要和该芯片通信,是不是可以随意安排SPI帧格式,随意决定SSEL电平变化规则?如果由您随意决定了,那么SST25VF016B是否买处理器的账,能和处理器正常沟通?为什么处理器SPI的帧格式要有四种?脱离了和处理器接口的从SPI器件谈帧格式究竟有没有意义?
    
   2:触发SPINT置位的条件
    
   SPI中断标志的置位,仅由SPIF和SPIE决定。当SPIE和SPIF均置位,SPI中断标志才可以置位。MODF标志的置位、WCOL标志的置位,均不能触发SPI中断。这是来自NXP用户手册原文的谬误!谢谢指正!
   
   3:阻止机制
   这个很简单,完全可以通过制定协议来实现,例如从机返回一个指令让主机停止发送。也可以通过外部中断引脚来实现,从机通过主机的外部中断引脚来阻止主机发送。
  
   4:SPIF标志位的清除
   这也是来自NXP数据手册的错误。事实上,SPIF标志位的清除是通过读SPI状态寄存器来实现的,其余状态标志位的清除亦是如此。

使用特权

评论回复
6
火光|  楼主 | 2007-7-31 15:32 | 只看该作者

哈哈,谢谢ZLGARM朋友!

  谢谢ZLGARM朋友的答复!
  2、3、4三个疑问都清楚了!

  第1个就让我按照你的说法再研究研究!
  --------------------------------------------------

  ZLGARM,你们要尽量在后续的版本中把这些错误改掉啊!
  有错误在里面,读者看起来很不舒服的!
  虽然,这些错误的源头其实是NXP的数据手册!

  --------------------------------------------------
  再一次感谢ZLGARM朋友的答复!

使用特权

评论回复
7
zlgARM| | 2007-7-31 19:51 | 只看该作者

火光

您好!
    理解您的期望!毕竟,书中的错误每减少一个,就能抹去读者们的一点弯路~
    不管怎样,我们确实下了很大的苦功来校对:
    一、从文本方面校对
    每一句话都改到简明流畅,连错误的标点符号也不让它逃脱;
    对每一个错别字、每一幅图的不美观处“一个也不放过”;
    不一致的风格和称呼,坚决统一没商量;
    各种细微处的小BUG,比如错误的页码、本应为上标的字符……都被一个个揪出来。
    二、从技术原理方面校对:
    1、freshman的校对
    请基础扎实、热情好学、严谨仔细,拥有对教材的新鲜感的freshman来校对。他们天然地拥有最好的校对能力,能够识别出最多的原理性bug。他们也确实发现了一些bug,虽然不多,但是,您知道,原理性bug是十分难找的。
    2、作者间的互换校对
    这样的一些书,不可能由一个人完成,而只可能是团队的作品。几个分开来写作的工程师在最后,互换着校对,改出了尽可能多的错误,就此奠定了框架;
    3、实地调查
    以用户为本,我们也阅读了zlg-arm版面上自己所负责外设的全部贴子,搞清楚了那些最容易困扰读者的“关节”点,然后再调整教材内容,加强对基本概念、重点知识的表述,增加重要的细节,力求让读者们看了后,至少不会再产生那些前辈们曾经产生的疑问。


    
  
    
    

使用特权

评论回复
8
wlsui| | 2007-7-31 23:32 | 只看该作者

关于第1个问题

您说的
"书上的例子中每收发一个字节都是把SSEL激活一次的,比如
MSendData这个函数就是这样实现的.SSEL变低电平-->发送,接受1个字节-->SSEL变高电平"

我不知道你说的MSendData()函数的SSEL激活是不是指IO0CLR = HC595CS,如果是的话,那我只能告诉你书上的解释是错的

其实,IO0CLR = HC595CS并不是SPI的SSEL激活,注意到函数末尾的IO0SET = HC595CS了吗?
IO0CLR = HC595CS;
...
...
IO0SET = HC595CS;
这两条语句构成了一个上升沿.如果看下HC595的数据手册,你就会发现它是一个三级结构,第一级是移位,第二级是D触发器的锁存,第三级是输出使能
595需要两个时钟,一个是SRCLK,负责HC595移位用的,另一个是RCLK,负责将移位后的数据锁存入第二级D触发器,使之输出.
595的SRCLK即是SPI的SCK,而595的RCLK呢?就是IO0CLR = HC595CS,IO0SET = HC595CS这个上升沿了.
到此,您就会发现,IO0CLR = HC595CS并不是SPI的SSEL,而是在SPI的数据送入HC595的移位寄存器后给一个上升沿使之锁存

不知道我这样的解释是否恰当.

书上对IO0CLR = HC595CS的解释一直都有问题,在学校的时候曾向工程师提过.不过相信很快就能改过来的.请你们放心.

使用特权

评论回复
9
zlgARM| | 2007-8-1 07:46 | 只看该作者

RE

   “MSendData()函数的SSEL激活是不是指IO0CLR = HC595CS,如果是的话,那我只能告诉你书上的解释是错的”
    书上并没有解释SSEL激活是IO0CLR = HC595。书上既然都说了是用GPIO脚来接到595的RCLK,也就不必提到SPI的SSEL功能。

    如果把
  “
    IO0CLR |= HC595_CS;            // 片选
    ……
    IO0SET |= HC595_CS;
   ”
    改为:
   “ 
    IO0CLR |= HC595_RCLK;            
    ……
    IO0SET |= HC595_RCLK;
    ”    
    也许会好一些。

   总结:
   1、处理器并没有用SSEL脚去驱动74hc595,把GPIO脚称为SSEL脚是混淆了概念,容易造成误解;然,书上并没有把产生RCLK上升沿的脚称呼为SSEL脚,这是火光老师的说法。
   2、把RCLK脚称呼为CS脚。我个人认为问题不大。
    2300教材里,除《深入浅出》外我们还有配套的技术笔记,看了技术笔记后自然能理解为何不用SSEL功能而用GPIO去产生时序。理解这一点后,再回头考虑如何用SPI驱动74HC595,自然心里亮堂。
   这个贴给人以启发,如何甄别出那些重要的知识点,而以这些知识点为核心去规划技术笔记?这是我们要在2400项目里深入思考的问题。2300项目的教材相对于以前的教材,在质量上是一个比较大的飞跃;2400项目的教材,相对于2300的教材,我想,仍然有再度飞跃的空间,请大家拭目以待。

使用特权

评论回复
10
火光|  楼主 | 2007-8-1 09:43 | 只看该作者

wlsui :你的解释很有道理!


  我在ZLGARM 在5楼给我答复后,自己去看了看74HC595,已经明白原因了.

  实际上74HC595不象纯粹的 SPI器件,但也可以用用.

  "
  IO0CLR = HC595CS;
  ...
  ...
  IO0SET = HC595CS
  "
  结构
  并不是为了产生一个低电平的片选信号,而是为了产生一个上边沿打入信号.
  
  我开始时候主要是没有仔细看74HC595的电路特性,以为它就是一个一般的SPI器件呢!
  
  谢谢wlsui的答复!
  

使用特权

评论回复
11
wlsui| | 2007-8-1 10:35 | 只看该作者

Re:

to zlgARM:
确实,说SSEL激活是IO0CLR = HC595CS并不恰当,书上也没有这么解释过,而且,书上的HC595CS引脚一般都是用P0.29,P0.29也根本没有SSEL功能.
但要将IO0CLR = HC595CS解释为片选,值得商榷

to 火光:
你说"实际上74HC595不象纯粹的 SPI器件,但也可以用用"
实际上,74HC595根本上就不是SPI器件,只是一个串转并的芯片而已,只不过串行输入的时序可以用SPI的时序来驱动而已.
如果你去看74HC595的数据手册,你会发现,人家从第一个字到最后一个字都没有出现"SPI"字样
这也就是我认为将IO0CLR = HC595CS解释为片选不是很恰当的一个原因.既然是SPI的主机来片选从机,也就要求从机也是SPI接口的,可实际上并不是.既然不是SPI接口的,那又怎么能叫片选呢?
如果为片选,那就是说,只要我一直将片选信号保持有效(低电平),那我就能一直发数据(连续多字节),并且操作是成功的,可事实并不然.为什么非得要在每发送一个字节后面将CS端置高才能发送成功呢?.

使用特权

评论回复
12
wlsui| | 2007-8-1 10:42 | 只看该作者

还有,李工起得还真是早啊

放假啊,睡觉^--^

使用特权

评论回复
13
火光|  楼主 | 2007-8-1 11:56 | 只看该作者

对了,wlsui说的对.


  主要是74HC595本来就不是个SPI器件,,,

使用特权

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

本版积分规则

19

主题

75

帖子

0

粉丝