打印
[ZLG-ARM]

Lpc2106的spi接收数据问题

[复制链接]
2082|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tiger84|  楼主 | 2007-9-3 21:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//表现:数据有时读不出来
//
//大侠看一下,我的SPI读数据是否有问题
/****************************************************************************
* 名称:SPIRead()
* 功能:SPI总线接收数据。
* 入口参数:无
* 出口参数:返回值为读取的数据
****************************************************************************/
uint8 SPIRead(void)
{    
    uint8 readbak;
          
    // Wait for a data byte reception
    while(0==(SPI_SPSR&0x80));
    // 返回接收到的数据
    
    readbak = SPI_SPDR;

      
   
    return readbak;
}

相关帖子

沙发
zlgARM| | 2007-9-3 23:07 | 只看该作者

tiger84

您好:
   没有产生读数据的时钟,如何能读出数据?请牢记,您发送一个时钟边沿,才能换回一位数据。

使用特权

评论回复
板凳
tiger84|  楼主 | 2007-9-4 09:01 | 只看该作者

谢谢zlgARM的答复

LPC2106的时钟沿不是配置好相关寄存器自己就产生了吗?还是我的理解有错误
SPI程序如下。大侠能否看一下这个程序是否有问题。现在就是和另外一个带SPI的器件通讯有时正常,有时少收到数,有时压根就收不到。

#define   Wireless_CS       0x00080000             /* P0.19口为Wireless_CS的片选 */

/****************************************************************************
* 名称:SPI_CSN_Low(),SPI_CSN_High()
* 功能:片选
* 入口参数:无
* 出口参数:无
****************************************************************************/
void SPI_CSN_Low(void)
{
  IOCLR = Wireless_CS;                
}

void SPI_CSN_High(void)
{
  IOSET = Wireless_CS;
}
/****************************************************************************
* 名称:SPIInit()
* 功能:初始化SPI接口,设置为主机。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void SPIInit(void)

    PINSEL0 = (PINSEL0 & 0xffff00ff) | 0x00005500;    // 设置SPI管脚连接
    IODIR = IODIR| Wireless_CS;
    SPI_SPCCR = 0xff;             // 设置SPI时钟分频
    SPI_SPCR = 0x30;             // 设置SPI接口模式,MSTR=1,CPOL=1,CPHA=0,LSBF=0
}


/****************************************************************************
* 名称:SPIWrite()
* 功能:向SPI总线发送数据。
* 入口参数:Spibak        待发送的数据
* 出口参数:返回值为读取的数据
****************************************************************************/
void  SPIWrite(uint8 Spibak)
{    
   SPI_SPDR = Spibak;
   
   while( 0==(SPI_SPSR&0x80) );        // 等待SPIF置位,即等待数据发送完毕

  
}


/****************************************************************************
* 名称:SPIRead()
* 功能:SPI总线接收数据。
* 入口参数:无
* 出口参数:返回值为读取的数据
****************************************************************************/
uint8 SPIRead(void)
{    
    uint8 readbak;
          
    // Wait for a data byte reception
    while(0==(SPI_SPSR&0x80));
    // 返回接收到的数据
    
    readbak = SPI_SPDR;
     
   
    return readbak;
}

使用特权

评论回复
地板
zlgARM| | 2007-9-4 10:20 | 只看该作者

tiger84

您好:
  没错,时钟沿确实是由CPU自动产生。但是,若您不发送数据,怎么会有时钟沿?建议您在SPI数据发送函数里,将“SPI_SPDR = Spibak;”这句删除,看看SPI总线上还有没有时钟沿产生。 

使用特权

评论回复
5
tiger84|  楼主 | 2007-9-4 17:53 | 只看该作者

谢谢啊

我觉得应该不是SPI的问题,是和一个无线模块CC1100相连,用示波器看了一下,可能是速率匹配的问题,继续研究中---

使用特权

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

本版积分规则

101

主题

862

帖子

0

粉丝