首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

s12xdp512的SPI模块中SPI0SR寄存器的SPTEF清零问题

s12xdp512的SPI模块中SPI0SR寄存器的SPTEF清零问题

unsigned char  Data[8];
       for(Number=0x00u;Number<8u;Number++)
       {
        while((SPI0SR&0x20u)==0u);  /*等待SPI0数据寄存器为空*/
        SPI0DR=0x11u;
        _asm(nop);
        _asm(nop);
        while((SPI0SR&0x80u)==0u);     /*等SPIF=1时,数据发送完毕*/   
        Data[Number]=SPI0DR;
       }

现在的状态是这样的: SPI0SR=0x20u(也就是说SPTEF位一直为1),往SPI0DR里面写0x11根本不起作用,SPI0DR的值还是0x00...所以程序就一直等待SPIF位为1...整个过程SPTEF一直都是1,所以我怀疑是我的清零程序不正确...都是我认真读了datasheet,还是不知道问题出在了哪里...我个人觉得是SPTEF清零没做好,导致不管怎么样写SPI0DR都是无效.
跪求高人指导...谢谢....
难道不能将数据传送给SPI0DR寄存器,再从寄存器里面读出数据吗?这个问题困了一下午了...请求指导
我的初始化函数:
        SPI0CR1_SPE=1u;   //enable SPI0
        SPI0CR1_SPIE=0u;  //disable interrupt
        SPI0CR1_MSTR=1u;  //master mode
        SPI0CR1_CPOL=0u;
        SPI0CR1_CPHA=1u;                                            
        SPI0CR1_SSOE=1u;  //SS--output
        SPI0CR2_MODFEN=1u;                                    
        SPI0CR2|=0x00u;   //normal mode         
        SPI0BR |=0x00u;   //braud_2
另外附一个今天测试的程序...依然调不通,不知道问题出在了哪里...
代码如下:

#include <hidef.h>      
#include "derivative.h"         
byte a[8]={0};

void SPI_Init(void)
{
  SPI0CR1_SPE=1;
  SPI0CR1_SPIE=0;
  SPI0CR1_MSTR=1;
  SPI0BR=0;           
}

byte SPI_Byte(byte value)
{
  while (!SPI0SR_SPTEF);
  SPI0DR = value;
  while(!(SPI0SR_SPIF));
  return SPI0DR;
}

void main(void)
{
  byte b;
  DisableInterrupts;
  CLKSEL &= 0x7f;
  EnableInterrupts;
  SPI_Init( );
  for(b=0;b<8;b++)
  {
   a[b]=SPI_Byte(b);
  }
  while(1);
}
OK...问题已解决...
SPI的数据寄存器有一位寄存器,一定是一个影子寄存器...如果想要实现一个spi模块的自发自收的话,一定要把这个模块的MOSI和MISO连在一起...
SPI是一个同步通信...终于搞清楚原理了...
返回列表