请教MC9S08AW32使用SPI时发送器空标志一直为1,清不掉怎么办?
- UID
- 104380
- 性别
- 男
|
SPTEF到底是一直为1,还是一直为0?你的标题和下面的描述好像是矛盾的。 |
|
|
|
|
|
- UID
- 143639
- 性别
- 男
|
请教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编辑过] |
|
|
|
|
|
- UID
- 143639
- 性别
- 男
|
上面的程序结果是SPTEF一直为1.
我是说如果不加红色那句,进入这个判断两次后,SPTEF就一直为0了。再也进不来了。 |
|
|
|
|
|
- UID
- 104380
- 性别
- 男
|
|
|
|
|
|
- UID
- 143639
- 性别
- 男
|
谢谢strongchen,帮看下。http://bbs.chinaecnet.com/uploadImages/test-spi-aw.rar |
|
|
|
|
|
- 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
- 143639
- 性别
- 男
|
谢谢.请问用硬件仿真可以单步执行吗,因为我用硬件单步时,结果SPIS_SPTEF还是一直为1. |
|
|
|
|
|
- UID
- 104380
- 性别
- 男
|
当然可以。执行完SPIS; SPID = 0x55;两句之后可以看到SPTEF被清零了。
|
|
|
|
|
|
- UID
- 143639
- 性别
- 男
|
可是我用AW32硬件仿真没看到清零,数据可以用示波器看到已经输出了.
去掉delay(2);
换成 while(!SPI1S_SPTEF) __RESET_WATCHDOG();后,SPI1S的变化就是A0和20,没见过为零.
请问您用的是GP32吧,能不能用GT32或AW32试下啊,这两种差不多,GP的差好多啊. |
|
|
|
|
|
- UID
- 104380
- 性别
- 男
|
我用的是QG8,它与AW的SPI模块是一样的。另外,即使没有看到SPTEF被清零,只要程序能一直在跑,数据SPI一直在发送数据,那就没问题。 |
|
|
|
|
|
- UID
- 143639
- 性别
- 男
|
谢谢,我是怕接收数据时有问题.我还没查看收数据,有问题再向您请教. |
|
|
|
|
|
- UID
- 104380
- 性别
- 男
|
实际上SPTEF并不是发送完成标志,而是发送缓冲空标志。如果没有数据正在发送,数据从缓冲转移到发送移位寄存器的速度是非常快的。所以有可能在调试过程中看不到SPTEF变为0的状态。 |
|
|
|
|
|
- UID
- 165583
- 性别
- 男
|
我用的是9S12X,在软件调试时,可以在Data窗口和Inspect窗口里面修改SPTEF和SPIF这两个位的值,可惜的是在硬件调试时SPIF修改不了。我的方法是直接修改CPU里面的PC值,跳过这一行语句。 |
|
|
|
|
|
- UID
- 104380
- 性别
- 男
|
在硬件调试时,SPIF必须通过连续读SPISR和SPIDR寄存器来清零,所以不能直接在数据窗口里修改。另外,在调试时,应为BDM会去读这些寄存器,它的读操作就把SPIF清零了。所以有时单步调试时会看到SPIF的判断出问题。但是如果在SPIF的判断后设置一个断点,就可以看到它还是能正常执行的。 |
|
|
|
|
|
- UID
- 143639
- 性别
- 男
|
"实际上SPTEF并不是发送完成标志,而是发送缓冲空标志。"
那这个片子没有移位结束标志,我怎样判断8位移位结束呢?因为我要在移位结束后给74HC595一个信号,告诉它可以输出到显示了。
还是移位结束后单片机才会执行下一条语句?还是我自己要加个延时? |
|
|
|
|
|