[ZLG-ARM] 周工:LPC2210中有关SPI的若干疑问!

[复制链接]
3644|12
 楼主| 火光 发表于 2007-7-30 19:39 | 显示全部楼层 |阅读模式
<br />周工:<br />&nbsp;&nbsp;我仔细地看了您写的&ltARM微控制器基础与实战&gt和&ltARM嵌入式系统基础教程&gt,<br />&nbsp;&nbsp;对SPI那里有几个地方不太明白,想请教您一下:<br /><br />&nbsp;&nbsp;1.书上的例子中每收发一个字节都是把SSEL激活一次的,比如<br />&nbsp;&nbsp;&nbsp;&nbsp;MSendData这个函数就是这样实现的.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SSEL变低电平--&gt发送,接受1个字节--&gtSSEL变高电平<br />&nbsp;&nbsp;&nbsp;&nbsp;如果要发送一个字符串,是不是要把SSEL激活很多次,能不能在一次SSEL<br />&nbsp;&nbsp;&nbsp;&nbsp;激活中把多个字符全部发出去?<br /><br />&nbsp;&nbsp;2.使得SPINT的中断标志置位的条件是什么?&ltARM嵌入式系统基础教程&gt中P270页说是&nbsp;SPIF&nbsp;+&nbsp;MODF,而P272页说的是&nbsp;SPIF&nbsp;+&nbsp;WCOL&nbsp;.&nbsp;不知道终究该是什么?<br /><br />&nbsp;&nbsp;3.在SPI中是否存在类似I2C那种暂时阻止对方发送信息的机制?比如I2C可以<br />用I2CONSET中的SI位来遏止对方,使通讯延迟...<br />&nbsp;&nbsp;&nbsp;&nbsp;在SPI中有没有这样的机制呢?我没有看到.<br />&nbsp;&nbsp;&nbsp;&nbsp;对主SPI倒是没有什么.对从SPI的话,压力就大了,稍微延迟就可能收到<br />&nbsp;&nbsp;&nbsp;&nbsp;ROVRWCOL错误信息了<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;4.SPI状态寄存器SPSR中的SPIF到底是谁来清除的?<br />&nbsp;&nbsp;&nbsp;&nbsp;&ltARM微控制器基础与实战&gtP201页说是要通过&quot;读或者写SPI数据寄存器来清零SPIF状态位&quot;,而P203页说&quot;当第一次读取该寄存器时,该位清零&quot;...<br />&nbsp;&nbsp;&nbsp;&nbsp;搞不明白了...<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;所以,在这里请教您一下...<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />
 楼主| 火光 发表于 2007-7-30 21:34 | 显示全部楼层

哈哈,真的有些问题!

<br />&nbsp;刚才用周立功公司带来的例子程序试了一下,发现<br />&nbsp;开始时候SSEL低电平--&gt然后发送16个字节--&gt然后再把SSEL变高电平,,,<br />&nbsp;这个办法是不灵的.<br />&nbsp;我用的就是基础实验中的&nbsp;25号SPI实验的代码<br /><br />&nbsp;似乎就是必须每发送一个字节就变一变SSEL的电平<br /><br />&nbsp;那是个非常简单的程序,几句话的小程序...<br />
zlgARM 发表于 2007-7-31 09:47 | 显示全部楼层

火光

您好:<br />&nbsp;&nbsp;&nbsp;&nbsp;正在撰写一个全面而清晰的回复,争取能较好地解答您的疑惑!<br />&nbsp;&nbsp;&nbsp;&nbsp;您对我们的书阅读十分仔细,总能找出问题,对此非常感谢!若有机会,也许会请您为我们的SmartARM2300配套的新版教材提建议。热心而好学,严谨而仔细的读者,是我们的教材的最好校对者之一。
 楼主| 火光 发表于 2007-7-31 10:17 | 显示全部楼层

哈哈,谢谢您!

<br />&nbsp;&nbsp;是了,你们公司总的说来是很不错的!<br /><br />&nbsp;&nbsp;开发速度快了,难免会出错的.<br />&nbsp;&nbsp;
zlgARM 发表于 2007-7-31 14:19 | 显示全部楼层

火光

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

哈哈,谢谢ZLGARM朋友!

&nbsp;&nbsp;谢谢ZLGARM朋友的答复!<br />&nbsp;&nbsp;2、3、4三个疑问都清楚了!<br /><br />&nbsp;&nbsp;第1个就让我按照你的说法再研究研究!<br />&nbsp;&nbsp;--------------------------------------------------<br /><br />&nbsp;&nbsp;ZLGARM,你们要尽量在后续的版本中把这些错误改掉啊!<br />&nbsp;&nbsp;有错误在里面,读者看起来很不舒服的!<br />&nbsp;&nbsp;虽然,这些错误的源头其实是NXP的数据手册!<br /><br />&nbsp;&nbsp;--------------------------------------------------<br />&nbsp;&nbsp;再一次感谢ZLGARM朋友的答复!<br />
zlgARM 发表于 2007-7-31 19:51 | 显示全部楼层

火光

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

关于第1个问题

您说的<br />&quot;书上的例子中每收发一个字节都是把SSEL激活一次的,比如<br />MSendData这个函数就是这样实现的.SSEL变低电平--&gt发送,接受1个字节--&gtSSEL变高电平&quot;<br /><br />我不知道你说的MSendData()函数的SSEL激活是不是指IO0CLR&nbsp;=&nbsp;HC595CS,如果是的话,那我只能告诉你书上的解释是错的<br /><br />其实,IO0CLR&nbsp;=&nbsp;HC595CS并不是SPI的SSEL激活,注意到函数末尾的IO0SET&nbsp;=&nbsp;HC595CS了吗?<br />IO0CLR&nbsp;=&nbsp;HC595CS;<br />...<br />...<br />IO0SET&nbsp;=&nbsp;HC595CS;<br />这两条语句构成了一个上升沿.如果看下HC595的数据手册,你就会发现它是一个三级结构,第一级是移位,第二级是D触发器的锁存,第三级是输出使能<br />595需要两个时钟,一个是SRCLK,负责HC595移位用的,另一个是RCLK,负责将移位后的数据锁存入第二级D触发器,使之输出.<br />595的SRCLK即是SPI的SCK,而595的RCLK呢?就是IO0CLR&nbsp;=&nbsp;HC595CS,IO0SET&nbsp;=&nbsp;HC595CS这个上升沿了.<br />到此,您就会发现,IO0CLR&nbsp;=&nbsp;HC595CS并不是SPI的SSEL,而是在SPI的数据送入HC595的移位寄存器后给一个上升沿使之锁存<br /><br />不知道我这样的解释是否恰当.<br /><br />书上对IO0CLR&nbsp;=&nbsp;HC595CS的解释一直都有问题,在学校的时候曾向工程师提过.不过相信很快就能改过来的.请你们放心.
zlgARM 发表于 2007-8-1 07:46 | 显示全部楼层

RE

&nbsp;&nbsp;&nbsp;<font color=#FF0000>“MSendData()函数的SSEL激活是不是指IO0CLR&nbsp;=&nbsp;HC595CS,如果是的话,那我只能告诉你书上的解释是错的”</font><br />&nbsp;&nbsp;&nbsp;&nbsp;书上并没有解释SSEL激活是IO0CLR&nbsp;=&nbsp;HC595。书上既然都说了是用GPIO脚来接到595的RCLK,也就不必提到SPI的SSEL功能。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;如果把<br />&nbsp;&nbsp;“<br />&nbsp;&nbsp;&nbsp;&nbsp;IO0CLR&nbsp;|=&nbsp;HC595_CS;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;片选<br />&nbsp;&nbsp;&nbsp;&nbsp;……<br />&nbsp;&nbsp;&nbsp;&nbsp;IO0SET&nbsp;|=&nbsp;HC595_CS;<br />&nbsp;&nbsp;&nbsp;”<br />&nbsp;&nbsp;&nbsp;&nbsp;改为:<br />&nbsp;&nbsp;&nbsp;“&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;IO0CLR&nbsp;|=&nbsp;HC595_RCLK;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;……<br />&nbsp;&nbsp;&nbsp;&nbsp;IO0SET&nbsp;|=&nbsp;HC595_RCLK;<br />&nbsp;&nbsp;&nbsp;&nbsp;”&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;也许会好一些。<br /><br />&nbsp;&nbsp;&nbsp;总结:<br />&nbsp;&nbsp;&nbsp;1、处理器并没有用SSEL脚去驱动74hc595,把GPIO脚称为SSEL脚是混淆了概念,容易造成误解;然,书上并没有把产生RCLK上升沿的脚称呼为SSEL脚,这是火光老师的说法。<br />&nbsp;&nbsp;&nbsp;2、把RCLK脚称呼为CS脚。我个人认为问题不大。<br />&nbsp;&nbsp;&nbsp;&nbsp;2300教材里,除《深入浅出》外我们还有配套的技术笔记,看了技术笔记后自然能理解为何不用SSEL功能而用GPIO去产生时序。理解这一点后,再回头考虑如何用SPI驱动74HC595,自然心里亮堂。<br />&nbsp;&nbsp;&nbsp;这个贴给人以启发,如何甄别出那些重要的知识点,而以这些知识点为核心去规划技术笔记?这是我们要在2400项目里深入思考的问题。2300项目的教材相对于以前的教材,在质量上是一个比较大的飞跃;2400项目的教材,相对于2300的教材,我想,仍然有再度飞跃的空间,请大家拭目以待。
 楼主| 火光 发表于 2007-8-1 09:43 | 显示全部楼层

wlsui :你的解释很有道理!

<br />&nbsp;&nbsp;我在ZLGARM&nbsp;在5楼给我答复后,自己去看了看74HC595,已经明白原因了.<br /><br />&nbsp;&nbsp;实际上74HC595不象纯粹的&nbsp;SPI器件,但也可以用用.<br /><br />&nbsp;&nbsp;&quot;<br />&nbsp;&nbsp;IO0CLR&nbsp;=&nbsp;HC595CS;<br />&nbsp;&nbsp;...<br />&nbsp;&nbsp;...<br />&nbsp;&nbsp;IO0SET&nbsp;=&nbsp;HC595CS<br />&nbsp;&nbsp;&quot;<br />&nbsp;&nbsp;结构<br />&nbsp;&nbsp;并不是为了产生一个低电平的片选信号,而是为了产生一个上边沿打入信号.<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;我开始时候主要是没有仔细看74HC595的电路特性,以为它就是一个一般的SPI器件呢!<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;谢谢wlsui的答复!<br />&nbsp;&nbsp;
wlsui 发表于 2007-8-1 10:35 | 显示全部楼层

Re:

to&nbsp;zlgARM:<br />确实,说SSEL激活是IO0CLR&nbsp;=&nbsp;HC595CS并不恰当,书上也没有这么解释过,而且,书上的HC595CS引脚一般都是用P0.29,P0.29也根本没有SSEL功能.<br />但要将IO0CLR&nbsp;=&nbsp;HC595CS解释为片选,值得商榷<br /><br />to&nbsp;火光:<br />你说&quot;实际上74HC595不象纯粹的&nbsp;SPI器件,但也可以用用&quot;<br />实际上,74HC595根本上就不是SPI器件,只是一个串转并的芯片而已,只不过串行输入的时序可以用SPI的时序来驱动而已.<br />如果你去看74HC595的数据手册,你会发现,人家从第一个字到最后一个字都没有出现&quot;SPI&quot;字样<br />这也就是我认为将IO0CLR&nbsp;=&nbsp;HC595CS解释为片选不是很恰当的一个原因.既然是SPI的主机来片选从机,也就要求从机也是SPI接口的,可实际上并不是.既然不是SPI接口的,那又怎么能叫片选呢?<br />如果为片选,那就是说,只要我一直将片选信号保持有效(低电平),那我就能一直发数据(连续多字节),并且操作是成功的,可事实并不然.为什么非得要在每发送一个字节后面将CS端置高才能发送成功呢?.<br />
wlsui 发表于 2007-8-1 10:42 | 显示全部楼层

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

放假啊,睡觉^--^
 楼主| 火光 发表于 2007-8-1 11:56 | 显示全部楼层

对了,wlsui说的对.

<br />&nbsp;&nbsp;主要是74HC595本来就不是个SPI器件,,,
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

75

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部