新闻  |   论坛  |   博客  |   在线研讨会
STC系列单片机的 硬件SPI调试成功
0750long | 2010-02-01 22:22:04    阅读:5039   发布文章

 

 

        一直以来用的是模拟方式的SPI,但是速度实在有限,能达到700K就不错了,而硬件SPI可以达到3Mbps。

        查看了datasheet和demo程序(汇编),想改写为C语言的,不过一直有bug,时不时接不着

而且主机能给从机发送数据,从机可以顺利接受,但是从机返回到主机的程序,主机无法接收。

       连续两天没有解决这个问题!

       其中不乏看了些论坛上大虾们的程序,关于STC的硬件SPI程序不多,大多数是软件模拟实现的。

程序改写过程中出现的问题:

1、中断方式要注意:主机的写SPI函数开关中断要及时,判断结束后要在SPSAT清零前打开中断!

 void SpiWrite(unsigned char b)

  EADC_SPI = 0;     //关掉ADC_SPI共享中断
     SPDAT = b;      //发送数据
     while(!(SPSTAT & 0x80) );  //等待发送完毕 SPIF = 1
  EADC_SPI = 1;     //打开中断
  SPSTAT = 0xC0;     

}

////////////////////////////////////////////////////中断读

adc_spi_interrupt(void) interrupt 5  {

 SPSTAT = 0xC0;
  bchar = SPDAT;

 spi_packet = 1;
}

/////////////////////////////////////接受数据包的时候,注意要先写一个字节(0xFF)随便

void RxPacket(void)    /////////////nRF905射频收发器的接受函数
{
    unsigned char i;
    i="0";

 while(DR)
 {
 SpiWrite(0xFF);
 while(spi_packet)
    { 
        TxRxBuffer[i] = bchar;
  i++;
  spi_packet=0;
    }
 }

}

先吃饭了,回来写

 

 

///////////////////////////////////////////////////

最近在上海找工作,一时忘记了这未完的日志,续写(时间有限,直接贴程序)

///////////////////////////////////////////////////

2、最多的时候还是使用查询方式比较方便,程序简单,读写一体:

unsigned char SpiWrite(unsigned char spidata)////////注意读的时候,也要写一个字节
{  
 SPSTAT=0xC0;
 SPDAT=spidata;
 while(!(SPSTAT & 0x80));
 return SPDAT;
}

 

//////////////////////////////////////

在此特别感谢广西民族大学的hebei,一语点醒,让我解决了这个问题。

“SPI就是挤过来挤过去”

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客