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

请教SPI通信问题

请教SPI通信问题

你好,我想s12通过SPI通信,但似乎有点问题,程序如下~
void SPIInit(void){
SPI0BR =0b00000001;//clock divisor is 2
SPI0CR2=0b00000010; // SS is not used
SPI0CR1=0b01010000; //as master
}
char getchar_spi0(void)
{
unsigned char te;
while(!(SPI0SR_SPTEF)); /* wait until write is permissible */
SPI0DR = 0x00; /* trigger 8 SCK pulses to shift in data */
while(!(SPI0SR_SPIF)); /* wait until a byte has been shifted in */
te=SPI0DR; // clear the spif flag.
return te; /* return the character */
}

void putchar_spi0 (char cx)
{ char temp;
while(!(SPI0SR_SPTEF)); /* wait until write is permissible */
SPI0DR = cx; /* output the byte to the SPI */
while(!(SPI0SR_SPIF)); /* wait until write operation is complete */
temp=SPI0DR; // clear the spif flag.
}


在Main中是:
while(1){
putchar_spi0(0x0f);


temp=getchar_spi0();
}
在线调试的时候是可以执行的,但用示波器在SCK口没有信号输出,MOSI口也没有信号输出,而且SPI0DR一直都是0,不知道是为什么呢?
假如我在输出0x0f,是不是应该可以在M0SI口看到一定的波形呢?

[此贴子已经被作者于2007-4-24 16:26:31编辑过]

主要的问题可能是,清SPIF的动作应该是先读SPI0SR,再接着读SPI0DR,所以把程序改成这样就可以了:

void SPIInit(void){
SPI0BR =0b00000001;//clock divisor is 2
SPI0CR2=0b00000010; // SS is not used
SPI0CR1=0b01010000; //as master
}

char getchar_spi0(void)
{
unsigned char te;
while(!(SPI0SR_SPTEF)); /* wait until write is permissible */
SPI0DR = 0x00; /* trigger 8 SCK pulses to shift in data */
while(!(SPI0SR_SPIF)); /* wait until a byte has been shifted in */
te=SPI0SR;
te=SPI0DR; // clear the spif flag.
return te; /* return the character */
}

void putchar_spi0 (char cx)
{
char temp;
while(!(SPI0SR_SPTEF)); /* wait until write is permissible */
SPI0DR = cx; /* output the byte to the SPI */
while(!(SPI0SR_SPIF)); /* wait until write operation is complete */
temp=SPI0SR;
temp=SPI0DR; // clear the spif flag.
}




void main(void) {
char temp;

/* put your own code here */
EnableInterrupts;

SPIInit();

while(1)
{
putchar_spi0(0x0f);

temp=getchar_spi0();
}

for(;;) {} /* wait forever */
/* please make sure that you never leave this function */
}
海纳百川  有容乃大
楼主的程序没有错误,只要你把debug那个窗口里面的data1,memory关掉之后就可以运行了。data1,memory也会访问SR寄存器,在访问的过程中就会把SPIF位清0,所以程序总在while(!(SPI0SR_SPIF))运行,关掉data1,memory之后就避免了SPIF意外清0。这也算D系列的小Bug吧。这个论坛里面很多关于SPI的问题,其实都是一样的解决方法。
这个应该不会吧。我调试的时候就是所有窗口都开着的,但程序运行正常,没出现问题。
海纳百川  有容乃大
会的,你真接电路就会遇见这样的问题,我找了5天原因,而且发了两个求助“哪位大侠可以发SPI的住程序”的求助,当时您让我用PE,可是自己不会。版主能写点中文的PE用法吗?主要是怎么的流程。我看光一个等下面就有很多generate,noe generate 的,英文的也不想看。
我是用硬件电路调试的,并没有发现这个问题。也许与软件版本有关?有空时我再试试。关于PE的中文使用说明,要写的话也不是一两天的事情。不过有空时我可以试试看。
海纳百川  有容乃大
希望能早点见到您的大作,期待中。。。
我也是直接用硬件电路调试的,但是关闭那两个窗口,那句还是过去不了,飞思卡尔的售后说在线仿真,用F11逐步调试在SPIF标志上会出问题的。但没说怎么解决。斑竹是怎么调试通过那一句的呢?
也许单步调试时会有这个问题。我是让它全速运行,然后看波形,是正确的。你用我给你的程序试试。
海纳百川  有容乃大
也希望早点看到斑竹的P&E使用的教程或手册哦,特别是你前面提到的使用他生成参考代码的方法。期待中
DING
应网友的要求,写了一份中文的PE使用示例说明,上传如下。匆忙中必有纰漏与不尽之处,望各位网友雅正。
http://bbs.chinaecnet.com/uploadImages/Paper.rar
海纳百川  有容乃大
看了斑竹的大作,谢谢了!
在这里对斑竹对大家的支持表示感谢!
谢谢
好好学习 天天向上
返回列表