飛思卡爾的MC9S08QE128的SPI中斷問(wèn)題
我在使用QE128的SPI2模塊時(shí),用的是中斷方式收發(fā),在初始時(shí)將SPIxC1寄存器的SPTIE位(SPI Transmit Interrupt Enable)置1。但無(wú)數(shù)據(jù)傳輸時(shí),程序始終會(huì)由于SPIxS寄存器的SPTEF位(SPI Transmit Buffer Empty Flag)置位而觸發(fā)中斷。中斷里我每次都會(huì)讀取SPIxS寄存器來(lái)清除該標(biāo)志,但又會(huì)被程序自動(dòng)置位。請(qǐng)問(wèn)有用過(guò)SPI中斷的朋友指導(dǎo)下,謝謝!附上程序如下:
void SPI2_Init(void)
{??
? ? SPI2C1 = 0x00;
? ? SPI2C2 = 0x00;
? ?
? ? // SPIE=1; SPE=1; SPTIE=1; MSTR=1; CPOL=1; CPHA=1; SSOE=0; LSBFE=0
SPI2C1 = 0xFC;
// bit7=0; bit6=0; bit5=0; MODFEN=0; BIDIROE=1; bit2=0; SPISWAI=1; SPC0=0
SPI2C2 = 0x0A;
SPI2BR = 0x22;
}
void SPI2_Interrupt(void)
{
uint8 tmp;
uint8 tda;
tmp=SPI2S;
tda=SPI2D;
if(tmp & 0x80)? ?? ?? ???//SPRF=1, SPI Read Buffer Full Flag
{
? ? if(rbufc) {
? ?? ?SPI2_SerFlag |= CHAR_IN_RX;
? ?? ?rbufc--;
? ?? ?*rbuf++ = tda;
? ?? ?SPI2D = 0xFF;? ?? ? //Dummy Byte
? ?? ?if(rbufc == 0) {
? ?? ???CS_CLR;? ?? ?? ???//Chip Select high
? ?? ???SPI2_SerFlag &= ~CHAR_IN_RX;
? ?? ?}
? ? }
}
else if(tmp & 0x20)? ?? ?//SPTEF=1, SPI Transmit Buffer Empty Flag
{
? ? if(tbufc) {? ???//sending data
? ?? ?SPI2_SerFlag |= CHAR_IN_TX;
? ?? ?tbufc--;
? ?? ?SPI2D = tbuf[tbufc];? ?? ???
? ? }
? ? else {
? ?? ?if(tbuf[0] != 0xFF)? ?//Don't wait for reading data
? ?? ???CS_CLR;? ?? ?? ?? ? //Chip Select high
? ?? ?SPI2_SerFlag &= ~CHAR_IN_TX;
? ? }
}
}
提問(wèn)者:sdvywye
地點(diǎn):-
瀏覽次數(shù):1086
提問(wèn)時(shí)間:12-21 14:32
我有更好的答案