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

请教MC9S08AW32使用SPI时发送器空标志一直为1,清不掉怎么办?

SPTEF到底是一直为1,还是一直为0?你的标题和下面的描述好像是矛盾的。
海纳百川  有容乃大

请教MC9S08AW32使用SPI时发送器空标志一直为1,清不掉怎么办?

PTED = 0;
PTEDD = 0;
PTED_PTED4 = 1;//外接74HC165和74HC595
PTEDD = 0b11010000;//PE口的4/6/7使能输出,其它口不变
SPI1S;
SPI1D;
SPI1BR = 0x35;//大概50KHz
SPI1C2 = 0x00;
SPI1C1 = 0x10;
SPI1C1_SPE = 1;
for(;;)
{
if(SPI1S_SPTEF)
{
SPI1S;
SPI1D = SendData;
SPI1S; //如果这句不加,2次后SPI1S_SPTEF就一直为0,再也不能输出。
delay(2);//这里应该是while(!SPI1S_SPTEF),但加了上一句后,
//SPI1S_SPTEF一直为1,所以用delay 0.2ms
}

if(SPI1S_SPRF)
{
SPI1S;
SPI1D;
}
}//end

本人第一次接触SPI,是不是哪里写的不对啊?

[此贴子已经被作者于2007-7-24 15:57:58编辑过]

上面的程序结果是SPTEF一直为1.

我是说如果不加红色那句,进入这个判断两次后,SPTEF就一直为0了。再也进不来了。
把你的整个project打包贴出来看看吧。
海纳百川  有容乃大
谢谢strongchen,帮看下。http://bbs.chinaecnet.com/uploadImages/test-spi-aw.rar
不知道你是用软件放置还是硬件调试。如果是用软件仿真,好像SPTEF位确实不能清零;如果用硬件调试,要注意必须清COP。你可以用下面的这段程序试试,我试过了,应该没问题:

void main(void) {

SPIS; /* Read the status register */
SPID; /* Read the device register */
/* SPI1BR: ??=0,SPPR2=1,SPPR1=0,SPPR0=0,??=0,SPR2=0,SPR1=1,SPR0=1 */
SPIBR = 0x35; /* Set the baud rate register */
/* SPI1C2: ??=0,??=0,??=0,MODFEN=0,BIDIROE=0,??=0,SPISWAI=0,SPC0=0 */
SPIC2 = 0x00; /* Configure the SPI port - control register 2 */


/* SPI1C1: SPIE=0,SPE=0,SPTIE=0,Ö÷ģʽMSTR=1,CPOL=1,CPHA=0,SSOE=0,LSBFE=1 */
//SPI1C1 = 0x19; /* Configure the SPI port - control register 1 */
SPIC1 = 0x10;
SPIC1_SPE = 1; /* Enable device */


EnableInterrupts; /* enable interrupts */
/* include your code here */



for(;;)
{


if(SPIS_SPTEF)
{
SPIS;
SPID = 0x55;
//SPIS;
//delay(2);
while(!SPIS_SPTEF) __RESET_WATCHDOG();
}

if(SPIS_SPRF)
{
SPIS;
SPID;

}
__RESET_WATCHDOG(); /* feeds the dog */
} /* loop forever */
/* please make sure that you never leave main */
}

注意我是用别的芯片型号试的,所以寄存器的名称要改一下。
海纳百川  有容乃大
谢谢.请问用硬件仿真可以单步执行吗,因为我用硬件单步时,结果SPIS_SPTEF还是一直为1.
当然可以。执行完SPIS; SPID = 0x55;两句之后可以看到SPTEF被清零了。
海纳百川  有容乃大
可是我用AW32硬件仿真没看到清零,数据可以用示波器看到已经输出了.

去掉delay(2);
换成 while(!SPI1S_SPTEF) __RESET_WATCHDOG();后,SPI1S的变化就是A0和20,没见过为零.

请问您用的是GP32吧,能不能用GT32或AW32试下啊,这两种差不多,GP的差好多啊.
我用的是QG8,它与AW的SPI模块是一样的。另外,即使没有看到SPTEF被清零,只要程序能一直在跑,数据SPI一直在发送数据,那就没问题。
海纳百川  有容乃大
谢谢,我是怕接收数据时有问题.我还没查看收数据,有问题再向您请教.
实际上SPTEF并不是发送完成标志,而是发送缓冲空标志。如果没有数据正在发送,数据从缓冲转移到发送移位寄存器的速度是非常快的。所以有可能在调试过程中看不到SPTEF变为0的状态。
海纳百川  有容乃大
我用的是9S12X,在软件调试时,可以在Data窗口和Inspect窗口里面修改SPTEF和SPIF这两个位的值,可惜的是在硬件调试时SPIF修改不了。我的方法是直接修改CPU里面的PC值,跳过这一行语句。
在硬件调试时,SPIF必须通过连续读SPISR和SPIDR寄存器来清零,所以不能直接在数据窗口里修改。另外,在调试时,应为BDM会去读这些寄存器,它的读操作就把SPIF清零了。所以有时单步调试时会看到SPIF的判断出问题。但是如果在SPIF的判断后设置一个断点,就可以看到它还是能正常执行的。
海纳百川  有容乃大
"实际上SPTEF并不是发送完成标志,而是发送缓冲空标志。"
那这个片子没有移位结束标志,我怎样判断8位移位结束呢?因为我要在移位结束后给74HC595一个信号,告诉它可以输出到显示了。

还是移位结束后单片机才会执行下一条语句?还是我自己要加个延时?
返回列表