SPI(Serial Peripheral Interfacer 串行外设接口)是摩托罗拉公司推出的一种同步串行通讯接口,用于微处理器臌控制器和外围扩展芯片之间的串行连接,现已发展成为一种工业标准,目前,各半导体公司推出了大量的带有SPI接口的具有各种各样功能的芯片,如RAM,EEPROM,FlashROM,A/D转换器、D/A转换器、LED/LED显示驱动器、I/O接口芯片、实时时钟、UART收发器等等,为用户的外围扩展提供了极其灵活而价廉的选择。由于SPI总线接口只占用微处理器四个I/O口线,采用SPI总线接口可以简化电路没计,节省很多常规电路中的接口器件和I/O口线,提高设计的可靠性。现以 AT89C205l单片机模拟SPI总线操作串行EEPROM 93CA6为例,如图1所示,介绍利用单片机的I/O口通过软件模拟SPI总线的实现方法。在这里,仅介绍读命令的时序和应用子程序。
93C46存储器SPI总线的工作原理
93CA6作为从设备,其SPI接口使用4条I/O口线:串行时钟线(SK)、输出数据线DO、输入数据线DI和高电平有效的从机选择线CS。其数据的传输格式是高位(MSB)在前,低位(LsB)在后。93C46的SPI总线接口读命令时序如图2所示。
软件模拟SPI接口的实现方法
对于不带SPI串行总线接口的AT89C2051单片 机来说,可以使用软件来模拟SPI的操作,图1所示 为AT89C2051单片机与串行EEPROM 93C46的硬件 连接图,其中,P1.0模拟SPI主设备的数据输出端 SDO,P1.2模拟SPI的时钟输出端SCK,P1.3模拟 SPI的从机选择端SCS,P1.1模拟SPI的数据输入 SDI。
写禁止操作(WDS)):写操作首先发送1位起始位(1),2位操作码(00),6位数据(00XXXX)。
下面介绍用C51模拟SPI的子程序。
-
//首先定义好I/O口
-
sbitSDO=P1^0;
-
sbitSDI=P1^1;
-
sbitSCK=P1^2;
-
sbitSCS=P1^3;
-
sbitACC_7=ACC^7;
-
unsignedintSpiRead(unsignedcharadd)
-
{
-
unsignedchari;
-
unsignedintdatal6;
-
add&=0x3f;/*6位地址*/
-
add|=0x80;/*读操作码l0*/
-
SDO=1;/*发送1为起始位*/
-
SCK=0;
-
SCK=1;
-
for(i=0;<8;i++)/*发送操作码和地址*/
-
{
-
if(add&0x80==1)
-
SDO=1;
-
else
-
SDO=0;
-
SCK=0;/*从设备上升沿接收数据*/
-
SCK=1;
-
add<<=1;
-
}
-
SCK=1;/*从设备时钟线下降沿后发送数据,空读1位数据*/
-
SCK=0;
-
datal6<<=1;/*读16位数据*/
-
for(i=0;<16;i++)
-
{
-
SCK=1;
-
_nop_();
-
if(SDI==1)
-
datal6|=0x01;
-
SCK=0;
-
datal6<<=1;
-
}
-
returndatal6;
-
}
对于不同的串行接口外围芯片,它们的时钟时序是不同的。上述子程序是针对在SCK的上升沿输入(接收)数据和在下降沿输出(发送)数据的器件。这些子程序也适用于在串行时钟)的上升沿输入和下降沿输出的其它各种串行外围接口芯片,只要在程序中改变P1.2(SCK)的输出电平顺序进行相应调整即可。