当前位置:文档之家› DSP的SPI接口

DSP的SPI接口

DSP的SPI接口
DSP的SPI接口

2014~2015学年第一学期

《DSP原理及应用》

课程设计报告

题目:DSP的SPI接口班级:11电子信息(1)

电气工程学院

2014年11月

《DSP原理及应用》任务书

课题名称DSP的SPI接口

指导教师陶沙

执行时间2014~2015学年第一学期第9 周

学生姓名学号承担任务评分

系统方案设计及协调

DA转换实验

DA转换实验

DA转换实验

EEPROM存储区访问

EEPROM存储区访问

EEPROM存储区访问

论文撰写

设计要求1完成SPI接口的DA转换实验和EEPROM存储区访问。2完成硬件原理图,撰写课程设计说明书。

目录

目录 (1)

摘要 (1)

第1章硬件电路设计 (3)

1.1 TMS320LF2407A的介绍 (3)

1.2 TLV5617的介绍 (4)

1.3 DA转换系统原理图 (5)

第2章软件的设计 (6)

2.1 程序流程图 (6)

2.2 SPI 接口的DA 实验编程 (6)

第3章SPI接口的EEPROM存储区访问 (8)

3.1 接口特点 (8)

3.2 硬件设计 (8)

3.3 软件设计 (8)

总结...................................................................................... 错误!未定义书签。参考文献................................................................................ 错误!未定义书签。附录...................................................................................... 错误!未定义书签。

1

摘要

数字信号处理就是用数值计算的方式对信号进行加工的理论和技术,它的英文原名叫digital signal processing,简称DSP。它是集成专用计算机的一种芯片,只有一枚硬币那么大。有时人们也将DSP看作是一门应用技术,称为DSP技术与应用。介绍TMS320LF2407A的SPI的D/A转换芯片采用TLV5617进行数字到模拟的转换通过观察输出的结果来验证通信和转换的情况。TLV5617是单极性,10位串口DA,所以生成的正弦波数据要换算到TLV5617的数据范围,而且根据TLV5617要求的数据格式还要对换算后的数据做相应的变换才能最终通过SPI接口发送给TLV5617.在这个应用中SPI用于控制TLV5617工作,所以配置为主模式。从TLV5617的控制时序中可以发现串行数据在时钟的上升沿锁存。因此SPI时钟配置选择无延下降沿即SPI在时钟的下降沿发送数据在时钟的上升沿数据被锁存在TLV5617。本设计对DA转换的工作原理的分析以及对DSP的数模转换系统进行功能分析设计出数模转换接口的系统框图硬件电路图和软件程序。DSP的串行外设接口(SPI)完成EEPROM的存储区访问。

关键词:数字信号处理器串行外设接口D/A转换TLV5617 EEPROM

2

第1章硬件电路设计

1.1 TMS320LF2407A的介绍

TMS320LF2407A的D/A转换是基于2407的SPI接口以及TLV5617芯片里完成。SPI参与数据传输的寄存器有9个,其中SPICCR、SPICTL用于设置SPI 的工作状态工作方式、数据长。作为主器件时,时钟模式的选择要参考工作方式。SPIBRR用于设定SPI的波特率;SPISTS反映数据传输的状态;SPIRXBUF、SPITXBUF用于数据的接收和发送;SPIDAT为数据的发送/接收缓冲寄存器。

(1)2407A的SPI工作方式和时钟模式

工作方式:2407A的SPI功能模块是一种真正的同步串行接方式无延时上升沿有延时上升沿无延时下降沿有延时下降沿SPICLK信号上升沿发送数据,下降沿接00收数据提前SPICLK信号上升沿半个周期发送数据,上升沿接收数据SPICLK信号下降沿发送数据,上升沿接01口,可以工作于主动和从动方式。将SPICTL寄存器的位2(MASTER/SLA VE)设置为1,即选择了主动工作方式,2407A 作为主器件;反之,为从动方式,2407A作为从器件。当SPI工作在主动方式时,SPICLK为时钟信号输出端,与从器件的时钟信号输入引脚相连接,二者共用2407A的时钟信号。SPI数据传输由第30、32、33、35引脚完成。引脚功能见表1。

表1 引脚功能表

引脚名称:SPISIMO(30引脚)SPISOMI(32引脚)SPISTE(33引脚)SPICLK(35引脚)

2407A数据字长度可以是1到16位,收发数据的功能从动输入/主动输出从动输出

3

/主动输入从动发送使能串行时钟输入/输出位数由SPI的配置控制寄存器SPICCR的低四位(SPICHAR3~SPICHAR0)决定。在二进制中,这四位共有16种组合,每一个组合对应一种数据长度,比如:组合是0000时,规定收发数据的位数是1位;当组合是1111时,就规定了收发数据位数为16位。SPI数据的收发都经过发送/接收缓冲寄存器SPIDAT。SPIDAT是一个16位寄存器,SPI发送采用左对齐方式,所以当要发送的数据小于16位时,需对要发送的数据进行调整,有效位要从高位开始放置(靠左),无效位可为随意的数据。

(2) 时钟模式

SPI的时钟模式有四种。时钟模式的选择由配置控制寄存器SPICCR的时钟极性位(位6:CLOCKPO2LARITY)和接口操作控制寄存器SPICTL的时钟相位位(位3:CLOCKPHASE)的组合状态来决定。

图2 SPI数据传输格式时序

波特率的设定要参考外设的最大传输频率。通过向波特率寄存器(SPIBRR)写入设定值,就可以得到不同的波特率。波特率计算公式如下:SPI波特率=SYSCLK/(SPIBRR+1)(3ΦSPIBRRΦ127)(SPISPI波特率=SYSCLK/4BRR=0,1,2时)其中,SPIBRR为SPI模块的SPIBRR寄存器中的内容,SYSCLK为倍频或分频后的系统时钟频率。

1.2 TLV5617的介绍

TLV5617A是带有灵活3线串行接口的双10位电压输出数/模转换数,DAC 串行接口可与TMS320 SPITM QSPIM和MiscrowaresTM的串行端口兼容。它可用含有4个控制位和10个数据位的串行16位字符串编程。

其特点

双10位电压输出数/模转换器DAC:可编程的内部基准,可编程的稳定时

4

间,快速方式2.5s,慢速方式12s,可与TMS320和SPITM串行端口兼容

应用范围:数据伺服系统控制回路,数据偏置和增益调节器,工业处理控制,机械和运作控制器件,海量存储器一般功能TLV5617A是一个基于串联电阻结构的双10位电源的DAC,它由一个串行接口一个速度和掉电控制逻辑一个电阻字符串和一个轨对轨的输出缓冲器组成输出电压全额度由内部基准决定由一下公式给出:

2REF CODE/0*1000【v】

其中REFSHI 电压基准,CODE是在0x000至0xFFC范围内的数字输入值一次上电复位初始化内部锁存至置位状态所有位均为0。

串行接口

CS引脚的下降沿开始将数据一位接一位从最高有效位开始转移到在SCLK 引脚的下降沿上的内部寄存器中在16位数据传送完或CS上升时转移寄存器的内部被移入目标锁存DACA DACB缓冲器或控制中这取决于数据字中的控制位。

转换系统原理图

1.3 DA

5

第二章软件的设计

2.1 程序流程图

图4 SPI模块软件流程

当SPICTL的使能发送允许位TALK位为1时,写数据到SPIDAT或SPITXBUF就启动了SPISIMO引脚的数据发送,数据从SPIDAT的最高位依次发送出去。在数据移出SPIDAT时,将置位SPI的接口状态寄存器SPISTS的中断标志位SPIINTFLAG;若中断使能,将发生中断事件。2407A发送数据的状态可以用两种方法检测:一是中断方式,二是查询方式。查询方式查询SPI中断标志位SPIINTFLAG是否为1,若为1,则数据发送完毕。

2.2 SPI 接口的DA实验编程

DA转换程序#include "global.c" void SystemInit(); void Timer1Init(); void KickDog(); void SPI_Init(); void DA_OUT(unsigned CHANNEL,unsigned int RNG,unsigned int SPI_DATA); int numled0=200; unsigned int t0=0,i=0; int V oltage=0; main() { SystemInit(); //系统初始化

6

MCRA=MCRA & 0xC0FF; //IOPB0-6设为IO口模式PBDA TDIR=0xFFC2; //所有LED=0 PBDA TDIR=PBDATDIR | 0x003D; //所有LED=1 SPI_Init(); // CreateDASigal(); /* while(1) { CreateDASigal(); i=10; for(i=0;i<100;i++); } */ Timer1Init(); //定时器初始化asm(" CLRC INTM "); while(1); } void SystemInit() { asm(" SETC INTM "); //关闭总中断asm(" CLRC SXM "); //禁止符号位扩展asm(" CLRC CNF "); //B0块映射为on-chip DARAM asm(" CLRC OVM "); //累加器结果正常溢出SCSR1=0x87FE; //系统时钟CLKOUT=20*2=40M //打开ADC,EV A,EVB,CAN和SCI的时钟WDCR=0x006F; //禁止看门狗,看门狗时钟64分频KickDog(); //初始化看门狗IFR=0xFFFF; //清除中断标志IMR=0x0003; //打开中断2 } void Timer1Init() { EV AIMRA=0x0080; // 定时器1周期中断使能EV AIFRA=0xFFFF; // 清除中断标志GPTCONA=0x0000; T1PR=2500; // 定时器1初值,定时0.4us*2500=1ms T1CNT=0; T1CON=0x144E; //增模式, TPS系数40M/16=2.5M,T1使能} void SPI_Init() //SPI-DA初始化{ MCRB=MCRB | 0x0014; //SPISIMO,SPICLK特殊功能方式PBDATDIR=PBDATDIR | 0x0002; //CS_DA=1 SPICCR=0x004a; //11bit数据SPICTL=0x0006; //禁止中断SPIBRR=0x0027; //1M波特率,40M/40=1M SPICCR=SPICCR | 0x80; } void DA_OUT(unsigned CHANNEL,unsigned int RNG,unsigned int SPI_DATA) { unsigned char flag=0; SPITXBUF=(CHANNEL<<14)|(RNG<<13)|(SPI_DATA<<5) ; //bit10,9~CHANNEL;bit8~RNG倍数while(1) { flag=SPISTS&0x40; if(flag==0x40) break; } SPIRXBUF=SPIRXBUF; //虚读寄存器以清除中断标志PBDATDIR=PBDATDIR & 0xFFFD; //CS_DA=0,更新模拟信号输出for(i=0;i<5;i++); //延时PBDATDIR=PBDATDIR | 0x0002; //CS_DA=1,锁存数据} void c_int2() //定时器1中断服务程序{ if(PIVR!=0x27) { asm(" CLRC INTM "); return; } T1CNT=0; numled0--; if(numled0==0) { numled0=200; if((PBDATDIR & 0x0001)==0x0001) PBDATDIR=PBDATDIR & 0xFFFE; //IOPB0=0;LED灭else PBDATDIR=PBDATDIR |0x0101; //IOPB0=1;LED亮} if(V oltage<0) V oltage=0; DA_OUT(0,0,V oltage); //V oltage范围0-255对应0-3.3V DA_OUT(1,0,V oltage); //V oltage范围0-255对应0-3.3V。

7

第三章SPI接口的EEPROM存储区访问

3.1 SPI接口特点

TMS320F241型DSP是目前应用比较广泛的一款定点DSP,它具有20MIPS 的指令执行速度,强大的内部事件管理器、I/O端口和其他外围设备。其中,串行外设接口(SPI)是一个高速同步串行输入/输出(I/O)端口,它允许一个具有可编程长度(1到16位)的串行位流,以可编程的位传送速率从设备移入或移出。SPI通常用于DSP控制器和外部器件或其它控制器间的通讯。

在开发DSP系统时,某些情况下会读取或者存储一些定值,这时我们就需要扩展EEPROM。具有SPI接口的串行EEPROM均可被TMS320F241直接逻辑扩展,方便易行。X5043是Xicor公司最高时钟速率为3.3MHz带有块锁保护的4Kbits 的CMOS串行EEPROM。该器件内部组织阵列是X8位,具有串行外围接口(SPI)和软件协议的特点,允许在简单的四线总线上工作;该器件利用Xicor专有的直接写入晶片提供最小为10万次擦写和最少100年的数据保存期。

3.2硬件设计

X5043与TMS320F241型DSP的连接关系如图1所示。DSP作为主控制器,工作于主模式下,SPISIMO为DSP的数据发送端,连接到X5043的数据接收端(SI);SPISOMI为DSP的数据接收端,连接到X5043的数据发送端(SO);SPISTE 配置成I/O口连接到X5043的片选端(/CS);SPICLK为SPI数据传送的时钟信号,连接到X5043的串行时钟端(SCK),串行时钟由DSP控制。DSP的数据在SPISIMO引脚上输出并从SPISOMI上锁存,DSP通过写入SPIDAT寄存器的数据启动SPICLK串行时钟信号从而启动数据传送,当8位串行位流传送完毕后,SPICLK信号中止,传送结束。

3.3软件设计

(1)工作模式的选择

TMS320F241的SPI接口有可选择的四种不同的时钟模式,如何选择时钟模式是它与各种扩展SPI接口器件实现时钟同步的关键。X5043的数据在时钟下降沿从SO引脚上输出并在时钟上升沿从SI引脚上锁存。读操作时,在其从SI引脚输入的最低位地址所对应的时钟下降沿,其SO引脚开始输出数据。作为主器件的DSP可以选择‘上升沿,无延时’和‘上升沿、有延时’两种时钟工作模式。‘上升沿,无延时’模式与X5043的工作模式一致,数据在SPICLK信号的时钟上升边沿(从低电平到高电平)从移位寄存器移出在SI引脚上锁存,在时钟下降边沿(从高电平到低电平)从SO引脚上输出的数据锁存到移位寄存器中。‘上升沿,有延时’模式如图4所示,数据在SPICLK信号上升沿前半个周期从移位寄存器移出,在紧接着的上升边沿在SI引脚上锁存,在时钟下降边沿(从高电平到低电平)从SO引脚上输出的数据锁存到移位寄存器中。

(2)波特率的选择

8

SPI波特率可以由如下两种情况计算得出:对于SPIBRR=3~127,波特率的计算公式为:

SPI波特率=CLKOUT/(SPIBRR+1)

对于SPIBRR=0~2,波特率的计算公式为:SPI波特率=CLKOUT/4

式中,CLKOUT=器件的CPU时钟频率;SPIBRR=主SPI器件中的SPIBRR内容。X5043最大的SPI波特率为3.3MHz,若DSP的CPU时钟频率CLKOUT=16MHz,则:最大的SPI波特率=16×106/(SPIBRR+1)≤3.3×106Hz SPIBRR≥4+9

(3)DSP的数据传输格式

DSP中SPI有16位的发送和接收能力,且接收和发送均是双缓冲。所有数据寄存器都是16位宽的,而X5043的地址、数据寄存器均是8位的,将DSP中SPI 传输字符长度设置成8位宽。要向X5043存储数据时,DSP将一个8位字节长度的数据写入SPIDAT或SPITXBUF的高8位上如图2所示,在时钟信号的作用下,以左对齐方式发送,先发送数据的最高位。DSP接收一个8位字节长度的数据,是以右对齐方式接收如图3所示,8位字节长度的数据写入SPIDAT或SPIRXBUF 的低8位上。

(4)各控制寄存器设置

LDP #SPICCR>>7

SPLK #0007h,SPICCR

;复位字符长度

SPLK #000Eh,SPICTL

;主模式,使能TALK,禁止SPI的中断

;上升沿发送,下降沿接收,有延时

SPLK #000Fh,SPIBRR

;设置SPI的传输波特率

SPLK #0087h,SPICCR

;SPI准备好发送或接收下一字符

(5)程序设计

RAM块中的变量定义:

.bss SPI_Xdata,1;SPI数据传输暂存器

.bss address1,1;EEPROM存储器地址暂存器

.bss data1,1;EEPROM存储器数据暂存器

X5043存储器地址:

WREN .set 0600h;设置写使能锁存指令地址

WRDI .set 0400h;复位写使能锁存指令地址

RSDR .set 0500h;读状态寄存器指令地址

WRSR .set 0100h;写状态寄存器指令地址

READh .set 0B00h

READl .set 0300h;读存储器阵列数据指令地址

9

WRITEh .set 0A00h

WRITEl .set 0200h;写存储器阵列数据指令地址

(6)DSP的SPI数据发送、接收子程序代码

XMIT_V ALUE:

LDP #0

LACC SPI_Xdata

LDP #SPITXBUF>>7

SACL SPITXBUF;写需发送的值到SPI传输缓冲器

XMIT_RDY:

LDP #SPISTS>>7

BIT SPISTS,BIT6

BCND XMIT_RDY,NTC;测试SPI_INT位,如果SPI_INT=0,则重复循环;等待数据发送完毕进行下一步操作

LDP #SPIRXBUF>>7

LACL SPIRXBUF;读取数据清除SPI_INT标志位

LDP #0

SACL SPI_Xdata;将接收的值存入数据传输暂存器

RET

10

总结

DSP结构特点决定了它尤其适合做数字信号处理的应用,而学好数字信号处理对日后的信息处理的深入学习和应用有着重要的意义,因而学好DSP技术就有很深远的意义。通过此次课程设计详细掌握了TMS320LF2407A的SPI功能模块和TLV5617的性能特点,完成了SPI的DA转换实验和EEPROM存储区访问。在此次课程设计中我也遇到了很多问题,通过阅读几本参考书和其他一些资料,自己已经基本明白了他们的作用和配置方法。还有就是程序的调试,DSP的结构比单片机要复杂的多,相应的寄存器比较多,而且很多情况下编写DSP程序都需要操作盒配置,这既要对诺依曼体系结构的共性有一定了解,同时也要针对DSP的特点来进行,编程前需对各个硬件模块之间的内在联系进行整体考虑,这样可以训练自己的系统思维。当然这些问题都有一定的难度,但是想办法解决它们的过程也就是学习和进步的过程。

11

参考文献:

[1]刘和平,王维俊,等.TMS320LF240XDSPC语言开发应用.北京:北京航空航天大学出版社,2003.

[2]TLC5620C,TLC5620I数据手册武汉力源电子股份有限公司,1998.

[3]杨永辉,曹丹华,吴裕斌.TMS320LF2407A与SPI的接口设计测控技术,2003,22

[4]王改名,赫苏敏,王忠杰,HD7279A的原理与应用.2007

[5]张毅刚等编著.TMS320LF240x系列DSP原理开发与应用.哈尔滨:哈尔滨工业大学出版社,2007.8

12

答辩记录及评分表

课题名称DSP的SPI接口

答辩教师(职称)陶沙

答辩时间2014~2015学年第一学期第9 周

答辩评语1什么是DSP?(钱叶辉)

答:数字信号处理就是用数值计算的方式对信号进行加工的理论和技术,它的英文原名叫digital signal processing,简称DSP。它是集成专用计算机的一种芯片,只有一枚硬币那么大。有时人们也将DSP看作是一门应用技术,称为DSP技术与应用。

2简述TMS320LF2407A的?(魏伟)

答:TMS320LF2407A的D/A转换是基于2407的SPI 接口以及TLV5617芯片里完成。SPI参与数据传输的寄存器有9个,其中SPICCR、SPICTL用于设置SPI的工作状态工作方式、数据长。

3简述SPI工作方式?(孙叶林)

答:2407A的SPI功能模块是一种真正的同步串行接方无延时上升沿有延时上升沿无延时下降沿有延时下降SPICLK 信号上升沿发送数据,下降沿接00收数据提SPICL信号上个周期发送数据,上升沿接收数据SPICLK信号下降沿发送数据,上升沿接01口,可以工作于主动和从动方式。

4 DSP的数据传输格式是什么?俞俊明

答:DSP中SPI有16位的发送和接收能力,且接收和发送均是双缓冲。所有数据寄存器都是16位宽的,而X5043的地址、数据寄存器均是8位的,将DSP中SPI传输字符长度设置成8位宽。要向X5043存储数据时,DSP将一个8位字节长度的数据写入SPIDAT或SPITXBUF的高8位上。

5.简述SPI接口?李丰

答:SPI(Serial Peripheral Interface--串行外设接口)总线系统是一种同步串行外设接口,它可以使MCU与各种外围设备以串行方式进行通信以交换信息。SPI有三个寄存器分别为:控制寄存器SPCR,状态寄存器SPSR,数据寄存器SPDR。

13

答辩评语6.SPI有哪些工作模式?(姚姚)

答:工作模式编辑SPI有四种工作模式,各个工作模式的不同在于SCLK不同, 具体工作由CPOL,CPHA决定CPOL: (Clock Polarity),时钟极性。当CPOL为0时,时钟空闲idle时候的电平是低电平;当CPOL为1时,时钟空闲idle时候的电平是高电平;CPHA:(Clock Phase),时钟相位当CPHA为0时,时钟周期的前一边缘采集数据;当CPHA为1时,时钟周期的后一边缘采集数据;

7.串口与SPI口有什么区别?(陈文)

答:串口2条线的一个RX 一个TX ,SPI是4线串口分别是CS(片选) CLK(时钟) MISO(数据输入) MOSI(数据输出),串口一般是一对一接收。SPI可以挂载多个SPI设备,通过CS选通设。

8.简述SPI接口主模式电路设计?(葛自立)

答:内容及要求,SPI接口主模式电路设计。

(1)输出时钟频率可调:主时钟2/4/8/32/64分频;

(2)具有主动收发功能;

(3)发送、接收数据均为16bit;

(4)完成全部流程:设计规范文档、模块设计、代码输入、功能仿真、约束与综合、布局布线、下载验证等。

14

用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 ; } } /******************************************************************/

相关主题
文本预览
相关文档 最新文档