SPI(Serial Peripheral Interfacer 串行外设接口)是摩托罗拉公司推出的一种同步串行通讯接口,用于微处理器臌控制器和外围扩展芯片之间的串行连接,现已发展成为一种工业标准,目前,各半导体公司推出了大量的带有SPI接口的具有各种各样功能的芯片,如RAM,EEPROM,FlashROM,A/D转换器、D/A转换器、LED/LED显示驱动器、I/O接口芯片、实时时钟、UART收发器等等,为用户的外围扩展提供了极其灵活而价廉的选择。由于SPI总线接口只占用微处理器四个I/O口线,采用SPI总线接口可以简化电路没计,节省很多常规电路中的接口器件和I/O口线,提高设计的可靠性。


上电复位后首先先将P1.2(SCK)的初始状态设置为0(空闲状态)。
读操作:AT89C2051首先通过P1.0口发送1位起始位(1),2位操作码(10),6位被读的数据地址(A5A4A3A2A1A0),然后通过P1.1口读1位空位(0),之后再读l6位数据(高位在前)。
写操作:AT89C2051首先通过P1.0口发送1位起始位(1),2位操作码(01),6位被写的数据地址(A5A4A3A2A1A0),之后通过P1.0口发送被写的l6位数据(高位在前),写操作之前要发送写允许命令,写之后要发送写禁止命令。
写允许操作(WEN)):写操作首先发送1位起始位(1),2位操作码(00),6位数据(11XXXX)。 写禁止操作(WDS)):写操作首先发送1位起始位(1),2位操作码(00),6位数据(00XXXX)。
1. //首先定义好I/O口
2. sbit SDO=P1^0;
3. sbit SDI=P1^1;
4. sbit SCK=P1^ 2;
5. sbit SCS=P1^3;
6. sbit ACC_7= ACC^7;
7. unsigned int SpiRead(unsigned char add)
8. {
9. unsigned char i;
10. unsigned int datal6;
11. add&=0x3f;/*6位地址*/
12. add |=0x80;/*读操作码l0*/
13. SDO=1;/*发送1为起始位*/
14. SCK=0;
15. SCK=1;
16. for(i=0;<8;i++)/*发送操作码和地址*/
17. {
18. if(add&0x80==1)
19. SDO=1;
20. else
21. SDO=0;
22. SCK=0;/*从设备上升沿接收数据*/
23. SCK=1;
24. add<<= 1;
25. }
26. SCK=1;/*从设备时钟线下降沿后发送数据,空读1位数据*/
27. SCK=0;
28. datal6<<= 1;/*读16位数据*/
29. for(i=0;<16;i++)
30. {
31. SCK= 1;
32. _nop_();
33. if(SDI==1)
34. datal6|=0x01;
35. SCK =0;
36. datal6< < =1;
37. }
38. return datal6;
39. }
对于不同的串行接口外围芯片,它们的时钟时序是不同的。上述子程序是针对在SCK的上升沿输入(接收)数据和在下降沿输出(发送)数据的器件。这些子程序也适用于在串行时钟)的上升沿输入和下降沿输出的其它各种串行外围接口芯片,只要在程序中改变P1.2(SCK)的输出电平顺序进行相应调整即可。