"); //-->
|
|
一直以来用的是模拟方式的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就是挤过来挤过去”
专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们
相关推荐
一卡多号读卡器电路原理图
Andrea Gallo:2025年加速技术进程与RISC-V应用推广
硅谷的成功因素是什么
硅MEMS:加速时序市场创新
基于BP神经网络的PID控制器的研究与实现
绝对可用的开关电源:STR6309电源
国产DVD差异化谋生存
真空炉温度模糊PID复合控制
非典时期 上海电子商务迅速升温
超宽带技术夺取无线视频市场
是什么阻碍了有线宽带网的发展?
RISC-V中国峰会现场发布多项重磅级生态合作
结合RTC实现的“智能定时任务系统”:设计与实战
鼠标电路原理图
混合信号电路在纳米时代的挑战
串口转红外的电路
面向嵌入式设备的开源AutoML正式发布——加速边缘AI创新
产品级的按键输入系统设计:去抖、识别与状态机实践
RISC-V中国峰会 戴伟民回顾上海与RISC-V结缘史
绝对可用的开关电源:长虹CH-10电源
Jim Keller:面向未来智能的开放计算,融算于开、慧启未来
绝对可用的开关电源:STR41090电源
可调谐RF趋势
MEMS代工趋势
绝对可用的开关电源:STR5412电源
绝对可用的开关电源:STR41090电源
网络新技术令下载快6千倍 下载电影只用几秒钟
TDK连续第五年助力iCAN大学生创新创业大赛,吸引中国新人才
RISC-V之父Krste Asanovic:联合创新加速RISC-V生态成功
2025 RISC-V中国峰会上海召开 上海市委常委副市长陈杰致辞