- 1、本文档共8页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
SPI协议简介SPI协议简介
SPI协议简介
SPI是Serial Peripheral Interface的简称,NDS中的触摸屏,麦克风,电源控制,固件及DS卡的EEPROM都是基于SPI的。所以弄明白SPI的原理对NDS的研究很有帮助。SPI 是一种允许一个主设备启动一个与从设备的同步通讯的协议,从而完成数据的交换。也就是SPI是一种规定好的通讯方式。这种通信方式的优点是占用端口较少, 一般4根就够基本通讯了(不算电源线)。同时传输速度也很高。一般来说要求主设备要有SPI控制器(但可用模拟方式),就可以与基于SPI的芯片通讯了。 这种芯片也许是储存芯片,像DS卡的存档芯片,也许是控制芯片,像DS触摸屏的控制芯片等等。 L SPI 的通信原理很简单,它需要至少4根线,事实上3根也可以。也是所有基于SPI的设备共有的,它们是SDI(数据输入),SDO(数据输出),SCK(时 钟),CS(片选)。其中CS是控制芯片是否被选中的,也就是说只有片选信号为预先规定的使能信号时(高电位或低电位),对此芯片的操作才有效。这就允许 在同一总线上连接多个SPI设备成为可能。
接 下来就负责通讯的3根线了。通讯是通过数据交换完成的,这里先要知道SPI是串行通讯协议,也就是说数据是一位一位的传输的。这就是SCK时钟线存在的原 因,由SCK提供时钟脉冲,SDI,SDO则基于此脉冲完成数据传输。数据输出通过SDO线,数据在时钟上沿或下沿时改变,在紧接着的下沿或上沿被读取。 完成一位数据传输,输入也使用同样原理。这样,在至少8次时钟信号的改变(上沿和下沿为一次),就可以完成8位数据的传输。 o要注意的是,SCK信号线只由主设备控制,从设备不能控制信号线。同样,在一个基于SPI的设备中,至少有一个主控设备。 这 样传输的特点:这样的传输方式有一个优点,与普通的串行通讯不同,普通的串行通讯一次连续传送至少8位数据,而SPI允许数据一位一位的传送,甚至允许暂 停,因为SCK时钟线由主控设备控制,当没有时钟跳变时,从设备不采集或传送数据。也就是说,主设备通过对SCK时钟线的控制可以完成对通讯的控制。SPI还是一个数据交换协议:因为SPI的数据输入和输出线独立,所以允许同时完成数据的输入和输出。 不同的SPI设备的实现方式不尽相同,主要是数据改变和采集的时间不同,在时钟信号上沿或下沿采集有不同定义,具体请参考相关器件的文档。
下面是用单片机实现触摸屏的代码:
[功 能] 8051单片机驱动ADS7846/ADS7843芯片
?
?
显示代码
打印
01 #include reg51.h 02 #include intrins.h
03 ?? 04 ??
05 sbit DCLK=P1^6; //根据用户自己的定义 06 sbit CS=P2^2;
07 sbit DIN=P2^3; 08 sbit DOUT=P2^4;
09 sbit BUSY=P2^5; 10 ??
11 delay(unsigned char i--) 12 {
13 while(i--); 14 }
15 ?? 16 ??
17 void start() //SPI开始 18 {
19 DCLK=0; 20 CS=1;
21 DIN=1; 22 DCLK=1;
23 CS=0; 24 }
25 ?? 26 WriteCharTo7843(unsigned char num) //SPI写数据
27 { 28 unsigned char count=0;
29 DCLK=0; 30 for(count=0;count8;count++)
31 { 32 num=1;
33 DIN=CY; 34 DCLK=0; _nop_();_nop_();_nop_(); //上升沿有效
35 DCLK=1; _nop_();_nop_();_nop_(); 36 }
37 } 38 ??
39 ?? 40 ReadFromCharFrom7843() //SPI 读数据
41 { 42 unsigned char count=0;
43 unsigned int Num=0; 44 for(count=0;count12;count++)
45 { 46 Num=1;
47 DCLK=1; _nop_();_nop_();_nop_(); //下降沿有效 48 DCLK=0; _nop_();_nop_();_nop_();
49 if(DOUT) Num++; 50 }
51 return(N
文档评论(0)