51单片机总线模拟方法集锦.doc_第1页
51单片机总线模拟方法集锦.doc_第2页
51单片机总线模拟方法集锦.doc_第3页
51单片机总线模拟方法集锦.doc_第4页
51单片机总线模拟方法集锦.doc_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

51单片机总线模拟方法集锦关于SPI 模拟时序的问题 我想用51单片机的IO口模拟SPI串行通信 请各位大侠指点一下代码 思路 等等 小弟完全没有思路 谢谢/*/函数名:SpisendByte(INT8U dat)/输入:发送的数据/输出:无/功能描述:SPI发送一个字节/*INT8U SpiTxRxByte(INT8U dat) INT8U i,temp; temp = 0; SCK = 0; for(i=0; i8; i+) if(dat & 0x80) MOSI = 1; else MOSI = 0; dat = 1; SCK = 1; _nop_(); _nop_(); temp = 1; if(MISO)temp+; SCK = 0; _nop_(); _nop_(); return temp;/*/函数名:void RESET_CC1100(void)/输入:无/输出:无/功能描述:复位CC1100/*void RESET_CC1100(void) CSN = 0; while (MISO); SpiTxRxByte(CCxxx0_SRES); /写入复位命令 while (MISO); CSN = 1; /*/函数名:void POWER_UP_RESET_CC1100(void) /输入:无/输出:无/功能描述:上电复位CC1100/*void POWER_UP_RESET_CC1100(void) CSN = 1; halWait(1); CSN = 0; halWait(1); CSN = 1; halWait(41); RESET_CC1100(); /复位CC1100/*/函数名:void halSpiWriteReg(INT8U addr, INT8U value)/输入:地址和配置字/输出:无/功能描述:SPI写寄存器/*void halSpiWriteReg(INT8U addr, INT8U value) CSN = 0; while (MISO); SpiTxRxByte(addr); /写地址 SpiTxRxByte(value); /写入配置 CSN = 1;/*/函数名:void halSpiWriteBurstReg(INT8U addr, INT8U *buffer, INT8U count)/输入:地址,写入缓冲区,写入个数/输出:无/功能描述:SPI连续写配置寄存器/*void halSpiWriteBurstReg(INT8U addr, INT8U *buffer, INT8U count) INT8U i, temp; temp = addr | WRITE_BURST; CSN = 0; while (MISO); SpiTxRxByte(temp); for (i = 0; i count; i+) SpiTxRxByte(bufferi); CSN = 1;/*/函数名:void halSpiStrobe(INT8U strobe)/输入:命令/输出:无/功能描述:SPI写命令/*void halSpiStrobe(INT8U strobe) CSN = 0; while (MISO); SpiTxRxByte(strobe); /写入命令 CSN = 1;/*/函数名:INT8U halSpiReadReg(INT8U addr)/输入:地址/输出:该寄存器的配置字/功能描述:SPI读寄存器/*INT8U halSpiReadReg(INT8U addr) INT8U temp, value; temp = addr|READ_SINGLE;/读寄存器命令 CSN = 0; while (MISO); SpiTxRxByte(temp); value = SpiTxRxByte(0); CSN = 1; return value;/*/函数名:void halSpiReadBurstReg(INT8U addr, INT8U *buffer, INT8U count)/输入:地址,读出数据后暂存的缓冲区,读出配置个数/输出:无/功能描述:SPI连续写配置寄存器/*void halSpiReadBurstReg(INT8U addr, INT8U *buffer, INT8U count) INT8U i,temp; temp = addr | READ_BURST; /写入要读的配置寄存器地址和读命令 CSN = 0; while (MISO); SpiTxRxByte(temp); for (i = 0; i 1说明进度超前,符合要求;SPI1说明进度延迟,应采取措施纠正! Sales Performance International(SPI)Sales Performance International(SPI)是解决方案销售(Solution Selling®)方法的唯一知识产权所有者全球备受承认的销售培训可为销售人员和管理专业人士提供成熟、完整、端到端的专业发展计划。 SPI亚洲总部位于新加坡,通过与顾客精诚合作,在亚洲地区开展了广泛而深入的工作,通过提供战略、运营及战术层次上的解决方案来帮助客户提升销售业绩。 SPI成立于1988 年,已帮助多家公司成功地从销售产品转变为营销和销售高价值的解决方案,是业内的领导者。SPI 已在50 个以上的国家内使用14 种以上的语言为超过60 万名的销售及管理专业人士提供过培训,具备足够的专业技能来为客户提供合适的解决方案,可帮助客户实现可衡量及可持续的收入增长和可执行的销售业绩提升。 宽度 208MIL,封装SOP8一、SPI 的多义性一、SPI 是英文Software Process Improvement的缩写,中文意思是软件过程的改进。它是CMM(还有其他能力模型)中的一个重要概念,CMM模型的目的就是要改进一个组织的过程,提高过程能力,所以叫做SPI-软件过程改进。 二、SPI 是英文Service Provider Interface的缩写。中文意思是服务提供商接口。满足某种服务标准的供应商提供的符合该标准的应用程序接口,SPI应该和该服务的API标准是兼容的,应用程序一般应该是基于API编写,除非是SPI中包含API中没有提供的功能而又必须使用。 三、SPI 是英文Serial Peripheral Interface的缩写,中文意思是串行外围设备接口,SPI是Motorola公司推出的一种同步串行通讯方式,是一种四线同步总线,因其硬件功能很强,与SPI有关的软件就相当简单,使CPU有更多的时间处理其他事务。 四、SPI 是英文Single Program Initiation的缩写。中文意思是单个程序启动。 五、SPI:Security Parameter Index,安全参数索引。IPSec协议基本概念之一。是一个32比特的数值,在每一个IPSec报文中都携带该值。SPI、IP目的地址、安全协议号三者结合起来共同构成一个三元组,来唯一标识一个特定的 安全联盟(Security Association)。 六、SPI理论:心理学中在记忆部分,SPI是SERIAL(记忆系统的编码是串行的),PARALLEL(存储是并行的),INDEPENDENT(提取是独立的)的缩写。在1995年,由Tulving提出,试图将记忆系统和记忆过程的概念统一到一个更综合的框架中。 二、通信的 SPI 概念2.1、SPI:高速同步串行口SPI:高速同步串行口。是一种标准的四线同步双向串行总线。 SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议,比如AT91RM9200. SPI总线系统是一种同步串行外设接口,它可以使MCU与各种外围设备以串行方式进行通信以交换信息。外围设置FLASHRAM、网络控制器、LCD显示驱动器、A/D转换器和MCU等。SPI总线系统可直接与各个厂家生产的多种标准外围器件直接接口,该接口一般使用4条线:串行时钟线(SCK)、主机输入/从机输出数据线MISO、主机输出/从机输入数据线MOSI和低电平有效的从机选择线SS(有的SPI接口芯片带有中断信号线INT、有的SPI接口芯片没有主机输出/从机输入数据线MOSI)。 SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(用于单向传输时,也就是半双工方式)。也是所有基于SPI的设备共有的,它们是SDI(数据输入),SDO(数据输出),SCK(时钟),CS(片选)。 (1)SDO 主设备数据输出,从设备数据输入 (2)SDI 主设备数据输入,从设备数据输出 (3)SCLK 时钟信号,由主设备产生 (4)CS 从设备使能信号,由主设备控制 其中CS是控制芯片是否被选中的,也就是说只有片选信号为预先规定的使能信号时(高电位或低电位),对此芯片的操作才有效。这就允许在同一总线上连接多个SPI设备成为可能。 接下来就负责通讯的3根线了。通讯是通过数据交换完成的,这里先要知道SPI是串行通讯协议,也就是说数据是一位一位的传输的。这就是SCK时钟线存在的原因,由SCK提供时钟脉冲,SDI,SDO则基于此脉冲完成数据传输。数据输出通过 SDO线,数据在时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取。完成一位数据传输,输入也使用同样原理。这样,在至少8次时钟信号的改变(上沿和下沿为一次),就可以完成8位数据的传输。 要注意的是,SCK信号线只由主设备控制,从设备不能控制信号线。同样,在一个基于SPI的设备中,至少有一个主控设备。这样传输的特点:这样的传输方式有一个优点,与普通的串行通讯不同,普通的串行通讯一次连续传送至少8位数据,而SPI允许数据一位一位的传送,甚至允许暂停,因为SCK时钟线由主控设备控制,当没有时钟跳变时,从设备不采集或传送数据。也就是说,主设备通过对SCK时钟线的控制可以完成对通讯的控制。SPI还是一个数据交换协议:因为SPI的数据输入和输出线独立,所以允许同时完成数据的输入和输出。不同的SPI设备的实现方式不尽相同,主要是数据改变和采集的时间不同,在时钟信号上沿或下沿采集有不同定义,具体请参考相关器件的文档。 在点对点的通信中,SPI接口不需要进行寻址操作,且为全双工通信,显得简单高效。在多个从设备的系统中,每个从设备需要独立的使能信号,硬件上比I2C系统要稍微复杂一些。 2.2、接口的硬件连接示意图在多个从器件的系统中,每个从器件需要独立的使能信号,硬件上比I2C系统要稍微复杂一些。 SPI接口在内部硬件实际上是两个简单的移位寄存器,传输的数据为8位,在主器件产生的从器件使能信号和移位脉冲下,按位传输,高位在前,低位在后。如下图所示,在SCLK的下降沿上数 据改变,同时一位数据被存入移位寄存器。 2.3、性能特点AT91RM9200的SPI接口主要由4个引脚构成:SPICLK、MOSI、MISO及 /SS,其中SPICLK是整个SPI总线的公用时钟,MOSI、MISO作为主机,从机的输入输出的标志,MOSI是主机的输出,从机的输入,MISO 是主机的输入,从机的输出。/SS是从机的标志管脚,在互相通信的两个SPI总线的器件,/SS管脚的电平低的是从机,相反/SS管脚的电平高的是主机。在一个SPI通信系统中,必须有主机。SPI总线可以配置成单主单从,单主多从,互为主从。 SPI的片选可以扩充选择16个外设,这时PCS输出=NPCS,说NPCS03接4-16译码器,这个译码器是需要外接4-16译码器,译码器的输入为NPCS03,输出用于16个外设的选择。 SPI接口的一个缺点:没有指定的流控制,没有应答机制确认是否接收到数据。 2.4、SPI协议举例SPI是一个环形总线结构,由ss(cs)、sck、sdi、sdo构成,其时序其实很简单,主要是在sck的控制下,两个双向移位寄存器进行数据交换。 假设下面的8位寄存器装的是待发送的数据10101010,上升沿发送、下降沿接收、高位先发送。 那么第一个上升沿来的时候 数据将会是sdo=1;寄存器中的10101010左移一位,后面补入送来的一位未知数x,成了0101010x。下降沿到来的时候,sdi上的电平将锁存到寄存器中去,那么这时寄存器=0101010sdi,这样在 8个时钟脉冲以后,两个寄存器的内容互相交换一次。这样就完成了一个spi时序。 2.5、举例假设主机和从机初始化就绪:并且主机的sbuff=0xaa,从机的sbuff=0x55,下面将分步对spi的8个时钟周期的数据情况演示一遍:假设上升沿发送数据 脉冲 主机sbuff 从机sbuff sdi sdo 0 10101010 01010101 0 0 1上 0101010x 1010101x 0 1 1下 01010100 10101011 0 1 2上 1010100x 0101011x 1 0 2下 10101001 01010110 1 0 3上 0101001x 1010110x 0 1 3下 01010010 10101101 0 1 4上 1010010x 0101101x 1 0 4下 10100101 01011010 1 0 5上 0100101x 1011010x 0 1 5下 01001010 10110101 0 1 6上 1001010x 0110101x 1 0 6下 10010101 01101010 1 0 7上 0010101x 1101010x 0 1 7下 00101010 11010101 0 1 8上 0101010x 1010101x 1 0 8下 01010101 10101010 1 0 这样就完成了两个寄存器8位的交换,上面的上表示上升沿、下表示下降沿,sdi、sdo相对于主机而言的。其中ss引脚作为主机的时候,从机可以把它拉底被动选为从机,作为从机的是时候,可以作为片选脚用。根据以上分析,一个完整的传送周期是16位,即两个字节,因为,首先主机要发送命令过去,然后从机 根据主机的命令准备数据,主机在下一个8位时钟周期才把数据读回来。 SPI 总线是Motorola公司推出的三线同步接口,同步串行3线方式进行通信:一条时钟线SCK,一条数据输入线MISO,一条数据输出线MOSI;用于CPU与各种外围器件进行全双工、同步串行通讯。SPI主要特点有:可以同时发出和接收串行数据;可以当作主 机或从机工作;提供频率可编程时钟;发送结束 中断标志;写冲突保护;总线竞争保护等。下图示出SPI总线工作的四种方式,其中使用的最为广泛的是SPI0和SPI3方式 (实线表示): SPI总线四种工作方式 SPI 模块为了和外设进行数据交换,根据外设工作要求,其输出串行同步时钟极性和相位可以进行配置,时钟极性(CPOL)对传输协议没有重大的影响。如果 CPOL=0,串行同步时钟的空闲状态为低电平;如果CPOL=1,串行同步时钟的空闲状态为高电平。时钟相位(CPHA)能够配置用于选择两种不同的传输协议之一进行数据传输。如果CPHA=0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样;如果CPHA=1,在串行同步时钟的第二个跳变沿(上升或下降)数据被采样。SPI主模块和与之通信的外设备时钟相位和极性应该一致。 SPI总线包括1根串行同步时钟信号线以及2根数据线。 SPI模块为了和外设进行数据交换,根据外设工作要求,其输出串行同步时钟极性和相位可以进行配置,时钟极性(CPOL)对传输协议没有重大的影响。如果CPOL=0,串行同步时钟的空闲状态为低电平;如果CPOL=1,串行同步时钟的空闲状态为高电平。时钟相位(CPHA)能够配置用于选择两种不同的传输协议之一进行数据传输。如果CPHA=0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样;如果CPHA=1,在串行同步时钟的第二个跳变沿(上升或下降)数据被采样。SPI主模块和与之通信的外设音时钟相位和极性应该一致。SPI接口时序如图3、图4所示。 2.6、性能补充上文中最后一句话:SPI主模块和与之通信的外设备时钟相位和极性应该一致。个人理解这句话有2层意思:其一,主设备SPI时钟和极性的配置应该由外设来决定;其二,二者的配置应该保持一致,即主设备的SDO同从设备的SDO配置一致,主设备的SDI同从设备的SDI配置一致。因为主从设备是在SCLK的控制下,同时发送和接收数据,并通过2个双向移位寄存器来交换数据。工作原理演示如下图: 上升沿主机SDO发送数据1,同时从设备SDO发送数据0;紧接着在SCLK的下降沿的时候从设备的SDI接收到了主机发送过来的数据1,同时主机也接收到了从设备发送过来的数据0. 2.7、SPI协议心得SPI接口时钟配置心得: 在主设备这边配置SPI接口时钟的时候一定要弄清楚从设备的时钟要求,因为主设备这边的时钟极性和相位都是以从设备为基准的。因此在时钟极性的配置上一定要搞清楚从设备是在时钟的上升沿还是下降沿接收数据,是在时钟的下降沿还是上升沿输出数据。但要注意的是,由于主设备的SDO连接从设备的SDI,从设备的SDO连接主设备的SDI,从设备SDI接收的数据是主设备的SDO发送过来的,主设备SDI接收的数据是从设备SDO发送过来的,所以主设备这边SPI时钟极性的配置(即SDO的配置)跟从设备的SDI接收数据的极性是相反的,跟从设备SDO发送数据的极性是相同的。下面这段话是Sychip Wlan8100 Module Spec上说的,充分说明了时钟极性是如何配置的: The 81xx module will always input data bits at the rising edge of the clock, and the host will always output data bits on the falling edge of the clock. 意思是:主设备在时钟的下降沿发送数据,从设备在时钟的上升沿接收数据。因此主设备这边SPI时钟极性应该配置为下降沿有效。 又如,下面这段话是摘自LCD Driver IC SSD1289: SDI is shifted into 8-bit shift register on every rising edge of SCK in the order of data bit 7, data bit 6 data bit 0. 意思是:从设备SSD1289在时钟的上升沿接收数据,而且是按照从高位到低位的顺序接收数据的。因此主设备的SPI时钟极性同样应该配置为下降沿有效。 时钟极性和相位配置正确后,数据才能够被准确的发送和接收。因此应该对照从设备的SPI接口时序或者Spec文档说明来正确配置主设备的时钟。 三、软件过程改进SPI: Software Process Improvement. 软件过程改进。是软件企业项目过程质量的改进,CMM,ISO90003说的就是这个。 四、SDH物理接口SPI:SDH Physical Interface.SDH物理接口。SPI是设备和光路的接口,主要完成光/电变换,电/光变换,提取线路定时,以及相应告警的检测。 SPI 在SMT行业中是锡膏印刷检测机的英文简称 五、业余兵棋界的SPI公司SPI公司是著名的兵棋设计人邓尼根在离开阿瓦隆山公司后开办的兵棋设计公司,旗下有多部杂志和著名兵棋。为“第三世界设计”和阿瓦隆山公司成美国兵棋界三巨头之势。后被设计龙与地下城的桌游公司收购,往日威力减弱了很多。 六、扫描仪参数SPI, samples per inch,表示每英寸中所含的分离像素点的个数。 扫描仪为了获得最佳效果,需要根据输出设备(激光打印机、平板印刷机、直接数码印刷)对它的SPI进行调整。通常确定扫描照片spi的公式是由网线版(halftone screen)或打印机尝试使用的网线频率(screen ruling)来决定。51单片机模拟SPI通讯的C程序,STC12系列51单片机模拟SPI通讯的程序调试已经通过/spi.h/#ifndef SPI_H#define SPI_H#include #include /sfr P4 = 0xe8;/STC12LE5A60S2单片机自带SPI控制器连接/sbit VCC1 = P20;/ VCC1 NO USE/sbit SON = P16 ;/ MISO/sbit SIN = P15 ;/ MOSI/sbit SCKN = P17 ; / SCKsbit CSN = P14 ;/ 28J60 - CS/sbit RSTN = P35 ; /RST, no use/sbit INTN = P33 ; / INT, no usevoid init_spi(void);void WriteByte(u8_t temp);u8_t ReadByte(void);#endif/spi.c/#include/STC12LE5A60S2单片机自带SPI控制器连接void init_spi(void)/SSIG = 1; /忽略SS脚/SPEN = 1; /允许SPI工作/DORD = 0; /先传高位MSB/MSTR = 1; /设置单片机为主机SPCTL = 0xD0; /SPI Control Register SSIG SPEN DORD MSTR CPOL CPHA SPR1 SPR0 0000,0100SPSTAT = 0xC0; /IE2 |= 0x02; /允许SPI中断控制位void WriteByte(u8_t temp)SPDAT = temp;while(!(SPSTAT & 0x80);SPSTAT = 0xC0;u8_t ReadByte(void)idata u8_t temp;/SPSTAT = 0xC0;SPDAT = 0x00;while(!(SPSTAT & 0x80);temp = SPDAT;SPSTAT = 0xC0;return temp;bascom SPI接口控制74HC595 LED显示2009-12-13 10:47SPI接口的全称是Serial Peripheral Interface,意为串行外围接口。SPI接口主要应用在EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。 SPI接口是在CPU和外围低速器件之间进行同步串行数据传输,在主器件的移位脉冲下,数据按位传输,为全双工通信,数据传输速度总体来说比I2C总线要快,速度可达到几Mbps。 SPI接口是以主从方式工作的,这种模式通常有一个主器件和一个或多个从器件,其接口包括以下四种信号: (1)MOSI 主器件数据输出,从器件数据输入 (2)MISO 主器件数据输入,从器件数据输出 (3)SCLK 时钟信号,由主器件产生 (4)/SS 从器件使能信号,由主器件控制 在BASCOM中,提供了软件实现的SPI接口的语句,同样BASCOM也有支持硬件SPI的语句。 下面将使用三个例子来说明如何在BASCOM中使用SPI接口。 在介绍例子之前,我们先了解一下硬件连接图,连接如图1所示。图中共使用三片74HC595芯片,分别控制三个数码管,三片74HC595通过Q7引脚进行级联。第一片74HC595的DS引脚连接到了ATmega88的MOSI引脚,而SH_CP引脚连接到了ATmega88的SCK引脚,ST_CP引脚连接到了ATmega88的PB1引脚。 一、使用硬件SPI接口控制74HC595 - 使用芯片: ATmega88, 晶振: 内部8MHz晶振 email: 软件版本: Bascom-AVR Full version -$regfile = m88def.dat 芯片为ATmega88 $crystal = 8000000 8M晶振频率 $hwstack = 32 设置堆栈大小 $swstack = 10 $framesize = 40 Dim I As Byte Dim A(3) As Byte Latch Alias Portb.1 Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 4 , Noss = 0 定义使用单片机自带的硬件SPI,SPI中断未使能,数据发送时,高位先发送。 设为SPI主设备,时钟4分频 Spiini

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论