STC系列单片机的 硬件SPI调试成功(2009-11-22 16:52:48)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
一直以来用的是模拟方式的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 = bchar;
i++;
spi_packet=0;
}
}
}
先吃饭了,回来写
///////////////////////////////////////////////////
最近在上海找工作,一时忘记了这未完的日志,续写(时间有限,直接贴程序)
///////////////////////////////////////////////////
2、最多的时候还是使用查询方式比较方便,程序简单,读写一体:
unsigned char SpiWrite(unsigned char spidata)////////注意读的时候,也要写一个字节
{
SPSTAT=0xC0;
SPDAT=spidata;
while(!(SPSTAT & 0x80));
return SPDAT;
}
//////////////////////////////////////
在此特别感谢广西民族大学的hebei,一语点醒,让我解决了这个问题。
“SPI就是挤过来挤过去”
文章评论(0条评论)
登录后参与讨论