|
如下代碼部分只能發(fā)送,不能接收,還請高手指點(diǎn)。
- void Spi_MasterTransmit(void)
- {
- #if 1
- char i;
-
- //是為了等待串行數(shù)據(jù)發(fā)送,發(fā)送結(jié)束前始終在循環(huán),結(jié)束后跳出循環(huán),執(zhí)行后續(xù)代碼。
- if (SpiSending!=0)//有數(shù)據(jù)需要發(fā)送
- {
- if (McpFisrtCmm==0)//第1次發(fā)送
- {
- CLRCS;//SPI口基本在PB口 開啟
- NOP();
- NOP();
- SPDR = SpiTransData[0];
- SpiSendNum=1;//指向下一地址
- McpFisrtCmm=1;
- }
- else
- {
- if (SPSR & (1<<SPIF))//串行發(fā)送結(jié)束后,SPIF置位,中斷//是為了等待串行數(shù)據(jù)發(fā)送,發(fā)送結(jié)束前始終在循環(huán),結(jié)束后跳出循環(huán),執(zhí)行后續(xù)代碼。
- {
- if(SpiSendNum<SpiMaxSend)//SpiMaxSend應(yīng)比量小1 ,SpiMaxSend = 5
- {
-
- SpiReceiveData[SpiSendNum-1]=SPDR;//讀數(shù)據(jù)
- SPDR = SpiTransData[SpiSendNum];//寫數(shù)據(jù)
- SpiSendNum++; //下一筆數(shù)據(jù)
-
- //SpiRcvNum = 0;//讀的時(shí)候?qū)懙臄?shù)據(jù)筆數(shù)為0
- }
- else
- {
- SpiReceiveData[SpiSendNum-1]=SPDR;//讀數(shù)據(jù) //SpiSendNum 需要一個(gè)初始值才行。
- // SpiReceiveData1[SpiRcvNum++]=SPDR;
- //相應(yīng)指示
- SpiMaxSend=0;//傳輸完成
- SpiSending=0;
- McpFisrtCmm=0;//清除標(biāo)示
- SETCS;//停止數(shù)據(jù)發(fā)送
- }
- }
- }
- }else
- {
- CLRCS;//SPI口基本在PB口 開啟
- if ((SPSR & (1<<SPIF)))//串行發(fā)送結(jié)束后,SPIF置位,中斷//是為了等待串行數(shù)據(jù)發(fā)送,發(fā)送結(jié)束前始終在循環(huán),結(jié)束后跳出循環(huán),執(zhí)行后續(xù)代碼。
- {
- //Set_Bit(PORTB, 3);
- ImitShootFlag = 1;
- //SPDR = 0XFF;
- MCP2510Read(RXB0DLC,20);
- for(i=0;i< 20;i++)
- SpiReceiveData1[i]=SpiTransData[i];//SPDR;
- // if(SpiRcvNum > 20)
- // SpiRcvNum = 0;
-
- }
- SETCS;//停止數(shù)據(jù)發(fā)送
- }
-
- #endif
- #if 0
- //是為了等待串行數(shù)據(jù)發(fā)送,發(fā)送結(jié)束前始終在循環(huán),結(jié)束后跳出循環(huán),執(zhí)行后續(xù)代碼。
- if (SpiSending!=0)//有數(shù)據(jù)需要發(fā)送
- {
- if (McpFisrtCmm==0)//第1次發(fā)送
- {
- CLRCS;//SPI口基本在PB口 開啟
- NOP();
- NOP();
- SPDR = SpiTransData[0];
- SpiSendNum=1;//指向下一地址
- McpFisrtCmm=1;
- }
- else
- {
- // 對 SPI 數(shù)據(jù)寄存器寫入數(shù)據(jù)即啟動(dòng)SPI 時(shí)鐘,將8 比特的數(shù)據(jù)移入從機(jī)。
- if (SPSR & (1<<SPIF))//串行發(fā)送結(jié)束后,SPIF置位,中斷//是為了等待串行數(shù)據(jù)發(fā)送,發(fā)送結(jié)束前始終在循環(huán),結(jié)束后跳出循環(huán),執(zhí)行后續(xù)代碼。
- {
- if(SpiSendNum<SpiMaxSend)//SpiMaxSend應(yīng)比量小1 ,SpiMaxSend = 5
- {
- ImitShootFlag = 1;
-
- // SpiReceiveData[SpiSendNum++]=SPDR;//test
- SpiReceiveData[SpiSendNum-1]=SPDR;//讀數(shù)據(jù) //應(yīng)該去掉wanwan //一去掉,SPI就不能初始化
- SPDR = SpiTransData[SpiSendNum];//寫數(shù)據(jù)
- SpiSendNum++; //下一筆數(shù)據(jù)
-
- SpiRcvNum = 0;//讀的時(shí)候?qū)懙臄?shù)據(jù)筆數(shù)為0
- }
- else
- {
- ////////////////////////////////////////////////////////////
- SETCS;//停止數(shù)據(jù)發(fā)送
- // NOP();
- // SPCR = (1<<SPE) | (0<<MSTR) | (1<<SPR0);//清零SPCR 的MSTR 位,使SPI 成為從機(jī)
- // NOP();
- SpiReceiveData[SpiSendNum-1]=SPDR;//讀數(shù)據(jù) //SpiSendNum 需要一個(gè)初始值才行。wanwan
- // SpiReceiveData1[SpiRcvNum++]=SPDR;
-
-
- // SpiReceiveData[SpiSendNum++]=SPDR;//讀數(shù)據(jù) //SpiSendNum 需要一個(gè)初始值才行。wanwan
- // SpiReceiveData[SpiSendNum++]=0x55;//test
- //相應(yīng)指示
- SpiMaxSend=0;//傳輸完成
- SpiSending=0;
- McpFisrtCmm=0;//清除標(biāo)示
- }
- }
- }
- }else
- {
- //SETCS;//停止數(shù)據(jù)發(fā)送
- //DDR_SPI = (1<<DD_MISO);
- if (!(SPSR & (1<<SPIF)))//串行發(fā)送結(jié)束后,SPIF置位,中斷//是為了等待串行數(shù)據(jù)發(fā)送,發(fā)送結(jié)束前始終在循環(huán),結(jié)束后跳出循環(huán),執(zhí)行后續(xù)代碼。
- {
- //Set_Bit(PORTB, 3);
- ImitShootFlag = 1;
- SPDR = 0XFF;
- SpiReceiveData1[SpiRcvNum++]=SPDR;
- if(SpiRcvNum > 20)
- SpiRcvNum = 0;
-
- }
- }
-
- #endif
- #if 0
- //SPDR = cData;//啟動(dòng)數(shù)據(jù)傳輸
- //while(!(SPSR&(1<<SPIF)));//等待傳輸結(jié)束,SPSR&(1<<SPIF)即1,循環(huán)內(nèi)
- //是為了等待串行數(shù)據(jù)發(fā)送,發(fā)送結(jié)束前始終在循環(huán),結(jié)束后跳出循環(huán),執(zhí)行后續(xù)代碼。
- if (SpiSending!=0)//有數(shù)據(jù)需要發(fā)送
- {
- if (McpFisrtCmm==0)//第1次發(fā)送
- {
- CLRCS;//SPI口基本在PB口 開啟
- NOP();
- NOP();
- SPDR = SpiTransData[0];
- SpiSendNum=1;//指向下一地址
- McpFisrtCmm=1;
- }
- else
- {
- // 對 SPI 數(shù)據(jù)寄存器寫入數(shù)據(jù)即啟動(dòng)SPI 時(shí)鐘,將8 比特的數(shù)據(jù)移入從機(jī)。
- if (SPSR & (1<<SPIF))//串行發(fā)送結(jié)束后,SPIF置位,中斷//是為了等待串行數(shù)據(jù)發(fā)送,發(fā)送結(jié)束前始終在循環(huán),結(jié)束后跳出循環(huán),執(zhí)行后續(xù)代碼。
- {
- if(SpiSendNum<SpiMaxSend)//SpiMaxSend應(yīng)比量小1 ,SpiMaxSend = 5
- {
- // CLRCS;//數(shù)據(jù)發(fā)送
- // NOP();
- // SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR0);
- // NOP();
-
- // SpiReceiveData[SpiSendNum++]=SPDR;//test
- SpiReceiveData[SpiSendNum-1]=SPDR;//讀數(shù)據(jù) //應(yīng)該去掉wanwan //一去掉,SPI就不能初始化
- SPDR = SpiTransData[SpiSendNum];//寫數(shù)據(jù)
- SpiSendNum++; //下一筆數(shù)據(jù)
- SpiRcvNum = 0;//讀的時(shí)候?qū)懙臄?shù)據(jù)筆數(shù)為0
- }
- else
- {
- ////////////////////////////////////////////////////////////
- SETCS;//停止數(shù)據(jù)發(fā)送
- // NOP();
- // SPCR = (1<<SPE) | (0<<MSTR) | (1<<SPR0);//清零SPCR 的MSTR 位,使SPI 成為從機(jī)
- // NOP();
- SpiReceiveData[SpiSendNum-1]=SPDR;//讀數(shù)據(jù) //SpiSendNum 需要一個(gè)初始值才行。wanwan
- // SpiReceiveData1[SpiRcvNum++]=SPDR;
- // SpiReceiveData[SpiSendNum++]=SPDR;//讀數(shù)據(jù) //SpiSendNum 需要一個(gè)初始值才行。wanwan
- // SpiReceiveData[SpiSendNum++]=0x55;//test
- //相應(yīng)指示
- SpiMaxSend=0;//傳輸完成
- SpiSending=0;
- McpFisrtCmm=0;//清除標(biāo)示
- }
- }
- }
- }
- #endif
- // SETCS;//停止數(shù)據(jù)發(fā)送
- // NOP();
- // SPCR = (1<<SPE) | (0<<MSTR) | (1<<SPR0);//清零SPCR 的MSTR 位,使SPI 成為從機(jī)
- // NOP();
-
-
- // if (SPSR & (1<<SPIF))//串行發(fā)送結(jié)束后,SPIF置位,中斷//是為了等待串行數(shù)據(jù)發(fā)送,發(fā)送結(jié)束前始終在循環(huán),結(jié)束后跳出循環(huán),執(zhí)行后續(xù)代碼。
- // {
-
- // SpiReceiveData1[SpiRcvNum++]=SPDR;
- // if(SpiRcvNum > 5)
- // SpiRcvNum = 0;
- //
- // }
-
- }
復(fù)制代碼
|
|