[ZLG-ARM] Lpc2106的spi接收数据问题

[复制链接]
2783|4
 楼主| tiger84 发表于 2007-9-3 21:52 | 显示全部楼层 |阅读模式
//表现:数据有时读不出来<br />//<br />//大侠看一下,我的SPI读数据是否有问题<br />/****************************************************************************<br />*&nbsp;名称:SPIRead()<br />*&nbsp;功能:SPI总线接收数据。<br />*&nbsp;入口参数:无<br />*&nbsp;出口参数:返回值为读取的数据<br />****************************************************************************/<br />uint8&nbsp;SPIRead(void)<br />{&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;readbak;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Wait&nbsp;for&nbsp;a&nbsp;data&nbsp;byte&nbsp;reception<br />&nbsp;&nbsp;&nbsp;&nbsp;while(0==(SPI_SPSR&0x80));<br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;返回接收到的数据<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;readbak&nbsp;=&nbsp;SPI_SPDR;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;readbak;<br />}<br />
zlgARM 发表于 2007-9-3 23:07 | 显示全部楼层

tiger84

您好:<br />&nbsp;&nbsp;&nbsp;没有产生读数据的时钟,如何能读出数据?请牢记,您发送一个时钟边沿,才能换回一位数据。
 楼主| tiger84 发表于 2007-9-4 09:01 | 显示全部楼层

谢谢zlgARM的答复

LPC2106的时钟沿不是配置好相关寄存器自己就产生了吗?还是我的理解有错误<br />SPI程序如下。大侠能否看一下这个程序是否有问题。现在就是和另外一个带SPI的器件通讯有时正常,有时少收到数,有时压根就收不到。<br /><br />#define&nbsp;&nbsp;&nbsp;Wireless_CS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00080000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;P0.19口为Wireless_CS的片选&nbsp;*/<br /><br />/****************************************************************************<br />*&nbsp;名称:SPI_CSN_Low(),SPI_CSN_High()<br />*&nbsp;功能:片选<br />*&nbsp;入口参数:无<br />*&nbsp;出口参数:无<br />****************************************************************************/<br />void&nbsp;SPI_CSN_Low(void)<br />{<br />&nbsp;&nbsp;IOCLR&nbsp;=&nbsp;Wireless_CS;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />}<br /><br />void&nbsp;SPI_CSN_High(void)<br />{<br />&nbsp;&nbsp;IOSET&nbsp;=&nbsp;Wireless_CS;<br />}<br />/****************************************************************************<br />*&nbsp;名称:SPIInit()<br />*&nbsp;功能:初始化SPI接口,设置为主机。<br />*&nbsp;入口参数:无<br />*&nbsp;出口参数:无<br />****************************************************************************/<br />void&nbsp;SPIInit(void)<br />{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;PINSEL0&nbsp;=&nbsp;(PINSEL0&nbsp;&&nbsp;0xffff00ff)&nbsp;|&nbsp;0x00005500;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置SPI管脚连接<br />&nbsp;&nbsp;&nbsp;&nbsp;IODIR&nbsp;=&nbsp;IODIR|&nbsp;Wireless_CS;<br />&nbsp;&nbsp;&nbsp;&nbsp;SPI_SPCCR&nbsp;=&nbsp;0xff;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置SPI时钟分频<br />&nbsp;&nbsp;&nbsp;&nbsp;SPI_SPCR&nbsp;=&nbsp;0x30;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置SPI接口模式,MSTR=1,CPOL=1,CPHA=0,LSBF=0<br />}<br /><br /><br />/****************************************************************************<br />*&nbsp;名称:SPIWrite()<br />*&nbsp;功能:向SPI总线发送数据。<br />*&nbsp;入口参数:Spibak&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;待发送的数据<br />*&nbsp;出口参数:返回值为读取的数据<br />****************************************************************************/<br />void&nbsp;&nbsp;SPIWrite(uint8&nbsp;Spibak)<br />{&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;SPI_SPDR&nbsp;=&nbsp;Spibak;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;while(&nbsp;0==(SPI_SPSR&0x80)&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;等待SPIF置位,即等待数据发送完毕<br /><br />&nbsp;&nbsp;<br />}<br /><br /><br />/****************************************************************************<br />*&nbsp;名称:SPIRead()<br />*&nbsp;功能:SPI总线接收数据。<br />*&nbsp;入口参数:无<br />*&nbsp;出口参数:返回值为读取的数据<br />****************************************************************************/<br />uint8&nbsp;SPIRead(void)<br />{&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;readbak;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Wait&nbsp;for&nbsp;a&nbsp;data&nbsp;byte&nbsp;reception<br />&nbsp;&nbsp;&nbsp;&nbsp;while(0==(SPI_SPSR&0x80));<br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;返回接收到的数据<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;readbak&nbsp;=&nbsp;SPI_SPDR;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;readbak;<br />}
zlgARM 发表于 2007-9-4 10:20 | 显示全部楼层

tiger84

您好:<br />&nbsp;&nbsp;没错,时钟沿确实是由CPU自动产生。但是,若您不发送数据,怎么会有时钟沿?建议您在SPI数据发送函数里,将“SPI_SPDR&nbsp;=&nbsp;Spibak;”这句删除,看看SPI总线上还有没有时钟沿产生。&nbsp;
 楼主| tiger84 发表于 2007-9-4 17:53 | 显示全部楼层

谢谢啊

我觉得应该不是SPI的问题,是和一个无线模块CC1100相连,用示波器看了一下,可能是速率匹配的问题,继续研究中---
您需要登录后才可以回帖 登录 | 注册

本版积分规则

101

主题

862

帖子

0

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