打印

深入了解PSoC®4A :基于SCB的串行通信设计

[复制链接]
3047|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
 摘要:本文首先简要介绍了PSoC®4A的片内外设子系统架构及SCB模块的功能。然后概括了当前最常用的三种串行通信协议,UART,I2C和SPI。并详细论述了如何在PSoC®4A片内的SCB模块平台上,配置并实现这三种串行通信。

  关键字:PSoC®4,SCB,UART,I2C,SPI
  Abstract: This paper first briefly introduces the architecture of on-chip peripheral subsystem and the function of SCB module. Then generalizes the currently common used 3 serial communication protocol, UART, I2C and SPI. And detailed illustrates how to configure and realize the 3 serial communication on SCB module in PSoC®4A.
  Keywords: PSoC®4,SCB,UART,I2C,SPI
  1. 引言
  PSoC®4A是Cypress可编程片上系统PSoC®(Programmable System on Chip)家族中的最新成员,采用ARM Cortex®-M0作为处理核心,因此也是PSoC®家族中性价比最高的成员。PSoC®4完全继承了PSoC®芯片家族本身的高度可编程的灵活性,并融合了Cortex® M0高性价比的处理器核架构,使得PSoC®4 系列产品成为一个具有高度可扩展性的处理器平台,在性价比、功耗等方面优势显著。在针对电机控制等需要实时调试的嵌入式应用中,串行通信显得尤为重要,PSoC®4将常用的多种串行通信接口(UART,I2C和 SPI)集成到一个SCB(Serial Communication Block)外设模块上,且每个片内都含有两个SCB外设。因此用户可以非常方便的在SCB外设上设计出自己的串行通信系统。

沙发
chenci2013|  楼主 | 2015-1-15 00:24 | 只看该作者
 PSoC®4A产品系列目前推出的是CY8C4100和CY8C4200两个入门级产品系列。本文即以CY8C4200为例,介绍如何利用PSoC®4A片内的SCB外设模块进行UART,I2C和 SPI串行通信设计。
  2. PSoC®4A架构及SCB外设模块简介
  PSoC® 4A 是基于ARM Cortex®-M0 CPU(处理器)的可编程嵌入式系统控制器家族,为嵌入式应用提供了强大的可编程平台。它集合了可编程模拟资源、可编程内部互联、用户可编程数字逻辑、通用的固定功能外设计以及高性能的ARM Cortex-M0 CPU子系统。
  图 1是PSoC®4的系统框图。限于篇幅,本文将主要概括与串行通信相关的片内资源特性,详细内容您可以参考Cypress网站上的PSoC®4的数据手册。
  ■ 高达48MHz,43 DMIPS 的32位Cortex-M0 CPU,支持单周期乘法
  ■ 多达 32 KB Flash 及 4KB SRAM内存
  ■ 两个可工作为SPI/UART/I2C 串行通信接口的串行通信模块(SCB)
  ■ 四个可编程数字逻辑模块(UDB)
  ■ CapSense® 及 LCD 驱动
  ■ SWD 编程及调试单元
  ■ 全面支持PSoC Creator IDE 工具

使用特权

评论回复
板凳
chenci2013|  楼主 | 2015-1-15 00:24 | 只看该作者
本帖最后由 chenci2013 于 2015-1-15 00:26 编辑

  图 1: PSoC®4芯片系统框图
  PSoC®4在开发环境方面与PSoC®家族的上一代产品保持一致,仍然为PSoC® Creator,延续了将片内资源抽象为模块化Component的开发方法,控制系统架构清晰具体,简单快捷。用户可以更多关注产品的功能开发,而较少的注意芯片的硬件结构细节。PSoC® Creator的详细信息可以在Cypress网站上获得。

使用特权

评论回复
地板
chenci2013|  楼主 | 2015-1-15 00:25 | 只看该作者
 SCB串行通信模块支持三种通信协议:UART,I2C 和SPI。由图1可以看出PSoC®4提供了两个SCB模块,每个SCB模块在同一时刻只能用于实现一种串行通信协议。如果在设计中需要同时实现三个及以上串行通信协议,用户可以借助UDB来设计。
  在PSoC® Creator 3.0中将SCB模块放入schematic编辑器中,双击打开配置界面可以看出,SCB共有5个配置选项。
  ■ “Unconfigured SCB”: 保留SCB为未配置状态,需在运行时实时配置。
  ■ “I2C”: 标准I2C模式。
  ■ “EZI2C”: EZI2C模式。
  ■ “SPI”: SPI模式
  ■ “UART”: UART模式
  本文将主要论述最常用的UART,I2C和SPI三种通信协议在SCB模块上的实现方法。

使用特权

评论回复
5
chenci2013|  楼主 | 2015-1-15 00:27 | 只看该作者

图 2: SCB模块及配置界面

使用特权

评论回复
6
chenci2013|  楼主 | 2015-1-15 00:27 | 只看该作者
 3. 基于SCB模块的UART串行通信实现
  ① UART串行通信简介
  通用异步收发协议(UART)定义了一种全双工的串行异步接口。其拓扑通常是点到点的结构,主要有TX(发送)和RX(接收)两个信号。由于是异步方式,没有同步时钟信号,需要双方约定一个相同的波特率,且每发送一个字节后进行一次数据同步,因此UART的数据传输速率相对较低(常用为115200bps, 最高可达1Mbps)。UART没有固定的通信协议,因此用户可以自由定义。所以UART特别适合于诸如电机控制等需要实施监控系统参数的应用场合,用于在上位机和下位机之间双向传递数据。图3概括了一个UART通信的示例。关于UART通信协议的详细定义,您可以参考相关的理论文献。


 图 3:UART通信的示例

使用特权

评论回复
7
chenci2013|  楼主 | 2015-1-15 00:28 | 只看该作者
  UART 协议中一个典型的数据帧由开始位,数据位,奇偶校验位和停止位组成。开始位的逻辑值为0,它标志一个数据帧的开始;数据位是需要传输的信息;奇偶校验位是可选的,它的值取决于所有数据位逻辑值求和结果的奇偶性;停止位的逻辑值为1,它的长度可配置。当UART 总线处于空闲态时,其逻辑值为1,如同停止位。
  ② 基于SCB的UART通信实现
  在图2所示的配置框中,将SCB配置为UART模式,点开出现的”UART Basic”菜单,配置基本的UART通信参数,如图4所示;”UART Advanced”菜单下的TX Buffer 和RX Buffer参数保持默认的8个即可。

图 4:UART通信参数配置

使用特权

评论回复
8
chenci2013|  楼主 | 2015-1-15 00:29 | 只看该作者
 UART支持全双工通信,因此数据发送和接收可以同时被处理。数据的发送和接收都可以用中断与轮询两种方式来完成。中断方式是在每次数据发送/接收完成后产生一个中断,在中断服务程序中进行下一次数据发送/接收的设置。轮询方式是在主循环中不断查询当前数据接收/发送任务是否完成,然后决定何时开始下一次接收/发送任务。在类似于电机控制的实时任务处理中,中断通常用来处理实时性要求严格的任务,对于用于数据监控和调试目的的UART通信,通常用轮询的方式来实现。
  PSoC Creator 3.0 开发工具本身带有UART全双工数据处理的Example Project;点击菜单File->Example Project,选择PSoC 4 Architecture,然后选择”SCB_UartTxRxComm”即可打开UART通信例程,如图5所示。

  图 5:打开UART通信示例程序

使用特权

评论回复
9
chenci2013|  楼主 | 2015-1-15 00:29 | 只看该作者
 UART的数据发送/接收过程很简单,以数据接收为例,程序代码如下:
  if(0u != UART_SpiUartGetRxBufferSize())
  {
  rxData = UART_SpiUartReadRxData();
  }
  return(rxData);
  在主循环程序中轮询数据接收寄存器RxBuffer的状态,如果数据接收完成则读取该寄存器中的值作为接收到的数据即可。

使用特权

评论回复
10
chenci2013|  楼主 | 2015-1-15 00:30 | 只看该作者

 ① I2C串行通信简介

  I2C(Inter Integrated Circuit)是一种两线制的串行通信协议,被广泛应用于嵌入式设备中芯片之间的低速互连通路,如单片机,ADC,DAC,EEPROM,温度传感器, 电源检测器等,与UART只能实现点到点通信模式不同,I2C总线可以方便的构成多机系统和外围器件扩展系统,器件地址采用硬件设置方法,并通过软件进行寻址。图6给出了I2C总线拓扑示意图。



  图6:I2C总线拓扑示意图


使用特权

评论回复
11
chenci2013|  楼主 | 2015-1-15 00:30 | 只看该作者
  由图2可以看出,I2C总线共有两根信号线,SDA串行数据线与SCL串行时钟线。SCL保证了总线上所有器件的时钟同步,可实现较快的传输速率(标准模式为100Kbps,高速模式可达3.4Mbps)。I2C总线可以同时连接多个节点设备,并支持多主从设备模式,但同一时刻只能由一个主设备,负责产生SCL同步时钟和发起与结束一次数据传输。且主设备和从设备均可作为发送器(写数据)和接收器(读数据)。
  由于只有一根SDA数据线,因此I2C总线只能实现半双工传输模式。数据的读/写均由主设备发起与结束。以读数据为例,首先主设备发起数据传输,输出START事件并输出7bit的从设备地址和读标志’1’;接下来主设备释放SDA,被寻址的从设备拉低SDA作为对主设备的应答(ACK)。然后从设备将通过SDA向主设备发送8位数据,主设备接收完成后发送应答(ACK)信号。当主设备读完所有的数据,输出STOP事件,结束本次传输。过程示意如图7所示。


  图7:I2C总线主设备读数据示意
  当总线上多个主设备在同一时刻发起数据传输时,冲突检测和仲裁机制能够保证数据不被丢失。当主设备侦测到SDA 上的逻辑值与自身驱动的值不符时,则检测到总线冲突,并放弃对总线的控制。更多I2C 协议的知识请参考官方的I2C 协议标准。

使用特权

评论回复
12
chenci2013|  楼主 | 2015-1-15 00:31 | 只看该作者
 当总线上多个主设备在同一时刻发起数据传输时,冲突检测和仲裁机制能够保证数据不被丢失。当主设备侦测到SDA 上的逻辑值与自身驱动的值不符时,则检测到总线冲突,并放弃对总线的控制。更多I2C 协议的知识请参考官方的I2C 协议标准。
  ② 基于SCB的I2C通信实现
  在图2所示的配置框中,将SCB配置为I2C模式,点开出现的” I2C”菜单,配置基本的I2C通信参数,如图8所示;需要注意的是,当配置为Master模式的时候,不需要设置地址,只有在配置为Slave模式时,才需要7位地址。
  I2C只能支持半双工通信,因此在同一时刻,数据发送和接收模式只能选择一种。与UART相似,数据的发送和接收都可以用中断与轮询两种方式来完成。
  PSoC Creator 3.0 本身带有I2C半双工数据处理的Example Project;点击菜单File->Example Project,选择PSoC 4 Architecture,然后选择”SCB_I2cCommMaster”(主设备模式)或”SCB_I2cCommSlave”(从设备模式)即可打开I2C通信例程。本文以”SCB_I2cCommMaster”为例,打开后的原理图界面如图9所示。

使用特权

评论回复
13
chenci2013|  楼主 | 2015-1-15 00:31 | 只看该作者


图 8:I2C通信参数配置

使用特权

评论回复
14
chenci2013|  楼主 | 2015-1-15 00:32 | 只看该作者
 本例程中的主设备通过I2C总线发送0,1,2,3四个数字给下位机来控制RGB三色LED灯的循环点亮。

  图 9: SCB_I2cCommMaster
  发送数据的函数代码如下:
  uint32 WriteCommandPacket(uint8 cmd)
  {
  uint8 buffer[BUFFER_SIZE];
  uint32 status = TRANSFER_ERROR;
  /* Initialize buffer with packet */
  buffer[PACKET_SOP_POS] = PACKET_SOP;
  buffer[PACKET_CMD_POS] = cmd;
  buffer[PACKET_EOP_POS] = PACKET_EOP;
  (void) I2CM_I2CMasterWriteBuf(I2C_SLAVE_ADDR, buffer, PACKET_SIZE, I2CM_I2C_MODE_COMPLETE_XFER);
  while (0u == (I2CM_I2CMasterStatus() & I2CM_I2C_MSTAT_WR_CMPLT))
  {
  /* Waits until master completes write transfer */
  }
  /* Displays transfer status */
  if (0u == (I2CM_I2C_MSTAT_ERR_XFER & I2CM_I2CMasterStatus()))
  {
  RGB_LED_ON_GREEN;
  /* Check if all bytes was written */
  if(I2CM_I2CMasterGetWriteBufSize() == BUFFER_SIZE)
  {
  status = TRANSFER_CMPLT;
  }
  }
  else
  {
  RGB_LED_ON_RED;
  }
  (void) I2CM_I2CMasterClearStatus();
  return (status);
  }

使用特权

评论回复
15
chenci2013|  楼主 | 2015-1-15 00:32 | 只看该作者
 5. 基于SCB模块的SPI串行通信实现
  ① SPI串行通信简介
  SPI(Serial Peripheral Interface:串行外设接口)总线是Motorola公司 推出的 一种同步串行接口技术。SPI总线允许MCU以全双工的同步串行方式,与各种外围设备进行高速数据通信。主要应用在EEPROM,Flash,RTC(实时时钟),ADC,DSP以及数字信号解码器之间。
  SPI数据传输共有四根信号线:SCLK为串行时钟信号,由主设备产生,并传输到从设备作为同步时钟;MOSI/SIMO为主出从入数据信号,由主设备输出,输入到从设备。MISO/SOMI为主入从出信号,由从设备输出,输入到主设备。SELECTx为从设备选择信号,由主设备输出,输入到从设备,一般为低电平有效。
  SPI总线拥有最高的传输速率,最低标准速率为500Kbps,最高可达8Mbps,且为全双工模式,因此特别适合于MCU用来读写诸如EEPROM等片外设备中的数据。

使用特权

评论回复
16
chenci2013|  楼主 | 2015-1-15 00:33 | 只看该作者

  图10给出了一主三从的SPI总线串行通信系统框图。SPI总线一般为”一主多从”拓扑结构,进行数据传输时,主设备首先控制相应的一根SELECTx来选择从设备,然后主设备向从设备同时传输时钟(通过SCLK)和数据(通过MOSI/SIMO),从设备对该数据进行采样;如果主设备需要读数据时,从设备将数据发送到MISO/SOMI线上,主设备对该数据进行采样。



  图10:SPI总线串行通信系统框图


使用特权

评论回复
17
chenci2013|  楼主 | 2015-1-15 00:33 | 只看该作者
  在连续传输多帧数据时,SELECT 信号一直被拉低。从设备就无法利用SELECT 的状态来区分每一帧,从而需要一直监测数据,根据主从设备之间约定的协议找出帧头和帧尾。当总线结束数据传输时,SELECT 被重新拉高,SCLK 无时钟输出。摩托罗拉定义了SPI 协议中的四种信号传输模式,规定数据在哪个时钟沿被发送和采样。通过配置时钟极性(CPOL: Clock POLarity)和时钟相位(CPHA: Clock PHAse)来选择四种模式中的一种。图11给出了传输模式0(SCLK 空闲态为低,时钟上升沿采样数据,时钟下降沿发送数据) 下,双帧(16bit)数据传输的波形图。

  图11:传输模式0 下的双帧数据传输波形图
  除了Motorola公司提出的初始版本SPI协议外,TI(德州仪器)与NSC(国家半导体)也在其基础上提出了各自的修改版SPI协议。关于SPI协议的详细信息,您可以参考相关的理论文献。

使用特权

评论回复
18
chenci2013|  楼主 | 2015-1-15 00:34 | 只看该作者
 ② 基于SCB的SPI通信实现
  在图2所示的配置框中,将SCB配置SPI模式,点开出现的”SPI Basic”菜单,配置基本的UART通信参数,如图12所示;”SPI Advanced”菜单下的TX Buffer 和RX Buffer参数保持默认的16个即可。


  图 12:I2C通信参数配置
  SPI可以支持全双工通信,但是只能有一个器件为Master。SPI数据帧的长度限制较为宽松,可在4bit到16bit之间自由配置。UART相似,数据的发送和接收都可以用中断与轮询两种方式来完成。

使用特权

评论回复
19
chenci2013|  楼主 | 2015-1-15 00:34 | 只看该作者
  PSoC Creator 3.0 本身带有SPI全双工数据处理的Example Project;点击菜单File->Example Project,选择PSoC 4 Architecture,然后选择”SCB_SpiComm”即可打开SPI通信例程。打开后的原理图界面如图13所示。
  该例程以1Mbps的传输速率,8bit每帧的方式将一组固定的数据(如图13所示)由Master发送到Slave,并从Slave读取一组固定的数据(如图13所示)到Master。


  图 13: SCB_SPIComm 参考例程
  数据传输的函数代码如下:
  /* Writing data into the SPIS TX software buffer */
  SPIS_SpiUartWriteTxData(0x11u);
  SPIS_SpiUartWriteTxData(0x22u);
  SPIS_SpiUartWriteTxData(0x33u);
  SPIS_SpiUartWriteTxData(0x44u);
  SPIS_SpiUartWriteTxData(0x55u);
  SPIS_SpiUartWriteTxData(0x66u);
  SPIS_SpiUartWriteTxData(0x77u);
  SPIS_SpiUartWriteTxData(0x88u);
  SPIM_ClearMasterInterruptSource(SPIM_INTR_MASTER_SPI_DONE);
  /* Writing data into the SPIM software buffer */
  SPIM_SpiUartWriteTxData(0x99u);
  SPIM_SpiUartWriteTxData(0xAAu);
  SPIM_SpiUartWriteTxData(0xBBu);
  SPIM_SpiUartWriteTxData(0xCCu);
  SPIM_SpiUartWriteTxData(0xDDu);
  SPIM_SpiUartWriteTxData(0xEEu);
  SPIM_SpiUartWriteTxData(0xFFu);
  SPIM_SpiUartWriteTxData(0x12u);
  /*
  * We need to know the moment when SPI communication is completed
  * to display received data. SPIM_INTR_MASTER_SPI_DONE status should be polled.
  */
  while(0u == (SPIM_GetMasterInterruptSource() & SPIM_INTR_MASTER_SPI_DONE))
  {
  /* Wait while Master completes transaction */
  }

使用特权

评论回复
20
chenci2013|  楼主 | 2015-1-15 00:35 | 只看该作者
  可以看出SPI串行通信的代码实现也很简单,分别将需要发送和接收的数据写入Master和Slave器件相应的寄存器即可。然后就等待SCB模块自动置位传输完成标志后即可以将所获得的数据用于程序处理了。关于数据帧的长度和传输故障的处理,用户可以根据自己的需要自行配置。
  6. 小结
  本文主要介绍了PSoC®4A片内SCB模块的主要功能与配置方法,以及如何使用SCB模块实现行UART,I2C和SPI这三种最常用的串行通信协议,并详细介绍了PSoC Creator 3.0 开发工具自带的UART,I2C和SPI通信例程,可以帮助用户加快开发过程,并使用PSoC®4A进行简洁高效的产品设计。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

104

主题

6365

帖子

4

粉丝