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

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

SPTEF到底是一直为1,还是一直为0?你的标题和下面的描述好像是矛盾的。
海纳百川  有容乃大
把你的整个project打包贴出来看看吧。
海纳百川  有容乃大
不知道你是用软件放置还是硬件调试。如果是用软件仿真,好像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; SPID = 0x55;两句之后可以看到SPTEF被清零了。
海纳百川  有容乃大
我用的是QG8,它与AW的SPI模块是一样的。另外,即使没有看到SPTEF被清零,只要程序能一直在跑,数据SPI一直在发送数据,那就没问题。
海纳百川  有容乃大
实际上SPTEF并不是发送完成标志,而是发送缓冲空标志。如果没有数据正在发送,数据从缓冲转移到发送移位寄存器的速度是非常快的。所以有可能在调试过程中看不到SPTEF变为0的状态。
海纳百川  有容乃大
在硬件调试时,SPIF必须通过连续读SPISR和SPIDR寄存器来清零,所以不能直接在数据窗口里修改。另外,在调试时,应为BDM会去读这些寄存器,它的读操作就把SPIF清零了。所以有时单步调试时会看到SPIF的判断出问题。但是如果在SPIF的判断后设置一个断点,就可以看到它还是能正常执行的。
海纳百川  有容乃大
SPRF表示接收完成,实际上也就是发送完成标志。SPI的发送和接收是同步的。
海纳百川  有容乃大
返回列表