基于SPI Flash的Sharc系列DSP程序加载

基于SPI Flash的Sharc系列DSP程序加载
基于SPI Flash的Sharc系列DSP程序加载

技术创新

DSP 开发与应用

您的论文得到两院院士关注

基于SPI Flash 的Sharc 系列DSP 程序加载

The Procedures-load of Sharc Series of DSP Based on SPI Flash

(四川大学)

雷春梅周群刘谋云应俊

LEI Chun-mei ZHOU Qun LIU Mou-yun YING Jun

摘要:DSP 是针对数字信号处理需要而设计的一种具有特殊结构的微处理器。它需要通过程序加载来进行信号处理,本文通过具体实例介绍了sharc 系列的DSP 通过其SPI 口的程序加载,同时也介绍了相关系统的硬件设计和软件的调试。该技术可靠性高,使用灵活方便,具有很强的实用性。关键词:程序加载;SPI 接口;数字信号处理;调试中图分类号:TP319文献标识码:B

Abstract:DSP is designed to meet the need of Digital Signal Processing as a specific structuralized microprocessor,in which the signal processes through the procedures-load.In this paper,we introduce the course of loading the procedures via SPI port of DSP,which belongs to the sharc line,and also the relevant system ’s design of hardware and the debugging of software is introduced.With flexible and convenient,this method is of high reliability and highly practical.Key words:Procedures-load;SPI port;Digital Signal Processing;degug

文章编号:1008-0570(2010)04-2-0115-02

1引言

DSP 芯片主要用于数字信号处理。当前占据市场大部分份额的DSP 生产厂商是美国的德州仪器与模拟器件两家公司。在国内,尤以德州仪器生产的芯片使用更加广泛。

使用DSP 进行信号处理,就涉及到程序加载问题,不同厂家

生产的不同系列DSP 的程序加载方式也大同小异。

现在应用得比较广泛的是从flash 中加载程序。因为flash 是一种可在线编程的存储器,而且具有掉电后数据不丢失、功耗低、容量大、读取快、价格低、操作简单等优点。Flash 存储器芯片又分为并口

flash 和串口flash 。

对于并口flash,操作更为简单,数据并行传输,但占用较多的外围接口资源,因此这种程序加载方式比较适合芯片接口资源比较丰富的系统设计;而串口flash,虽然对其进行编程等操作相对复杂一些,但在接口资源比较紧张时却具有其他编程方式无可比拟的优势。

对flash 芯片的烧写,一般有两种方法:编程器烧写和在线编程。编程器烧写,即是通过硬件编程器,将工程文件经过编译链接后得到的输出文件写入flash 芯片中,这种程序烧写方式实现起来比较简单,但需要额外的硬件编程器,因而一定程度上提高了开发成本。另一方面,表贴式封装的flash 芯片不可能使用编程器烧写,只能采用在线编程。本文将通过一个AD 公司生产的sharc 系列DSP 通过其SPI 口的程序加载的具体实例来详细介绍。后面将通过硬件设计和软件架构来介绍其硬件和软件结构并总结了一些调试经验。

2硬件设计

2.1flash 芯片M25P20-VMN6简介

m25p20是美国ST 公司生产的一款flash 存储器芯片。该芯片具有与工业标准SPI 接口兼容的外部引脚。该芯片具有

2Mbit 的存储空间,即256Kbytes 。存储空间被分成四段,每段56Kbytes,并且每段存储空间由256页组成,每页大小为

256Bytes 。

对该芯片进行编程,一次性连续写入最多256Bytes 。该芯片具有一个状态寄存器,通过对其编程,可以实现芯片存储空间的保护,以及芯片写使能等操作。另外,状态寄存器中也具有

BUSY 标志位,通过该标志位,可以查询芯片当前状态。

除了读写状态寄存器以外,该存储器芯片还具有读、写、整片擦除、段擦除等命令。其器件编程的指令时序见参考文献[2]。

2.2flash 芯片与DSP 芯片的硬件连接

使用的flash M25P20芯片具有与工业标准SPI 接口兼容的外部引脚,我们使用的Sharc 系列DSP 芯片也具有同样的SPI 接口,因此,只需要将两个芯片SPI 接口的引脚对应连接即可。这就大大的节省了DSP 芯片的外部接口资源。由于Sharc 系列DSP 芯片的外设接口资源相当的丰富,而外部引脚数却极其的有限,因此,该系列DSP 芯片的引脚复用情况相当严重。

图1

Sharc 系列DSP 的外设接口分为两个部分:DAI 与DPI 。每个部分都含有各种类型的外设接口,比如,DAI 中有PCG(精确时钟产生器),DPI 中包括Timer(定时器)、UART(串口)等。

我们使用的SPI 接口就包含在DPI 中。DPI,即数字外设接口,其占有的14个外部引脚可以使用SRU 宏分配给它包括的任意一个外设接口。Sharc 系列DSP 包含两个SPI 接口,分别是DPI 中的SPI 和DAI 中的SPI B 。在我们的硬件设计中,使用DPI 中的SPI 。SPI 通信具有主从两种工作模式,在实例中,DSP 的SPI 接口工作于主模式,flash 芯片工作于从模式。对于sharc 系列DSP,根据

雷春梅:硕士研究生

技术创新时钟极性和相位的不同,其SPI接口时钟有四种不同的组合,具

体设置见参考文献[3]中的SPICTL寄存器。将DPI的1,2,3,5号

引脚分别指定为SPIMOSI、SPIMISO、SPICLK、SPIDS功能。具体

硬件连接示意图如图1所示。

另外,在连接好SPI接口后,我们还需注意Sharc系列DSP

程序加载方式的硬件设置。对于Sharc系列DSP,具有三种程序

加载方式,分别是:SPI接口主模式程序加载、SPI接口从模式程

序加载以及并行flash程序加载。具体使用的是哪种程序加载

方式,需要通过DSP芯片命名为BOOTCFG0、BOOTCFG1的两

个引脚的状态设置来判断。每种启动方式引脚状态的详细设置

请参考文献。在我们的应用中,使用的程序加载方式为SPI接口

主模式程序加载。

3软件设计

3.1SPI接口的两种数据传输模式

DSP通过其SPI接口向Flash写入数据,具有两种方式:

DMA方式与核控制方式。DMA方式,即是直接存储器存取方式,

此方式可在不受CPU核的控制下完成存储器中一个数据块的

读写。在数据读写的时间内,CPU可工作于其他任务中。DMA方

式可以显著提高CPU的利用率。而核控制方式是指在CPU核

的控制下,通过查询指定寄存器的特定位,完成一次数据的传输,

而且每次只能传送一个数据字。对于Sharc系列DSP,一个数据

字可以是8位,16位,也可以是32位。数据字长度的设置是通过

设置特定寄存器(SPICTL寄存器)的特定位来实现的。具体寄存

器配置,请参考文献[7]。在CPU核控制方式下,在进行下一次数

据传输之前,为了保证数据传输的正确性,CPU必须查询状态位,

因此,CPU会不断的查询SPI接口状态寄存器SPISTAT中的状

态位,因此,CPU的利用率较DMA方式低。

图2

3.2Sharc系列DSP中断系统

在Sharc系列DSP中,外设接口较多,每种类型的外设接口

都会产生相应的中断。但是,DSP芯片的中断号以及其对应的中

断向量表是有限的,这就导致了中断向量的复用,即同一个中断

号,可以被分配给不同的中断源。另外,该系列DSP的中断号对

应的中断源也只是部分能被重分配。并且每一个中断号都有一

默认中断源。所以,在DMA与核控制方式下,SPI口的四个接口

在数据传输时占用相同的中断号,因此也具有相同的中断向量。

3.3软件流程及各模块功能

从SPI Flash中加载程序,必须先把工程文件编译链接得到

的ldr文件写入SPI Flash存储器中。对flash编程的程序流程图

如图2所示。在对M25P20进行擦除、写数据等写操作前,必须

设置状态寄存器中写使能位以使能写操作。在擦除M25P20后,

写使能被自动禁止,因此,在继续写数据之前,必须重新设置存储

器的状态寄存器,以写使能其状态。

在我们的系统中,程序被分成了三个模块,分别是:系统初

始化模块、对Flash操作模块和数据写入与校对模块。系统初始

化模块主要包括实现设置系统锁相环参数、设置系统中断向量

等初始化系统功能的子函数;对Flash操作模块则主要包括实

现一些对Flash状态查询、设置以及擦出等功能的子函数;数据

写入与校对模块则是实现将工程的ldr文件写入Flash,然后读

出并与原始数据进行校对等功能的子函数。

4结束语

在这提出几个值得注意的问题。一是关于使用的SPI Flash

的存储结构组织问题,具体的组织结构请参考文献,需要注意的

是在对该存储器进行编程时,需要小心一次性写入的数据量大

小,这由存储器每块(sector)的容量决定。当一次性写入的数据量

超过该容量时,会发生数据覆盖,从而导致得不到正确的写入。

二是注意该Flash芯片的写使能与片或段擦除之间的相互影

响,这在前文中已给出了叙述。三是在对Flash芯片进行操作时,

无论是擦出操作,还是写入操作,在相应操作完成后必须读取该

存储器芯片的状态寄存器,根据某些状态位的状态判断操作是

否完成。四是通过DMA方式对该存储器进行数据写入或者擦

除操作时,在根据SPI状态寄存器中状态标志判断操作已完成

后必须延迟一定的时间,因为判断DMA传输是否完成无论采

用的是DMA中断方式,还是DMA状态寄存器状态查询方式,当

DSP根据上述条件作出判断时,实际情况是数据并没有完成传

输。最后,希望通过本文,能对从事ADI公司DSP开发与应用的

相关人员提供一些帮助。

本文作者创新点:基于SPI Flash的Sharc系列DSP程序加

载,在整个系统的设计与调试过程中,无论是硬件上,还是软件部

分都遇到的问题,都一一提出了解决方案。

参考文献

[1]STMicroelectronics.M25P20[M].STMicro-electronics group of

companies,2004.

[2]Analog Device.ADSP-21368SHARC Processor Hardware

Reference[M].Analog Devices,Inc,2006.

[3]Analog Device.Visual DSP++5.0Getting Started Guide[M].

Analog Devices,Inc,2006.

[4]Analog Device.Getting Started With SHARC Processors[M].

Analog Devices,Inc,2006.

[5]薛东方,尚朝轩,何强,周相阳等。基于Visual DSP++环境Flash

在线编程实现[J]。科学技术与工程,2008,4:1095-1097。

[6]陈英,刘海昌。基于FLASH的多ADSP-TS101S程序加载[J]。

科技广场,2007,5:156-158。(下转第190页)

技术创新电阻并联得到,300V时165Ω电阻上的电压为161.7mV。以上

所选用的电阻都为1206封装。

2、电流检测——

—电流传感器

检测系统中一共使用三种不同电流传感器。首先,110V输

入电流的检测。由于输入平均电流为35A,因此选用LEM的

100A电流传感器LA100-P,其为电流型输出;第二,逆变器1(压

缩机和室外风机用)输出电流检测,输出线电流大小约为7.5A,

可选用2个LEM的LTS15-NP型电流传感器,其最大测量电流

有效值为15A,电压型输出,两个传感器分别测量任意两相,然后

计算出第三相的值;最后,逆变器2(室内风机用)只需检测其中间

直流电流(其功率较小,只有120W),电流小于1A,可选用LEM的

LTS6-NP型电流传感器,LTS6-NP量程可变,用时将其配制成

2A的量程。

3实验

由于电机采用恒压频比调速,故改变频率后,输入电压也会

相应的改变,而电压的改变是通过改变调制比来实现的。但在频

率达到50Hz时再向60Hz调频时便采用弱磁调速,即保持输入

电压200V不变。如图8为频率为50Hz和60Hz时室外风机的

电流波形

图8频率为50Hz和60Hz时室外风机的电流波形

从图中我们得出当工作频率在50Hz时,室外通风机的电

流峰值为2A,则其有效值为1.41A,而输入电压为200V,通过计

算可以得到输入功率为480W。当工作频率在60Hz时,室外风

机的输入电流峰值为2.5A,有效值为1.77A,输入电压为200V,

故通过计算可以得出通风机此时输入功率为612W。

图9频率为50Hz和60Hz时压缩机的电流波形

从图中我们得出当工作频率在50Hz时,压缩机的电流峰

值为8A,则其有效值为5.66A,而输入电压为200V,通过计算可

以得到输入功率为1957W。当工作频率在60Hz时,室外风机的

输入电流峰值为8.5A,有效值为6.01A,输入电压为200V,故通

过计算可以得出通风机此时输入功率为2080W。

4结论

本文的主要工作是机车空调电源系统的硬件设计,其重点

在于对电路的设计以及元器件的选择和对电路的调试。在提出

了电源系统整体实现方案的基础上,分别对电源系统DC/DC部

分,DC/AC部分以及检测电路与辅助电源部分进行了详细的分

析与讨论,经过实验取得了满意的实验结果。设计完成后的电源

系统能够长时间满负载工作,带动空调机组运行并且制冷。

本文作者创新点:本文讨论的是机车空调逆变电源系统的

设计与研究。本文的重点在于对硬件电路的分析与研究。

参考文献

[1]Tasi-Fu Wu,Yu-Kai Chen,“Modeling PWM DC/DC Converters

Out of Basic Converter Units”,IEEE Transactions on Power

Electronics,Vol.13,No.5,September1998,Pag.870-881

[2]D.Czarkowski and M.K.Kazimierczuk,“Circuit models of PWM

dc-dc converters,”in Proc.IEEE Nat.Aerospace and Electronics

Conf.(NAECON’92),Dayton,OH,May18-22,1992,Pag.407-413

[3]J.W.Nilsson,Electronic Circuits,4thed.New York:Addison-

Wesley,1993,ch.20

[4]Sabate J.A.,et al.Design Considerations for High-Voltage Full

Bridge Zero-voltage-switched PWM Converter.IEEE APEC’90,

1990,274-284

[5]张占松,蔡宣三,开关电源的原理与设计,电子工业出版社,

1998.7

[6]刘志刚,叶斌,梁晖,电力电子学,清华大学出版社,北京交通大

学出版社,2004.6

[7]叶斌,电力电子应用技术,清华大学出版社,2006.5

[8]钟美,张侃,王生学,电力机车空调电源技术,微计算机信息,

2006,9-2.

[9]LM193,LM293,LM293A,LM393,LM393A,LM393Y,LM2903,

LM2903Q,DUAL DIFFERENTIAL COMPARATORS,SLCSOO5E-

-JUNE1976-REVISED NOVEMBER1999

[10]HCPL-31500.5Amp Output Current IGBT Gate Drive

Optocoupler Technical Data.

作者简介:解枫(1984-),女(汉族),吉林省长春市人,现就读于北京

交通大学电气工程学院硕士。

Biography:XIE Feng(1984-),female(the Han nationality),Jilin

Province,Study in Beijing Jiaotong University the School of

Electrical Engineering,Master.

(100044北京北京交通大学电气工程学院)解枫

通讯地址:(100044北京交通大学电气工程学院)解枫

(收稿日期:2009.04.21)(修稿日期:2009.07.21)

(上接第116页)

[7]Analog Device.Visual DSP++5.0Loader and Utilities Manual

[M].Analog Devices,Inc,2006.

[8]蔡慧,王百江,康通博,张骋,蔡惠智.基于DSP芯片阵列的实时

操作系统的研究[J].微计算机信息,2009,2-2:3-4。

作者简介:雷春梅(1986-),女(汉族),湖北荆州人,硕士研究生,

主要研究方向:电工理论与新技术。

Biography:LEI Chun-mei(1986-),Female(the Han nationality),

Hubei Province,graduate student(Sichuan University)Research

area:Electrical Theory and New Technology.

(610065四川成都四川大学电气信息学院)雷春梅周群

刘谋云应俊

(School of Electrical Engineering and Information,Sichuan

University,Chengdu,610065,China)LEI Chun-mei

ZHOU Qun LIU Mou-yun YING Jun

通讯地址:(610065四川省成都市四川大学电气信息学院07级

硕士研究生)雷春梅

(收稿日期:2009.05.08)(修稿日期:2009.08.08)

用GPIO模拟SPI协议的实现

一SPI协议概括 SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议,比如AT91RM9200. 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设备的实现方式不尽相同,主要是数据改变和采集的时间不同,在时钟信号上沿或下沿采集有不同定义,具体请参考相关器件的文档。

IO口模拟SPI口

模块名称:spi.h 模块说明: c51单片机的i/o模拟spi操作 创建时间: 2005/03/09 创建者: xichen ******************************************************************************* */ #ifndef SPI_H #define SPI_H sbit SPIS_N = P2^1; sbit SPIC = P2^3; sbit SPID = P2^2; sbit SPIQ = P2^4; extern void spi_reset(); extern void spi_write(unsigned char spi_bValue); extern unsigned char spi_read();

#endif /****************************************************************************** * 模块名称:spi.c 模块说明: c51单片机的i/o模拟spi操作 创建时间: 2005/03/09 创建者: xichen ******************************************************************************* */ #include "includes.h" #define set_spi_cs() SPIS_N =1 #define clr_spi_cs() SPIS_N =0 #define set_spi_clk() SPIC =1 #define clr_spi_clk() SPIC =0 #define set_spi_di() SPID =1 #define clr_spi_di() SPID =0 #define read_spi_do() SPIQ

单片机软件模拟SPI接口—加深理解SPI总线协议

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 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 i<8 i++)/* */ { if(add&0x80==1) SDO=1 else SDO=0 SCK=0 /* */ SCK=1 add<<= 1 } SCK=1 /* 1 */

51单片机模拟 SPI 总线的方法

51单片机模拟 SPI 总线的方法 1 引言 SPI(Serial Peripheral Interface--串行外设接口)总线系统是一种同步串行外设接口,它可以使MCU与各种外围设备以串行方式进行通信以交换信息。外围设置FLASHRAM、网络控制器、LCD显示驱动器、A/D转换器和MCU等。SPI总线系统可直接与各个厂家生产的多种标准外围器件直接接口,该接口一般使用4条线:串行时钟线(SCK)、主机输入/从机输出数据线MISO、主机输出/从机输入数据线MOSI和低电平有效的从机选择线SS(有的SPI接口芯片带有中断信号线INT或INT、有的SPI接口芯片没有主机输出/从机输入数据线MOSI)。由于SPI系统总线一共只需3~4位数据线和控制即可实现与具有SPI总线接口功能的各种I/O器件进行接口,而扩展并行总线则需要8根数据线、8~16位地址线、2~3位控制线,因此,采用SPI总线接口可以简化电路设计,节省很多常规电路中的接口器件和I/O口线,提高设计的可靠性。由此可见,在MCS51系列等不具有SPI接口的单片机组成的智能仪器和工业测控系统中,当传输速度要求不是太高时,使用SPI总线可以增加应用系统接口器件的种类,提高应用系统的性能。 2 SPI总线的组成 利用SPI总线可在软件的控制下构成各种系统。如1个主MCU和几个从MCU、几个从MCU 相互连接构成多主机系统(分布式系统)、1个主MCU和1个或几个从I/O设备所构成的各种系统等。在大多数应用场合,可使用1个MCU作为控机来控制数据,并向1个或几个从外围器件传送该数据。从器件只有在主机发命令时才能接收或发送数据。其数据的传输格式是高位(MSB)在前,低位(LSB)在后。SPI总线接口系统的典型结构。 当一个主控机通过SPI与几种不同的串行I/O芯片相连时,必须使用每片的允许控制端,这可通过MCU的I/O端口输出线来实现。但应特别注意这些串行I/O芯片的输入输出特性:首先是输入芯片的串行数据输出是否有三态控制端。平时未选中芯片时,输出端应处于高阻态。若没有三态控制端,则应外加三态门。否则MCU的MISO端只能连接1个输入芯片。其次是输出芯片的串行数据输入是否有允许控制端。因此只有在此芯片允许时,SCK脉冲才把串行数据移入该芯片;在禁止时,SCK对芯片无影响。若没有允许控制端,则应在外围用门电路对SCK进行控制,然后再加到芯片的时钟输入端;当然,也可以只在SPI总线上连接1个芯片,而不再连接其它输入或输出芯片。 3 在MCS-51系列单片机中的实现方法 对于不带SPI串行总线接口的MCS-51系列单片机来说,可以使用软件来模拟SPI的操作,包括串行时钟、数据输入和数据输出。对于不同的串行接口外围芯片,它们的时钟时序是不同的。对于在SCK的上升沿输入(接收)数据和在下降沿输出(发送)数据的器件,一般应将其串行时钟输出口P1.1的初始状态设置为1,而在允许接收后再置P1.1为0。这样,MCU 在输出1位SCK时钟的同时,将使接口芯片串行左移,从而输出1位数据至MCS-51单片机的P1.3口(模拟MCU的MISO线),此后再置P1.1为1,使MCS-51系列单片机从P1.0(模拟MCU 的MOSI线)输出1位数据(先为高位)至串行接口芯片。至此,模拟1位数据输入输出便宣告完成。此后再置P1.1为0,模拟下1位数据的输入输出……,依此循环8次,即可完成1次通过SPI总线传输8位数据的操作。对于在SCK的下降沿输入数据和上升沿输出数据的器件,则应取串行时钟输出的初始状态为0,即在接口芯片允许时,先置P1.1为1,以便外围接口芯片输出1位数据(MCU接收1位数据),之后再置时钟为0,使外围接口芯片接收1位数据(MCU发送1位数据),从而完成1位数据的传送。 图2所示为MCS-51系列单片机与存储器X25F008(E2PROM)的硬件连接图,图2中,P1.0

51单片机模拟spi串行接口程序

51单片机模拟spi串行接口程序 51单片机模拟spi串行接口程序,在keilc51下编写 sbit CS=P3^5; sbit CLK= P1^5; sbit DataI=P1^7; sbit DataO=P1^6; #define SD_Disable() CS=1 //片选关 #define SD_Enable() CS=0 //片选开 unsigned char SPI_TransferByte(unsigned char val) { unsigned char BitCounter; for(BitCounter=8; BiCounter!=0; BitCounter--) { CLK=0; DataI=0; // write if(val&0x80) DataI=1; val<<=1; CLK=1; if(DataO)val|=1; // read } CLK=0; return val; }sbit CLK= P1^5; sbit DataI=P1^7;

sbit DataO=P1^6; #define SD_Disable() CS=1 //片选关 #define SD_Enable() CS=0 //片选开 unsigned char SPI_TransferByte(unsigned char val) { unsigned char BitCounter; for(BitCounter=8; BiCounter!=0; BitCounter--) { CLK=0; DataI=0; // write if(val&0x80) DataI=1; val<<=1; CLK=1; if(DataO)val|=1; // read } CLK=0; return val; } sbit CLK= P1^5; sbit DataI=P1^7; sbit DataO=P1^6; #define SD_Disable() CS=1 //片选关 #define SD_Enable() CS=0 //片选开

模拟SPI程序

写程序: void SPIx_WriteByte(u8 TxData) { u8 j=0; SPI_FLASH_CLK_LOW(); //clk=0 if(TxData&0x80) {SPI_FLASH_DI_HIGH();} //mosi=1 else {SPI_FLASH_DI_LOW();} //mosi=0 for(j=0;j<3;j++); //延时 SPI_FLASH_CLK_HIGH(); //clk=1,一个上升沿写入一位for(j=0;j<5;j++); //延时 SPI_FLASH_CLK_LOW(); //clk=0 if(TxData & 0x40) {SPI_FLASH_DI_HIGH();} //mosi=1 else {SPI_FLASH_DI_LOW();} //mosi=0 for(j=0;j<3;j++); //延时 SPI_FLASH_CLK_HIGH(); for(j=0;j<5;j++); SPI_FLASH_CLK_LOW(); if(TxData&0x20) {SPI_FLASH_DI_HIGH();} //mosi=1 else {SPI_FLASH_DI_LOW();} //mosi=0 for(j=0;j<3;j++); //延时 SPI_FLASH_CLK_HIGH(); for(j=0;j<5;j++); SPI_FLASH_CLK_LOW(); if(TxData&0x10) {SPI_FLASH_DI_HIGH();} //mosi=1 else {SPI_FLASH_DI_LOW();} //mosi=0 for(j=0;j<3;j++); //延时 SPI_FLASH_CLK_HIGH(); for(j=0;j<5;j++); SPI_FLASH_CLK_LOW(); if(TxData&0x08) {SPI_FLASH_DI_HIGH();} //mosi=1 else

模拟SPI程序

写程序: voidSPIx_WriteByte(u8 TxData) { u8 j=0; SPI_FLASH_CLK_LOW(); //clk=0 if(TxData&0x80) {SPI_FLASH_DI_HIGH();} //mosi=1 else {SPI_FLASH_DI_LOW();} //mosi=0 for(j=0;j<3;j++); //延时 SPI_FLASH_CLK_HIGH(); //clk=1,一个上升沿写入一位for(j=0;j<5;j++); //延时 SPI_FLASH_CLK_LOW(); //clk=0 if(TxData & 0x40) {SPI_FLASH_DI_HIGH();} //mosi=1 else {SPI_FLASH_DI_LOW();} //mosi=0 for(j=0;j<3;j++); //延时 SPI_FLASH_CLK_HIGH(); for(j=0;j<5;j++); SPI_FLASH_CLK_LOW(); if(TxData&0x20) {SPI_FLASH_DI_HIGH();} //mosi=1 else {SPI_FLASH_DI_LOW();} //mosi=0 for(j=0;j<3;j++); //延时 SPI_FLASH_CLK_HIGH(); for(j=0;j<5;j++); SPI_FLASH_CLK_LOW(); if(TxData&0x10) {SPI_FLASH_DI_HIGH();} //mosi=1 else {SPI_FLASH_DI_LOW();} //mosi=0 for(j=0;j<3;j++); //延时 SPI_FLASH_CLK_HIGH(); for(j=0;j<5;j++); SPI_FLASH_CLK_LOW(); if(TxData&0x08) {SPI_FLASH_DI_HIGH();} //mosi=1 else

SPI总线从机接口实时模拟的实现

SPI总线从机接口实时模拟的实现 收稿日期:2005-09-15 作者简介:郭静华(1976-),女,黑龙江人,硕士研究生,研究方向为电子技术在农业中的应用。zhongguoguojinghua@126.com *通讯作者E-mail:ouyangbl@126.com 郭静华,欧阳斌林* (东北农业大学工程学院,哈尔滨 150030) 摘要:MCS51系列单片机由于不带SPI串行总线接口而限制了其在SPI总线接口器件的使用。文章介绍了 SPI串行总线的特征和时序,并以双CPU通信为例,给出了在51系列单片机上利用中断实现SPI串行总线通信的 方法和软件设计程序,从机在实现SPI接口同时还可以完成其他操作任务。 关键词:SPI总线;中断系统;89C52单片机中图分类号:TP23 文献标识码:A SPI (Serialperipheralinterface)总线是Motorola公司提出的一个同步串行外设接口,用于CPU与各种外围器件进行全双工、同步串行通讯。SPI可以同时发出和接收串行数据,它只需4条线就可以完成MCU与各种外围器件的通讯。这些外围器件可以是简单的TTL移位寄存器,复杂的LCD显示驱动器,A/D、D/A转换子系统或其他的 MCU[1] 。 利用SPI总线可在软件的控制下构成各种系统。如1个主MCU和几个从MCU、几个从MCU相互连接构成多主机系统(分布式系统)、1个主 MCU和1个或几个从I/O设备所构成的各种系统 等。在大多数应用场合,可使用1个MCU作为主控机来控制数据,并向1个或几个从外围器件传送该数据。从器件只有在主机发命令时才能接收或发送数据,其数据的传输格式是高位(MSB)在前,低位(LSB)在后。 一般而言,SPI总线接口主要用于主从分布式的通信网络,只需4根I/O接口线,即可完成主从总线之间的数据通信。这4根接口线分别为:时钟线 (SCLK)、数据输入线(MOSI)(主机输出从机输入)、数据输出线(MOSO)(主机输入从机输出)、片选线 (SS)。根据时钟和触发不同SPI总线可以分为4种,图1是其中一种SPI工作时序。 1系统介绍 MCS51等系列单片机由于不带SPI串行总线接 口而限制了其在SPI总线接口器件的使用,但可以使用软件来模拟SPI的操作,包括串行时钟、数据输入和数据输出[2]。本文所介绍的SPI总线实时系统既是在89C52单片机之间实现SPI总线串行通信的功能。系统结构见图2。重点介绍从机SPI的实现。 主CPU的P3.4(选通线)接到从机的INT0口,P3.5 (时钟线)接到从机的INT1口。选通和时钟都采用中断方式,以提高系统的实时性能。 图1SPI时序 Fig.1TheSPIworksequence 图2系统结构 Fig.2Systemstructure 第38卷第5期东北农业大学学报38(5):669 ̄671 2007年10月JournalofNortheastAgriculturalUniversity Oct.2007 文章编号 1005-9369 (2007)05-0669- 03

单片机模拟SPI程序

时钟相位(CPHA)和时钟极性(CPOL)的不同组合使得SPI传输有了4种方式如果CPOL =0,SCK 引脚在空闲状态保持低电平; 如果CPOL =1,SCK 引脚在空闲状态保持高电平 时序图如下: (一)A VR单片机实现代码 //IO端口定义 #define SPI_SCK PC0 #define SPI_MOSI PC1 #define SPI_MISO PC2 #define SPI_DDR DDRC #define SPI_PORT PROTC #define SPI_PIN PINC //端口操作符定义 #define SCK_SET SPI_PORT|=_BV(SPI_SCK) #define SCK_CLR SPI_PORT&=~_BV(SPI-SCK) #define MOSI_SET SPI_PORT|=_BV(SPI_MOSI) #define MOSI_CLR SPI_PORT&=~_BV(SPI_MOSI)

#define MISO_PIN PINC&_BV(SPI_MISO) #define DELAY_BUS //如需要延时,用延时函数替代此符号 //模式1:CPOL=1 CPHA=1 void spi_init(void) { SCK_SET; SPI_DDR|=_BV(SPI_MOSI)|_BV(SPI_SCK); } uint8_t spi_readwrite_byte(uint8_t data) { uint8_t i,ret=0; for(i=0;i<8;i++) { //下降沿模拟 if(data&0x80)//设置输出 MOSI_SET; else MOSI_CLR; SCK_CRL;//SCK产生下降沿 DELAY_BUS; //上升沿模拟 ret<<=1; if(MISO_PIN)//读数据 ret|=1; SCK_SET; //SCK产生上升沿 data<<=1; DELAY_BUS; } return ret; } //模式2:CPOL=0 CPHA=1 void spi_init(void) { SCK_CLR; SPI_DDR|=_BV(SPI_MOSI)|_BV(SPI_SCK); }

单片机IO口模拟SPI四种模式的程序

单片机IO口模拟SPI四种模式的程序 #include "iom8535v.h" #define _CPOL 1 #define _CPHA 0 #define SCK_IO DDRA|=0X01 #define MOSI_IO DDRA|=0X02 #define MISO_IO DDRA&=0XFB #define SSEL_IO DDRA|=0X08 #define SCK_D(X) (X?(PORTA|=0X01):(PORTA&=0XFE)) #define MOSI_D(X) (X?(PORTA|=0X02):(PORTA&=0XFD)) #define SSEL_D(X) (X?(PORTA|=0X08):(PORTA&=0XF7)) #define MISO_I() (PINA&0X04) void delay() { unsigned char m,n; for(n=0;n<5;n++); for(m=0;m<100;m++); } /************************************************ 端口方向配置与输出初始化 ************************************************/ void SPI_Init(void) { SCK_IO ; MOSI_IO ; MISO_IO ; SSEL_IO ; SSEL_D(1); MOSI_D(1); #if _CPOL==0 SCK_D(0); #else SCK_D(1); #endif } /********************************************** 模式零写数据 ***********************************************/ #if _CPOL==0&&_CPHA==0 //MODE 0 0 void SPI_Send_Dat(unsigned char dat) {

使用MCU的GPIO模拟SPI

用GPIO模拟SPI协议的实现 一SPI协议概括 SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议,比如AT91RM9200. 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系统要稍微复杂一些。

模拟SPI口实现对CAN控制器mcp2515的操作程序

模拟SPI口实现对CAN控制器mcp2515的操作程序(2009-06-18 11:33:20)标签:can总线mcp2515参考程序it #include "2515.h" #include "SPI.h" #include "reg51.h" #include "Function.h" #define CAN_10Kbps 0x31 #define CAN_25Kbps 0x13 #define CAN_50Kbps 0x09 #define CAN_100Kbps 0x04 #define CAN_125Kbps 0x03 #define CAN_250Kbps 0x01 #define CAN_500Kbps 0x00 //void SPIReset(void); //void SPIByteWrite(unsigned char ,unsigned char ); //unsigned char SPIByteRead(unsigned char ); unsigned char dummy; void Init2515(unsigned int IDF) { SPIReset(); delay_ms(1); //SPIByteWrite(CANCTRL,0x80);//CAN工作在配置模式 SPIByteWrite(RXM0SIDH,0x00); SPIByteWrite(RXM0SIDL,0x00); SPIByteWrite(RXF0SIDH,0x00); SPIByteWrite(RXF0SIDL,0x00); SPIByteWrite(RXM1SIDH,0x00); SPIByteWrite(RXM1SIDL,0x00); SPIByteWrite(RXF2SIDH,0x00); SPIByteWrite(RXF2SIDL,0x00);

IO口模拟SPI主从机例程

IO口模拟spi主从机通讯例程 下面这两幅图是,关于SPI数据读取或发送的时序图。 1、主机io口模拟spi通讯例程 //**spi io 口初始化**// void SPI_init(void) { gpio_configure_fpin(SPI_MISO, IO_TYPE_INPUT);//配置成输入模式gpio_configure_fpin(SPI_MOSI, IO_OUTPUT_1);//配置成输出模式gpio_configure_fpin(SPI_SCK, IO_OUTPUT_1); //配置成输出模式 gpio_configure_fpin(SPI_CS, IO_OUTPUT_1); //配置成输出模式 clr_spi_GPIO(SPI_SCK);//拉低SPI_SCK set_spi_GPIO(SPI_CS);//拉高SPI_SCK clr_spi_GPIO(SPI_MOSI);//拉低SPI_MOSI } //**主机spi读取一字节api**// unsigned char SPI_ReadByte(void){ unsigned char i,rByte=0; clr_spi_GPIO(SPI_CS); for(i=0;i<8;i++){ clr_spi_GPIO(SPI_SCK);//clr_spi_sck; delay_us(3); rByte<<=1; if(MISO_is_status())// //M16 MISO---PB6 rByte|=1;

set_spi_GPIO(SPI_SCK);//set_spi_sck; delay_us(3); } clr_spi_GPIO(SPI_SCK); set_spi_GPIO(SPI_CS); return rByte; } //** 读取miso 的电平**// char MISO_is_status(void) { if(red_spi_GPIO(SPI_MISO))// return 1; else return 0; } //**主机spi写入一字节api**// void SPI_WriteByte(unsigned char wByte){ unsigned char i; clr_spi_GPIO(SPI_CS); for(i=0;i<8;i++){ clr_spi_GPIO(SPI_SCK);// delay_us(3);// if(wByte&0x80){ set_spi_GPIO(SPI_MOSI);// } else{ clr_spi_GPIO(SPI_MOSI);// } wByte=wByte<<1; set_spi_GPIO(SPI_SCK);//set_spi_sck; delay_us(3);// } clr_spi_GPIO(SPI_SCK); set_spi_GPIO(SPI_CS); } //////////////////////////////////////////////////////////////////////////////////// 注意,我写的主从机的io口对接如下 主机io 从机io SPI_MISO ------------------------- SPI_MISO SPI_MOSI --------------------------- SPI_MOSI SPI_SCK --------------------------- SPI_SCK SPI_CS -------------------------- SPI_CS 可能有的人对上面的io口对接的方式感到奇怪,请仔细看我对这几个io口做的初始化设置

基于单片机I/O口模拟的SPI串行通信实现

基于单片机I/O口模拟的SPI串行通信实现 【摘要】基于单片机或ARM芯片的普通I/O口,模拟实现SPI串行通信。模拟SPI通信需严格时钟时序,只有当主器件模拟的SPI时序与从器件的SPI时序完全一致时,才能实现SPI通信的正常数据交换。 【关键词】I/O口;SPI时序;主器件;从器件 1.引言 SPI(SeIial Peripheral Interfa即串行外围设备接口)总线技术是一种高效率的串行接口技术,主要用于扩展外设和进行数据交换。在许多单片机中,已经作为一种标准配置。但某些应用非常广泛的单片机并不带标准SPI接口,这样就限制了在这些系统中使用带SPI接口的器件。解决该问题的方法是使用单片机的普通I/O口通过软件模拟的方式实现SPI串口通信,以满足应用需求。此外,采用标准的SPI接口有很多局限性,在设备外围开发和扩展增加负担,而通过I/O口模拟实现SPI通信将不受这些限制,可轻松实现其外围开发和扩展,灵活性更大;通过I/O口模拟SPI通信,其通用性和可移植性强,实现简单、方便。 2.SPI总线概述 SPI通信的总线形式一般采用4线制,即为使能控制线SN、始终控制线SCLK、主出从入线MOSI和主入从出线MISO。可实现一个主控制器挂接多个从控制器,如图1所示,为SPI总线框图。 使能控制线SN完成对从控制器的片选,当需要与某个控制通信时,将SN 置于打开(高或者低,根据不同芯片分别对待)状态,使从控制器处于可通信状态,同时时钟控制线SCLK用于控制SPI通信的时序,该时序需与从控制器的SPI时序保持完全一致,这样才能保证SPI通信的实现。主出从入线MOSI为SPI 串口通信数据输出线,主入从出线MISO为SPI串口通信数据输入线。 当主控制器MCU只与一个从控制器通信或所选从控制器无使能控制端时,使能控制线SN可不用,即3线制SPI通信,也可实现模拟SPI通信。 3.SPI通信时序控制 相对于标准的SPI通信接口,通过I/O口模拟的SPI通信,其模拟时序要求很严格,即主控制器模拟的SPI时序必须与从控制器的SPI通信时序保持一致,否则会导致在通信时出现接收不到数据或是接收数据错误的情况。SPI通信的时序控制是通过时钟控制线SCLK来模拟完成的。所以说,严格、标准的SPI时序是完成SPI通信的关键。 时钟控制线SCLK可以是高电平触发也可以是低电平触发,该模式由从控制

spi四种模式io模拟时序

spi四种模式io模拟时序 #include “iom8535v.h”#define _CPOL 1#define _CPHA 0#define SCK_IO DDRA|=0X01#define MOSI_IO DDRA|=0X02#define MISO_IO DDRA=0XFB#define SSEL_IO DDRA|=0X08#define SCK_D(X) (X?(PORTA|=0X01):(PORTA=0XFE))#define MOSI_D(X) (X?(PORTA|=0X02):(PORTA=0XFD))#define SSEL_D(X) (X?(PORTA|=0X08):(PORTA=0XF7))#define MISO_I() (PINA0X04) void delay(){unsigned char m,n;for(n=0;n5;n++);for(m=0;m100;m++);}/******************************** ****************端口方向配置与输出初始化 ************************************************/void SPI_Init(void){SCK_IO ; MOSI_IO ;MISO_IO ; SSEL_IO ;SSEL_D(1);MOSI_D(1);#if _CPOL==0SCK_D(0);#elseSCK_D(1);#endif}/****************************** ****************模式零写数据 ***********************************************/#if _CPOL==0_CPHA==0 //MODE 0 0 void SPI_Send_Dat(unsigned char dat){unsigned char n;for(n=0;n8;n++){SCK_D(0);if(dat0x80)MOSI_D(1);else MOSI_D(0);dat=1;SCK_D(1);}SCK_D(0);}/******************************** *************模式零读数据 *********************************************/unsigned char SPI_Receiver_Dat(void){unsigned char n

MCU的GPIO模拟SPI源代码

MCU的GPIO模拟SPI源代码 写程序: void SPIx_WriteByte(u8 TxData) { u8 j=0; SPI_FLASH_CLK_LOW(); //clk=0 if(TxData&0x80) {SPI_FLASH_DI_HIGH();} //mosi=1 else {SPI_FLASH_DI_LOW();} //mosi=0 for(j=0;j<3;j++); //延时 SPI_FLASH_CLK_HIGH(); //clk=1,一个上升沿写入一位 for(j=0;j<5;j++); //延时 SPI_FLASH_CLK_LOW(); //clk=0 if(TxData & 0x40) {SPI_FLASH_DI_HIGH();} //mosi=1 else {SPI_FLASH_DI_LOW();} //mosi=0 for(j=0;j<3;j++); //延时 SPI_FLASH_CLK_HIGH();

for(j=0;j<5;j++); SPI_FLASH_CLK_LOW(); if(TxData&0x20) {SPI_FLASH_DI_HIGH();} //mosi=1 else {SPI_FLASH_DI_LOW();} //mosi=0 for(j=0;j<3;j++); //延时SPI_FLASH_CLK_HIGH(); for(j=0;j<5;j++); SPI_FLASH_CLK_LOW(); if(TxData&0x10) {SPI_FLASH_DI_HIGH();} //mosi=1 else {SPI_FLASH_DI_LOW();} //mosi=0 for(j=0;j<3;j++); //延时SPI_FLASH_CLK_HIGH(); for(j=0;j<5;j++); SPI_FLASH_CLK_LOW(); if(TxData&0x08)

GPIO模拟SPI通讯接口的驱动

GPIO模拟SPI通讯接口的驱动 一,某些时候我们会不得不使用GPIO来模拟SPI,I2C等通讯接口,如本例中,需要使用SPI接口发送9位的数据,如果使用linux内核提供的SPI子系统来做这个驱动是无法实现9位传输数据的。 二,用GPIO模拟SPI总的来说是比较简单,把相应的管脚配置成GPIO功能,再按需要配置管脚的输入输出方向,然后根据SPI总线的时序设定IO口的电平。 三,驱动代码如下,以备今后作参考: (linux-2.6.28 + TCC8900, 这个驱动是用来控制LCD的初始化的(型号为LW350AC9001)) #include #include #include #include #include #include #include #include #include #define PDEBUG #ifdef PDEBUG #define PLOG(fmt,args...) printk(fmt,##args) #else #define PLOG(fmt,args...) /*do nothing*/ #endif #define SPI_CMD 0 #define SPI_DATA 1 #define FUN_GPIO 0 #define PIN_SDO 15 //GPIOF[15] #define PIN_SDI 14 #define PIN_SCLK 16 #define PIN_CS 29 //GPIOC[29] #define GPC_BASE 0xF0102080 #define GPF_BASE 0xF0102140 #define OFFSET_DAT 0x0 #define OFFSET_EN 0x4 #define OFFSET_FUN0 0x24 #define OFFSET_FUN1 0x28 #define OFFSET_FUN2 0x2c #define OFFSET_FUN3 0x30 // select pin used for gpio

模拟SPI通讯程序(For_msp430)

/**************************************************************************** keyboard for MSP430 Designed by CUGer--Mrs.Wei ****************************************************************************/ #include "msp430x16x.h" #define uint unsigned int #define uchar unsigned char #define SCLK_UP P3OUT |= BIT0 //SCK上升沿 #define SCLK_DOWN P3OUT &= ~BIT0 //SCK下降沿 #define CS_UP P3OUT |= BIT1 #define CS_DOWN P3OUT &= ~BIT1 #define Data_UP P2OUT |= BIT3 #define Data_DOWN P2OUT &= ~BIT3 void Sent_Data(uint data) { while(1) { CS_UP; uint i; for(i=16;i>0;i--) { SCLK_UP; //SCK上升沿 if(data&BIT0) //从最低位开始发送数据 Data_UP; //P3.2OUT1; else Data_DOWN; //P3.2OUT0 SCLK_DOWN; //SCK下降沿 data>>=1; } CS_DOWN ; } } /******************************************************************/

相关主题
相关文档
最新文档