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