DSP SPI口和串行EEPROM在变频器中的应用

发布者:数据之翼最新更新时间:2009-05-11 来源: 中国传动网关键字:TMS320F240  SPI  EEPROM  X5168 手机看文章 扫描二维码
随时随地手机看文章

1 引言

  变频器的开发中我们选用TMS320F240芯片做主CPU,TMS320F240系列是美国TI公司于1997年推出的,专为数字电机控制和其它控制应用系统而设计的16位定点数字信号处理器。它将数字信号处理的高速运算功能与面向电机的强大控制能力结合在一起,成为中低端变频器理想的主控芯片。F240片内外设包括双10位A/D转换器,带有锁相环PLL时钟模块,带中断的看门狗定时器模块,串行通信接口SCI及串行外设接口SPI,另外,还集成了一个事件管理模块EVM。因此,TMS320F240基本能满足笔者变频器设计的要求。

  变频器有几百甚至上千个参数,这些参数值都要求系统断电后不能丢失,在设计中我们选用非易失性存储器EEPROM保存数据。每次上电时,从EEPROM中读取上次参数的设定值,以保证变频器运行状态的连续性,同样每次断电时,也要保存变频器此次运行的参数设定情况,以便开机时读取。本文阐述了变频器开发中F240扩展EEPROM(X5168)的设计思路和实现过程。

2 对TMS320F240的串行外设接口(SPI)的说明

  TMS320F240的串行外设接口(SPI)模块是一个高速同步串行输入/输出端口,它允许F240控制器和片外外设或其他控制器进行串行通信,在通信过程中,SPI能够以任意给定的传输速率对具有可编成长度(1-8位)的串行比特流进行收发。该模块也是一个8位外设,它直接挂在16位的片内外设总线上,因此,外设总线的高8位读写访问对该模块是没有意义的。

  SPI模块的特性如下:

  (1) 4个外部引脚。SPISOM I为SPI从输出/主输入引脚;SPISIMO为SPI从输入/主输出引脚;SPISTE为SPI从发送使能引脚;SPICLK为SPI串行时钟引脚。

  (2) 两种工作方式,即主模式(Master)和从模式(Slave)。

  (3) 数据字长。1-8个数据位。

  (4) 可同时接收和发送数据,发送和接收操作可通过中断或查询方法来完成。

  (5) 波特率,l25种可编程的波特率,下列两个公式给出了计算SPI的波特率的方法:

  1. 当SPIBRR=3-127时,SPI波特率=系统时钟频率/(SPI寄存器的值+1);

  2. 当SPIBRR=0、1、2时,SPI波特率=系统时钟频率/4;

  (6) 4种时钟方案,由时钟极性位(SPICCR寄存器的位6)和时钟相位位(SPICTL寄存器的位3)进行设置,包括:

  1. 无延时下降沿有效:串行外设接口在SPICLK 信号下降沿发送数据,而在SPICLK 信号上升沿接收数据;

  2. 有延时下降沿有效:串行外设接口在SPICLK 信号下降沿之前的半个周期时发送数据,而在SPICLK 信号下降沿接收数据;

  3. 无延时上升沿有效:串行外设接口在SPICLK 信号上升沿发送数据,而在SPICLK 信号下降沿接收数据;

  4. 有延时上升沿有效:串行外设接口在SPICLK 信号上升沿之前的半个周期时发送数据, 在SPICLK 信号上升沿接收数据。

3 对X5168的说明

  DSP处理速度比较快,且本设计需要保存的数据量大,笔者选择了XICOR公司的带16Kb SPI EEPROM 的CPU监视器X5168。器件把四种常用的功能:上电复位、看门狗定时器、电源电压监控和块锁存保护的串行EEPROM 存储器集成在一个封装之内,这种组合降低了系统成本,减少了电路板空间,增加了可靠性。

器件的存储器部分是带有XICOR公司的块锁存保护的CMOS串行EEPROM 阵列,阵列的内部组织是x8位。具有串行外围接口(SPI)和软件协议的特点,允许在简单的四线总线上工作。利用XICOR专有的直接写入晶片,提供最小为100,000次擦写和最少为100 年的数据保存期。

4 DSP与X5168的连接通信

4.1硬件设计

  在变频器设计中DSP与X5168的硬件连接图如图1

图1 TMS320F240与X5168连接原理图

  串行外设接口(SPI)有两种工作模式:主模式和从模式,与X5168 连接时工作于主模式。从图中可看到,X5168通过四根线来完成与DSP的数据交换,DSP的SPISIMO、SPISOMI、SPICLK、SPISTE引脚分别连接X5168的SI(串行输入)、SO(串行输出)、SCK(串行时钟)、/CS(片选端),此时的F240控制器称为“主机”,这种情况下,SPI在SPICLK引脚上提供了整个串行通信网络所需的串行时钟;数据从SPISIMO引脚输出;并锁存从SPISOMI引脚输入的数据;SPIBRR寄存器决定了整个串行通信网络中数据发送和接收时的位传输率。

  写入SPIDAT的数据启动了SPISIMO引脚上的数据发送,先发送最高有效位;同时,接收的数据通过SPISOMI引脚移入SPIDAT的最低有效位。当有一定数量的数据位通过SPIDAT移位时,产生下列事件:

  一、SPI INT FLAG置1

  二、SPIDAT的内容传送到SPIBUF

  三、如果SPI INT ENA也被置1,则产生中断请求

  在主模式中,无论寄存器SPIPC1的位5(SPISTE FUNCTION)为何值,SPISTE引脚都将用作通用数字I/O引脚。在本设计中,引脚SPISTE用作从机SPI模块的片选引脚;在将主机数据传送到从机器件之前,应将从机器件片选引脚拉低电平,并且在传送完主机数据之后,重新将该引脚拉为高电平。

4.2软件设计

4.2.1 TMS320 F240的SPI初始化

  上文介绍了F240的SPI模块的功能,配置寄存器串行外设接口工作于主模式,波特率设置为2MHz,初始化程序如下:

  void SPIinitial(void)

  { *SPICCR=0xc7; //复位SPI

  *SPICTL=0x06; //主模式,使能TALK,禁止SPI中断

  *SPISTS=0x00; //清中断标志

  *SPIBRR=0x04; //波特率设为SPICLK=SYSCLK/4+1=2MHz,SYSCLK=10MHz

  *SPIPC1=0x52; //SPISTE引脚配置成输出引脚,SPICLK被配置成串行时钟的输

  //入或输出

  *SPIPC2=0x22; //SPISIMO,SPISOMI用作SPI输入输出

  *SPICCR=0x47; //上升沿发送,下降沿输入数据锁存,无时延,字符长度为8

  }

4.2.2 F240对X5168的读写程序

对EEPROM的读写是设计的重点,以下分别介绍:

  一、读操作

  a).从EEPROM存储器阵列中读数据时,/CS 首先被拉低以选择器件,向器件传送8位读READ指令(00000011B),接着是16位地址(高位在前)。在读操作码和地址送出后,存储位于在所选地址的存储器中的数据在SO线上被移出,继续提供时钟脉冲可接着读出存储在位于下一个地址的存储器中的数据。每移出一个字节地址自动增加至下一个更高的地址,在达到最高地址时,地址计数器返回到地址$0000,允许读周期无限期地继续。将/CS拉高可终止读操作。参见读EEPROM阵列时序图2。

图2 读EEPROM阵列时序图

  以下是读X5168子程序,其中RA_ADDR为存储读出数据的数组的首地址,EEP_ADDR为要读取数据在EEPROM阵列中的地址,N为要读取数据的个数

  void READ_X5168(unsigned int * RA_ADDR, unsigned int EEP_ADDR, unsigned int N)

  { unsigned int I,readspibuf1,readspibuf2;

  *SPIPC1&=0xBF; /*置低SPISTE引脚,从而选通X5168*/

  *SPIDAT=READ; /*发送X5168的写状态寄存器命令字*/

  while((*SPISTS&0x40)!=0x40){} /*等待SPI写结束*/

  readspibuf=*SPIBUF; /*读SPIBUF寄存器,清除SPI INT FLAG 位*/

  *SPIDAT=EEP_ADDR>>8; /*发送地址高八位*/

  while((*SPISTS&0x40)!=0x40){} /*等待SPI写结束*/

  readspibuf=*SPIBUF; /*读SPIBUF寄存器,清除SPI INT FLAG 位*/

  *SPIDAT=EEP_ADDR; /*发送地址低八位*/

  while((*SPISTS&0x40)!=0x40){} /*等待SPI写结束*/

  readspibuf=*SPIBUF; /*读SPIBUF寄存器,清除SPI INT FLAG 位*/

  for (I=0;I

  { *SPIDAT=0; /*发送伪数据*/

  while((*SPISTS&0x40)!=0x40){} /*等待SPI读/写结束*/

  readspibuf1=*SPIBUF; /*读取高位字节*/

  readspibuf1=readspibuf1<<8;

  *SPIDAT=0; /*发送伪数据*/

  while((*SPISTS&0x40)!=0x40){} /*等待SPI读/写结束*/

  readspibuf2=*SPIBUF; /*读取低位字节*/

  *(RA_ADDR+I)=readspibuf1+readspibuf2;

  }

  *SPIPC1|=0x40; /*置高SPISTE引脚,从而禁止X5168*/

  }

  b).读状态寄存器时,首先要拉低/CS 线,以选中器件,接着发送8位的RDSR指令(00000101B),在RDSR操作码发出以后,状态寄存器的内容在SO线上被移出。参见读状态寄存器时序图3。

图3 读状态寄存器时序图

[page]

  以下是读状态寄存器子程序:

  unsigned int RSDR_X5168(void)

  { unsigned int readspibuftrue;

  *SPIPC1&=0xBF; /*置低SPISTE引脚,从而选通X5168*/

  *SPIDAT=RDSR; /*发送x5168的读状态寄存器命令字*/

  while((*SPISTS&0x40)!=0x40){} /*等待SPI写结束*/

  readspibuftrue=*SPIBUF; /*读SPIBUF寄存器,清除SPI INT FLAG 位*/

  *SPIDAT=0; /*发送伪数据*/

  while((*SPISTS&0x40)!=0x40){} /*等待SPI读/写结束*/

  readspibuftrue=*SPIBUF; /*读SPIBUF寄存器,读取状态寄存器*/

  return readspibuftrue;

  }

  二、写操作

  a).在试图向器件写入数据前必须首先通过发送WREN指令来设置写使能锁存WEL(见图4)。/CS 先被拉低,接着向器件输入WREN指令(00000110B)。在指令的所有的8位传送完后,/CS 必须被拉高。如果用户在发送完WREN指令后,没有将/CS 拉高而继续写操作则该写操作将被忽略。

图4 写使能时序图

  串行EEPROMX5168写使能命令子程序如下:

  void WREN_X5168(void) /*写使能*/

  { *SPIPC1&=0xBF; /*置低SPISTE引脚,从而选通X5168*/

  *SPIDAT=WREN; /*发送X5168的写使能命令字*/

  while((*SPISTS&0x40)!=0x40){} /*等待SPI写结束*/

  readspibuf=*SPIBUF; /*读SPIBUF寄存器,清除SPI INT FLAG 位*/

  *SPIPC1|=0x40; /*置高SPISTE引脚,从而禁止X5168*/

  }

  b).为了向EEPROM存储器阵列写入数据用户接着发送写WRITE 指令(00000010B),跟着是16位地址和被写入的数据。任何不用的地址位都被指令为“0”,写操作最少要用32个时钟,/CS 必须为低并在该操作期间一直保持为低。如果地址计数器达到一页的末端而时钟还在继续,时计数器将返回至该页的首地址,并覆盖任何之前已写入的数据。对于将完成的页面写操作(字节或页面写)而言,在写入的最后一个数据的位0被同时输入后,/CS只能被拉高。如果它在其它任何时候被拉高则不能完成写操作(见图5)。

图5 写EEPROM阵列时序图

  以下是写EEPROM阵列子程序,RA_ADDR为存储要写数据数组的首地址,EEP_ADDR为要写入的EEPROM首地址,N要存储数据的个数。

  void WRITE_X5168(unsigned int * RA_ADDR, unsigned int EEP_ADDR, unsigned int N)

  { unsigned int I;

  WREN_X5168(); /*写使能*/

  *SPIPC1&=0xBF; /*置低SPISTE引脚,从而选通X5168*/

  *SPIDAT=WRITE; /*发送x5168的写状态寄存器命令字*/

  while((*SPISTS&0x40)!=0x40){} /*等待SPI写结束*/

  readspibuf=*SPIBUF; /*读SPIBUF寄存器,清除SPI INT FLAG 位*/

  *SPIDAT=EEP_ADDR>>8; /*先发送高位地址在发送低位地址*/

  while((*SPISTS&0x40)!=0x40){} /*等待SPI写结束*/

  readspibuf=*SPIBUF; /*读SPIBUF寄存器,清除SPI INT FLAG 位*/

  *SPIDAT=EEP_ADDR; /*先发送高位地址在发送低位地址*/

  while((*SPISTS&0x40)!=0x40){} /*等待SPI写结束*/

  readspibuf=*SPIBUF; /*读SPIBUF寄存器,清除SPI INT FLAG 位*/

  for (I=0;I

  { *SPIDAT =*(RA_ADDR+I)>>8 ; /*发送数据用数组传送,传送数据高八位*/

  while((*SPISTS&0x40)!=0x40){} /*等待SPI写结束*/

  readspibuf=*SPIBUF; /*读SPIBUF寄存器,清除SPI INT FLAG 位*/

  *SPIDAT =*(RA_ADDR+I) ; /*发送数据用数组传送,传送数据第八位*/

  while((*SPISTS&0x40)!=0x40){} /*等待SPI写结束*/

  readspibuf=*SPIBUF; /*读SPIBUF寄存器,清除SPI INT FLAG 位*/

  }

  *SPIPC1|=0x40; /*置高SPISTE引脚,从而禁止X5168*/

  }

  c).为向状态寄存器写数据,在WRSR指令(00000001B)之后应跟随被写入的数据(见图6),数据位0和位1必须为“0”。

图6 写状态寄存器时序图

  以下是写状态寄存器子程序:

  void WRSR_X5168(unsigned int COM) /*写状态*/

  { WREN_X5168(); /*写使能*/

  *SPIPC1&=0xBF; /*置低SPISTE引脚,从而选通X5168*/

  *SPIDAT=WRSR; /*发送X5168的写状态寄存器命令字*/

  while((*SPISTS&0x40)!=0x40){} /*等待SPI写结束*/

  readspibuf=*SPIBUF; /*读SPIBUF寄存器,清除SPI INT FLAG 位*/

  *SPIDAT=COM; /*STATUS_REG发送状态字*/

  while((*SPISTS&0x40)!=0x40){} /*等待SPI写结束*/

  readspibuf=*SPIBUF; /*读SPISTS寄存器,清除SPI INT FLAG 位*/

  *SPIPC1|=0x40; /*置高SPISTE引脚,从而禁止X5168*/

  TIMEDEL(5); /*延时1us*/

  }

  以上子程序实现了DSP对X5168的读写功能,在主程序中调用这些子程序就可实现对X5168的操作。

5 结束语

  由于篇幅的原因,本文没有过多的讲述DSP的串行外设接口和X5168的各项特性,这些说明书上都有叙述且很具体。而是把重点放在了讲述DSP扩展EEPROM应用的软硬件设计,该设计已成功应用在笔者开发的变频器中,经过反复测试,运行可靠。

关键字:TMS320F240  SPI  EEPROM  X5168 引用地址:DSP SPI口和串行EEPROM在变频器中的应用

上一篇:基于DSP的嵌入式视觉客流检测系统的设计
下一篇:采用FPGA实现视频监视

推荐阅读最新更新时间:2024-05-02 20:48

STM32 硬件I2C EEPROM命令解析
void I2C_EE_BufferWrite(u8* pBuffer, u8 WriteAddr, u16 NumByteToWrite) { u8 NumOfPage = 0, NumOfSingle = 0, Addr = 0, count = 0; //写入地址是每页的第几位 Addr = WriteAddr % I2C_PageSize; //在开始的一页要写入的个数 count = I2C_PageSize - Addr; //要写入的页数 NumOfPage = NumByteToWrite / I2C_PageSize; //不足一页的个数 Nu
[单片机]
STM32F0之SPI(使用固件库)
typedef struct { uint16_t SPI_Direction;//设置方向 (2线全双工、2线只接受、一线发送、一线接受) uint16_t SPI_Mode; //模式 (从或主设备) uint16_t SPI_DataSize; //宽度 (8或16位) uint16_t SPI_CPOL; //时钟极性 (低或高) uint16_t SPI_CPHA; //时钟相位 (第一个或第二个跳变沿) uint16_t SPI_NSS; //片选方式 (硬件或软件方式) uint16_t SPI_BaudRatePrescaler; //波特率预分频 (
[单片机]
基于单片机的自适应电开水机设计
        本电开水机采用自适应的方式,模拟人工总结用户的用水规律,合理确定烧水时间与烧水量,在非用水时间段停止加热,解决了混合水和干滚水的问题,较好的达到了健康与节能的双重效果。   0 引言   电开水机具有清洁、高效、安装简便等特点,因此被广泛应用在学校、工厂、机关、宾馆等场所,为人们饮水提供了便利。目前市售的电开水机,通常由储水箱、加热器、进水阀等部件组成,结构简单,功能单一。使用这些电开水机可能存在两个严重的后果,一是存在阴阳水(生水与开水混合后的水),二是存在干滚水(反复烧开的水)。阴阳水的问题在大多数开水机中通过一些特殊的分离结构已经得到解决,但干滚水问题目前尚无较好的解决办法。   饮水机长时间开机
[嵌入式]
I2C和SPI各有什么特点?
I2C和SPI各有什么特点? 答:I2C总线是二线制,采用器件地址的硬件设置方法,通过软件寻址完全避免了器件的片选线寻址方法,从而使硬件系统具有简单灵活的扩展方法。I2C总线简单,结构紧凑,易于实现模块化和标准化。 SPI是Motorola公司推出的一种同步串行通讯方式,是一种三线同步总线。有多个SPI接口的单片机时,应为一主多从,在某一时刻只能由一个单片机为主器件;在扩展多个SPI外围器件时,单片机应分别通过I/O口线来分时选通外围器件。
[单片机]
STC8H开发(六): SPI驱动ADXL345三轴加速度检测模块
ADXL345 ADXL345是一款常见的的3轴加速度计, Analog Device生产. 13位分辨率, ±16 g测量范围, 分辨率3.9 mg/LSB. 可通过SPI(3线或4线)或I2C接口访问. 主要用于倾斜检测, 静态重力加速度测量, 以及运动或冲击导致的动态加速度测量. 能够测量不到1.0°的倾斜角度变化. 可以对单击, 双击, 自由落体等情况设置中断. 模块与STC8H的接线 市面上的模块, 一般是8个pin脚, 在使用SPI接线方式的情况下, 与STC8H的接线方式如下. 除了SPI用到的CS, MISO, MOSI, SCLK以外, STC8H还需要提供两个中断输入, 因为INT0, INT1已经
[单片机]
STC8H开发(六): <font color='red'>SPI</font>驱动ADXL345三轴加速度检测模块
MAX16047A/MAX16049A EEPROM可配置系
 MAX16047A /MAX16049A EEPROM 可配置系统管理器能够对多个系统电压进行监测、排序和跟踪。MAX16047A可以同时管理12路系统电压,MAX16049A可以管理8路电源电压。该系列器件都集成了用于监控电源电压的模/数转换器(ADC)和用于排序、跟踪电源(在上电和掉电时)的可配置输出。非易失EEPROM寄存器可配置用于记录电压的上限和下限,根据要求设置定时和排序,也可以存储关键的故障数据,以便在发生故障后回读故障信息。   内部1%精度的10位ADC对每路输入进行测量,并将结果与上、下限电压门限以及一路可配置为上限或下限的电压进行比较。当检测电压超出设定门限时,产生故障报警信号。针对不同的故障条件可以
[模拟电子]
MAX16047A/MAX16049A <font color='red'>EEPROM</font>可配置系
STM32F02R8T6Nuceo板子Uart2串口问题
21IC买了一块1元的活动板子,移植了RTT(RT-THREAD)的国人嵌入式操作系统.系统能够正常跑起来,接着就按照RTT的官网教程,写了一个串口驱动. 原来定义的是UART1的端口,但是没有找到板子的USART1的引脚,虽然STM32可以映射,但是仍然没有看到有甩出来的引脚.初略看了一下官网的使用手册,发现图上有USART2引出来. 上图看一下, 好家伙,那就直接接地,接TX与RX到PC端的USB转串口吧. 杯具来了,发现无论如何自己的程序都没有输出打印,怀疑自己的代码有问题.用mbed的示例BIN文件试试,也发现不行.难道是电平问题?换了别人使用的开发板与PC的USB转串口,oh mygod!!还是不行. 心灰意冷,心灰
[单片机]
基于单总线1-wire的EEPROM芯片—DS2431
     DS2431是一款1024位1-Wire? EEPROM芯片,由四页存储区组成,每页256位。数据先被写入一个8字节暂存器中,经校验后复制到EEPROM存储器。该器件的特点是,四页存储区相互独立,可以单独进行写保护或进入EPROM仿真模式,在该模式下,所有位的状态只能从1变成0。DS2431通过一条1-Wire总线进行通信。通信采用了标准的1-Wire协议。每个器件都有不能更改的、唯一的64位ROM注册号,该注册号由工厂光刻写入芯片。在一个多点的1-Wire网络环境中,该注册号用做器件地址。   关键特性    ● 1024位EEPROM存储器,分成四页,每页256位    ● 独立的存储区页,可以被永
[嵌入式]
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved