单片机软件模拟SPI接口—加深理解SPI总线协议
来源:互联网 发布:mysql数据库修改密码 编辑:程序博客网 时间:2024/04/28 07:14
单片机软件模拟SPI接口—加深理解SPI总线协议
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总线的实现方法。在这里,仅介绍读命令的时序和应用子程序。
现以 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。上电复位后首先先将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)。
下面介绍用C51模拟SPI的子程序。
- //首先定义好I/O口
- sbit SDO=P1^0;
- sbit SDI=P1^1;
- sbit SCK=P1^ 2;
- sbit SCS=P1^3;
- sbit ACC_7= ACC^7;
- unsigned int SpiRead(unsigned char add)
- {
- unsigned char i;
- unsigned int datal6;
- 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;
- }
- return datal6;
- }
- 顶
- 10
- 踩
- 0
查看评论
- 2楼 penglijiang 2013-03-07 18:19发表 [回复]
- 上图中 的 DO 和DI 是芯片的 应该接线图是连接 处理器的 DI和DO 我刚开始理解错了,还好认真看了代码
谢谢你
- 1楼 moon2000boy 2013-02-10 15:42发表 [回复]
- for(i=0;<8;i++)/*发送操作码和地址*/
- {
- if(add&0x80==1) //这里 应该是 add&0x80==0x80 吧
- SDO=1;
- else
- SDO=0;
- SCK=0;/*从设备上升沿接收数据*/
- SCK=1;
- add<<= 1;
- }
代码中 if语句 if(add&0x80==1) 是不是应该改为 add&0x80==0x80 判断最高位是不是1?
请检查下代码,谢谢- Re: ce123 2013-02-13 15:22发表 [回复]
- 回复moon2000boy:确实是这样的,谢谢您提出的意见。
- 单片机软件模拟SPI接口—加深理解SPI总线协议
- 单片机软件模拟SPI接口—加深理解SPI总线协议
- 单片机软件模拟SPI接口—加深理解SPI总线协议
- 单片机软件模拟SPI接口—加深理解SPI总线协议
- 单片机软件模拟SPI接口—加深理解SPI总线协议
- 单片机软件模拟SPI接口—加深理解SPI总线协议
- 单片机软件模拟SPI接口—加深理解SPI总线协议
- 四、单片机软件模拟SPI接口—加深理解SPI总线协议
- SPI总线 SPI接口 SPI协议 SPI模式 SPI通讯
- SPI总线 SPI接口 SPI协议 SPI模式 SPI通讯
- 深入理解SPI总线协议
- 关于SPI接口、I2C接口总线协议
- 单片机spi总线
- STM32F1XX学习—串行总线协议和SPI接口介绍
- SPI总线协议
- SPI总线协议
- SPI串行总线协议
- SPI总线协议介绍
- javax.servlet.Filter
- 剑宗与气宗
- hdu 4318 Power transmission(最短路)
- 怎样用C API得到一个数据表的MYSQL_FIELD的正确信息?
- CDC for SQL2012
- 单片机软件模拟SPI接口—加深理解SPI总线协议
- 实验三的源代码
- 笔记8:vb.net的二进制数据流BinaryReader、BinaryWriter
- [转]Java 字符串与Unicode的相互转化
- Axure设置变量变量值以及传值
- 修改Ubuntu Ibus拼音 候选词 的个数
- 六、七周周报
- SPI时序详解
- POJ1131 (Java大数 进制转化8-10 )