请教MC9S08AW32使用SPI时发送器空标志一直为1,清不掉怎么办?
 
- UID
- 104380
- 性别
- 男
|
SPTEF到底是一直为1,还是一直为0?你的标题和下面的描述好像是矛盾的。 |
|
|
|
|
|
 
- UID
- 104380
- 性别
- 男
|
|
|
|
|
|
 
- UID
- 104380
- 性别
- 男
|
不知道你是用软件放置还是硬件调试。如果是用软件仿真,好像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 */
}
注意我是用别的芯片型号试的,所以寄存器的名称要改一下。 |
|
|
|
|
|
 
- UID
- 104380
- 性别
- 男
|
当然可以。执行完SPIS; SPID = 0x55;两句之后可以看到SPTEF被清零了。
|
|
|
|
|
|
 
- UID
- 104380
- 性别
- 男
|
我用的是QG8,它与AW的SPI模块是一样的。另外,即使没有看到SPTEF被清零,只要程序能一直在跑,数据SPI一直在发送数据,那就没问题。 |
|
|
|
|
|
 
- UID
- 104380
- 性别
- 男
|
实际上SPTEF并不是发送完成标志,而是发送缓冲空标志。如果没有数据正在发送,数据从缓冲转移到发送移位寄存器的速度是非常快的。所以有可能在调试过程中看不到SPTEF变为0的状态。 |
|
|
|
|
|
 
- UID
- 104380
- 性别
- 男
|
在硬件调试时,SPIF必须通过连续读SPISR和SPIDR寄存器来清零,所以不能直接在数据窗口里修改。另外,在调试时,应为BDM会去读这些寄存器,它的读操作就把SPIF清零了。所以有时单步调试时会看到SPIF的判断出问题。但是如果在SPIF的判断后设置一个断点,就可以看到它还是能正常执行的。 |
|
|
|
|
|
 
- UID
- 104380
- 性别
- 男
|
SPRF表示接收完成,实际上也就是发送完成标志。SPI的发送和接收是同步的。 |
|
|
|
|
|