|
如下代码部分只能发送,不能接收,还请高手指点。
- 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;
- //
- // }
-
- }
复制代码
|
|