[ZLG-ARM] LPC2210的SPI做从机时遇到问题,周工帮忙

[复制链接]
3812|2
 楼主| kalehz 发表于 2007-8-17 14:34 | 显示全部楼层 |阅读模式
我在做nRF24E1和LPC2210通过SPI接口通信的实验。nRF24E1的SPI只能用作主SPI,所以LPC2210的SPI选作从模式。<br />nRF24E1的SPI通信的格式为:当把数据写入SPI_DATA寄存器时,数据的高位(MSB)先移出。原文是这样描述的:The&nbsp;8&nbsp;bits&nbsp;of&nbsp;SPI_DATA&nbsp;register&nbsp;are&nbsp;clock&nbsp;out&nbsp;on&nbsp;SDO&nbsp;with&nbsp;msb&nbsp;first.Simultaneously&nbsp;8&nbsp;bits&nbsp;from&nbsp;SDI&nbsp;are&nbsp;clocked&nbsp;into&nbsp;SPI_DATA&nbsp;register.时钟是高有效,原文描述为:Output&nbsp;data&nbsp;is&nbsp;shifted&nbsp;on&nbsp;negedge&nbsp;SCK,and&nbsp;input&nbsp;data&nbsp;is&nbsp;read&nbsp;on&nbsp;posedge&nbsp;SCK.<br />因此,我对LPC2210的S1PCR寄存器的配置如下:<br />S1PCR&nbsp;=&nbsp;(0&nbsp;&lt&lt&nbsp;7)|&nbsp;&nbsp;&nbsp;&nbsp;//SPIE&nbsp;禁能<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(0&nbsp;&lt&lt&nbsp;6)|&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;LSBF&nbsp;MSB&nbsp;First<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(0&nbsp;&lt&lt&nbsp;5)|&nbsp;&nbsp;&nbsp;&nbsp;//MSTR&nbsp;&nbsp;从模式<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(0&nbsp;&lt&lt&nbsp;4)|&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;CPOL&nbsp;&nbsp;SCK高有效<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(0&nbsp;&lt&lt&nbsp;3);&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;CPHA&nbsp;&nbsp;数据在SCK的第一个时钟沿采样。传输从SSEL信号激活时开始,并在SSEL信号无效时结束。<br />SPI1引脚配置如下:<br />PINSEL1&nbsp;=&nbsp;(PINSEL1&nbsp;&&nbsp;~0x3fc)&nbsp;|&nbsp;0x2a8;&nbsp;//&nbsp;配置SPI1引脚<br />主SPI(nRF24E1)的读写函数没有问题,因为一直用它配置RF前端的。函数如下:<br />unsigned&nbsp;char&nbsp;SpiReadWrite(uint8&nbsp;b)<br />{/*exif.5&nbsp;internal&nbsp;spi&nbsp;module&nbsp;send&nbsp;or&nbsp;received&nbsp;8bits,and&nbsp;is&nbsp;ready&nbsp;for&nbsp;a&nbsp;new&nbsp;command&nbsp;,must&nbsp;be&nbsp;clear&nbsp;by&nbsp;software*/<br />&nbsp;&nbsp;&nbsp;&nbsp;EXIF&nbsp;&=&nbsp;~0x20;&nbsp;&nbsp;&nbsp;//&nbsp;Clear&nbsp;SPI&nbsp;interrupt,&nbsp;1101&nbsp;1111<br />&nbsp;&nbsp;&nbsp;&nbsp;SPI_DATA&nbsp;=&nbsp;b;&nbsp;&nbsp;&nbsp;//&nbsp;Move&nbsp;byte&nbsp;to&nbsp;send&nbsp;to&nbsp;SPI&nbsp;data&nbsp;register<br />&nbsp;&nbsp;&nbsp;&nbsp;while((EXIF&nbsp;&&nbsp;0x20)&nbsp;==&nbsp;0x00);&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Wait&nbsp;until&nbsp;SPI&nbsp;hs&nbsp;finished&nbsp;transmitting,&nbsp;when&nbsp;exif.5=0*/<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;SPI_DATA;<br />}<br />从机SPI(LPC2210)的读写函数如下:<br />void&nbsp;SendData&nbsp;(uint8&nbsp;data)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;rValue1,rValue2;<br />&nbsp;&nbsp;&nbsp;&nbsp;S1PDR&nbsp;=&nbsp;data;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(0&nbsp;==(S1PSR&0x80));&nbsp;//等待SPIF置位,即等待数据发送完毕<br />&nbsp;&nbsp;&nbsp;&nbsp;rValue1&nbsp;=&nbsp;S1PSR;&nbsp;&nbsp;&nbsp;//以下两个语句是为了让SPIF清零<br />&nbsp;&nbsp;&nbsp;&nbsp;rValue2&nbsp;=&nbsp;S1PDR;<br />}<br />char&nbsp;&nbsp;RcvData(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;rValue1,rValue2;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(0&nbsp;==&nbsp;(S1PSR&0x80));<br />&nbsp;&nbsp;&nbsp;&nbsp;rValue1&nbsp;=&nbsp;S1PSR;<br />&nbsp;&nbsp;&nbsp;&nbsp;rValue2&nbsp;=&nbsp;S1PDR;<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(rValue2);<br />}<br />现在的问题是:1.从机SPI要向主机发送数据,从机先通过中断通知主机,主机响应中断后转入主SpiReadWrite()函数。可以看到主SPI接收到了从机发送的数据是正确的,但是从机接收到的数据却是不定的。SPI操作是移位操作,主机SPI接收到从机的数据的同时,从机也应该接收到主机的发送的数据,是不是这样的?要是这样,为什么从机接收到的不正确呢?<br />2.倘若我不管现在从SPI接收到的数据是否正确,第二步,我要用从SPI接收数据,即用RcvData()函数接收数据。可以看到主SPI确实发送数据了,而且可以保证主SPI在进入SpiReadWrite()函数之前,从SPI已经进入RcvData()函数,正在等待接收,即执行while(0&nbsp;==&nbsp;(S1PSR&0x80));,而程序却死掉了。<br />我实验了好多方法,也没有成功,不知道问题出现在那里,如果有必要的话,我可以把全部程序都上载上来。<br />希望周工能帮忙,谢谢!!!
zuan520 发表于 2010-10-14 18:00 | 显示全部楼层
1# kalehz 楼主,我有一个问题,你的从机怎么通知主机的,通过spi吗?主机要是没有发数据给从机的话,从机是没有时钟给主机发数据的,怎么发这个通知信息呢?
FVJFIFE 发表于 2010-10-14 22:26 | 显示全部楼层
关注中
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

13

帖子

0

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