s12xdp512的SPI模块中SPI0SR寄存器的SPTEF清零问题
- UID
- 846090
|
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都是无效.
跪求高人指导...谢谢.... |
|
|
|
|
|
- UID
- 846090
|
难道不能将数据传送给SPI0DR寄存器,再从寄存器里面读出数据吗?这个问题困了一下午了...请求指导 |
|
|
|
|
|
- UID
- 846090
|
我的初始化函数:
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 |
|
|
|
|
|
- UID
- 846090
|
另外附一个今天测试的程序...依然调不通,不知道问题出在了哪里...
代码如下:
#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);
} |
|
|
|
|
|
- UID
- 846090
|
OK...问题已解决...
SPI的数据寄存器有一位寄存器,一定是一个影子寄存器...如果想要实现一个spi模块的自发自收的话,一定要把这个模块的MOSI和MISO连在一起...
SPI是一个同步通信...终于搞清楚原理了... |
|
|
|
|
|