恩智浦的i.MX RT1010是跨界处理器产品,作为i.MX RT跨界MCU系列的一个新的切入点,i.MX RT1010是成本最低的LQFP封装方式与i.MX RT系列产品一贯的高性能和易用性的结合产物。

i.MX RT1010处理器基于ARM Cortex-M7平台,它具有较高的CPU性能和最佳的实时响应,并具有丰富的外设资源。其中FlexIO是一个高度可配置的模块,能够模拟多种不同的通信协议,包括UART, I2C, SPI, I2S等。本文介绍如何利用i.MX RT1010的FlexIO外设来模拟SSI接口。

一、SSI介绍

SSI全称Synchronous Serial Interface,即同步串行接口。本文中,i.MX RT1010的FlexIO外设要模拟的SSI接口是一种能够与Texas Instruments(德州仪器,TI)同步串行接口的器件进行同步串行通信的主机或从机接口,它的单次传输通信格式如下所示。

二、硬件平台

本应用笔记主要介绍如何使用FlexIO模块模拟SSI接口。整个demo基于如下所示的i.MX RT1010 EVK板子进行开发。

为了模拟同步串行接口(SSI)的master(例如控制器)和slave(例如传感器)之间的通信,在此演示中使用了两块i.MXRT1010 EVK板子。 一块板用于模拟SSI master设备,另一块板用于模拟SSI slave设备。另外,为了能够成功演示该demo,需要对i.MX RT1010 EVK板子进行如下操作和改动。

SSI master板子和SSI slave板子之间按如下关系连接:

引脚名称 Master 板子 -------- Slave板子 Slave板子
SSI_RX J26-4 <------> SSI_TXJ26-8 J26-6
SSI_TX J26-6 <------> SSI_RX J26-4
SSI_CLK J26-8 <------> SSI_CLK J26-8
SSI_Fss J56-10 <------> SSI_Fss J56-10
GND J1-10 <------> GND J1-10

在i.MX RT1010上,FLEXIO共有27个引脚。 在本应用中,有4根FlexIO引脚分别用于模拟SSI_Fss引脚,SSI_RX引脚,SSI_TX引脚和SSI_CLK。 下表给出了这4根FlexIO引脚及板子对应的位置。

FlexIO Pin Pin Location
flexio1.FLEXIO23 J26-4
flexio1.FLEXIO24 J26-6
flexio1.FLEXIO28 J26-8
flexio1.FLEXIO00 J56-10

对板子进行一些改动:

  • 去掉电阻R792,并在RT1010 EVK板R800处焊接0Ω电阻。
  • 将ISP拨码开关SW8更改为0b0010模式。
  • 将J1-3和J1-4引脚用短路帽连接,然后将USB线插到板上的J41进行电源。

下面就是搭建完毕的硬件演示平台。

三、SSI模拟

3.1 FlexIO介绍

FlexIO是高度可配置的模块,支持各种协议,包括但不限于UART,I2C,SPI,I2S这几种,并提供多种功能,例如:

  • 高度灵活的16位定时器,支持各种内部或外部触发,复位,使能和禁用条件。
  • 可编程的与总线时钟无关的波特率,在stop模式下支持异步操作。
  • 支持中断,DMA或轮询的发送/接收操作。
  • 用于并行接口支持的1、2、4、8、16或32位的移位宽度。

  • 具有发送,接收,数据匹配模式的32位移位寄存器阵列,双缓冲移位器可实现连续的数据传输。

FlexIO是一个非常灵活的模块。对于固定的时序模拟,其配置方法不是唯一的。通过不限数量的定时器和移位器,以及不同组合的多种配置方法可以实现同样的效果。本应用中分别介绍了一种实现SSI master和SSI slave的配置方法。

3.2 SSI master配置

总共使用两个Timer,两个Shifter用于模拟SSI master设备。Timer0用于产生SSI_CLK信号,Timer1用于产生SSI_Fss信号。Shifter0连接到SSI_TX引脚,并在SSI_Clk的每个上升沿发送数据,Shifter2连接到SSI_RX引脚,并在SSI_Clk的每个下降沿接收数据。下图显示了FlexIO模拟SSI master接口的内部连接。

Timer0配置为双8位计数器,在触发事件高电平时被使能,在比较事件到来时禁用。Timer0的触发源连接到内部Shifter0,Timer0的计数递减源配置为FlexIO时钟,Shift时钟是由Timer0的每一次计时输出决定的,Timer0的起始位也需要被使能。另外,Timer0需要被配置为能够被Shifter0的状态标志位触发。在此应用中,由于传输频率为200kHz,因此Timer0的Compare寄存器的值经计算得到需配置为0xF1D。

Timer1被配置为16位计数器模式,由Timer0触发,当Timer0被使能时也使能,在比较事件到来时禁用。Timer1的计数递减源设置为触发信号的两个边沿。

Shifter0配置为Transmit模式,并在移位器时钟的上升沿移位,使能移位器起始位并将其设置为逻辑低电平。

Shifter2配置为Receive模式,并在移位器时钟的下降沿移位,使能移位器起始位并将其设置为逻辑低电平。

下面给除了SSI master模式下详细的寄存器配置:

  • FlEXIO01.SHIFTCTL[0] = 0x00031502
  • FlEXIO01.SHIFTCTL[2] = 0x00801601
  • FlEXIO01.SHIFTCFG[2] = 0x00000002
  • FlEXIO01.SHIFTCFG[2] = 0x00000002
  • FlEXIO01.TIMCTL[0] = 0x01C31A01
  • FlEXIO01.TIMCTL[1] = 0x03430003
  • FlEXIO01.TIMCFG[0] = 0x00002222
  • FlEXIO01.TIMCFG[1] = 0x00102100
  • FlEXIO01.TIMCMP[0] = 0x00000F1D
  • FlEXIO01.TIMCMP[1] = 0x00000002

当数据从SHIFTER加载到SHIFTBUF寄存器中或数据从SHIFTBUF寄存器加载到SHIFTER中时,如果已经将SHIFTER状态标志位(SHIFTSDEN SSDE)置1,就可以产生一个DMA请求。整个 SHIFTER的微体系结构如图所示,它充分展示了SHIFER中各个模块之间的关系以及IO引脚输入输出的关系。

3.3 SSI slave配置

SSI slave的配置与SSI master的配置类似,SSI slave的模拟也是需要用到两个Shifter和两个Timer。 Timer0用于检测SSI_Fss信号,Timer1用于检测SSI_CLK信号。Shifter0连接到SSI_TX引脚,Shifter2连接到SSI_RX引脚。下图显示了FlexIO模拟SSI slave接口的内部连接。

Timer0配置为双8位计数器,在触发事件高电平时被使能,在比较事件到来时禁用。 Timer0的触发源是SSI_Fss输入引脚。 Timer0的计数递减源配置为FlexIO时钟,Shift时钟是由Timer0的每一次计时输出决定的,Timer0的起始位也需要被使能。同样,由于传输频率为200kHz,因此Timer0的Compare寄存器的值经计算得到为0xF1D。

Timer1被配置为16位计数器模式,将SSI_Fss引脚的输入作为触发事件,并在触发信号的上升沿使能,在Timer0禁用时也禁用。Timer1的计数递减源设置为SSI_CLK输入引脚的两个边沿。

Shifter0配置为Transmit模式,在移位器时钟的上升沿进行移位操作,Shifter0的起始位禁用并使其在第一次移位操作时加载数据。

Shifter2配置为Receive模式,在移位器时钟的下降沿进行移位操作,Shifter2的起始位禁用并使其在第一次移位操作时加载数据。

下面给除了SSI slave模式下详细的寄存器配置:

  • FlEXIO01.SHIFTCTL[0] = 0x00031502
  • FlEXIO01.SHIFTCTL[2] = 0x00801601
  • FlEXIO01.SHIFTCFG[2] = 0x00000001
  • FlEXIO01.SHIFTCFG[2] = 0x00000001
  • FlEXIO01.TIMCTL[0] = 0x00400001
  • FlEXIO01.TIMCTL[1] = 0x00401A03
  • FlEXIO01.TIMCFG[0] = 0x00002402
  • FlEXIO01.TIMCFG[1] = 0x01201600
  • FlEXIO01.TIMCMP[0] = 0x00000F1D
  • FlEXIO01.TIMCMP[1] = 0x0000000F

3.4 demo演示

经过上述介绍,FlexIO模拟SSI接口的配置已经介绍完毕,下面以两块i.MX RT1010 EVK板子之间的通信为例进行演示demo。首先,将各个SSI信号引脚连接到示波器,之后将板子上电后,抓取两块板子之间的第一次SSI通信数据,其波形如下图所示。SSI master板子将数据0xC5发送到SSI slave板子,并同时接收到数据0xB5,数据与图中的波形匹配,达到预期的SSI模拟效果。

另外打开串口助手,将硬件平台上电后,可以看到如下所示的串口打印信息,至此demo演示完毕。

3.5 注意事项

在利用FlexIO模拟SSI时,需要注意三点:

  1. 由于FlexIO同步延迟,串行输入数据的建立时间为1.5个FlexIO时钟周期,此时SSI的最大时钟频率应为FlexIO时钟频率的四分之一。
  2. 由于FlexIO同步延迟,串行输出数据的输出有效时间为2.5个FlexIO时钟周期,此时SSI的最大波特率应为FlexIO时钟频率的六分之一。
  3. 除了本文给出的Timer和SHIFTER的配置外,读者也可以利用其它配置模拟出SSI接口,这个方法不是唯一的。

至此,i.MX RT1010之FlexIO模拟SSI外设介绍完毕。

i.MX RT1010之FlexIO模拟SSI外设的更多相关文章

  1. i.MX RT1010之FlexIO模拟I2S外设

    恩智浦的i.MX RT1010是跨界处理器产品,作为i.MX RT跨界MCU系列的一个新的切入点,i.MX RT1010是成本最低的LQFP封装方式与i.MX RT系列产品一贯的高性能和易用性的结合产 ...

  2. 痞子衡嵌入式:飞思卡尔i.MX RTyyyy系列MCU外设那些事(2)- 善变的FlexRAM

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RTyyyy系列MCU的FlexRAM外设. 本文是外设系列第二篇,上一篇讲的是离内核最近的高速缓存L1 Cache, ...

  3. 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(11.3)- FlexSPI NOR连接方式大全(RT1010)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RT1010的FlexSPI NOR启动的连接方式. 在写完 <FlexSPI NOR启动连接方式(RT1015/ ...

  4. ios设备app作为蓝牙外设端

    苹果手机可以作为蓝牙外设端,被蓝牙中央端来扫描连接交互数据,实现模拟蓝牙外设硬件.通过阅读CoreBluetooth库,可以找到一个CBPeripheralManager的类,该类主要的作用就是允许你 ...

  5. STM32f10xxx 之 GPIO口配置

    背景 配置stm32f103使其完成PWM输出的过程中,在配置GPIO口的时候,按照习惯配置GPIO口的speed为50MHZ,突然就意识到,为什么大部分例程习惯配置为50MHZ,而不是其它值,即有了 ...

  6. ARM1138@库函数速查

    1. GPIO库函数 可实现的功能: 获得/设置指定管脚的方向(输入.输出)和模式(硬件控制) 获取/设置指定管脚的配置(驱动强度2/4/8/8_SCmA.管脚模式:推挽(弱上拉/弱下拉)/开漏(弱上 ...

  7. 第04节-BLE协议抓包演示

    在上几篇博客中,形象的讲解了BLE各个层的作用,各个层的数据结构.本篇博客将研究BLE协议抓包.在实际开发中,有一个中央设备(central)和一个外设(Peripheral).所谓中央设备就是指它可 ...

  8. STM32F103ZET6 GPIO的使用

    1.GPIO简介 STM32F103ZET6有多个GPIO组,如GPIOA.GPIOB.GPIOC...等等.每个GPIO组具有16个IO口. GPIO组的寄存器都是类似的,每个GPIO组都有2个32 ...

  9. 看 AWS 如何通过 Nitro System 构建竞争优势

    目录 目录 目录 前言 Amazon Nitro System Overview AWS EC2 的虚拟化技术演进之路 Nitro Hypervisor Nitro Cards Nitro Contr ...

随机推荐

  1. Oracle11g配置监听

    步骤 1.在windows系统上安装好Oracle后,点击右下角开始菜单Oracle目录下选择Net Manager进行配置,也可以使用Net Configuration Assistant(建议使用 ...

  2. gflag的简单入门demo

    gflags 一. 下载与安装 这里直接使用包管理器安装: sudo apt install libgflags-dev 二. gflags的简单使用 1. 定义需要的类型 格式: DEFINE_类型 ...

  3. 理解Login函数

    _LoginPartial.cshtml文件 其中 <li>@Html.ActionLink("Log in", "Login", "Ac ...

  4. 1.game.h

    game.h //以后会一直更新的呢. /*2020.2.4 更新了文件输入输出模板 @Bill_liu2020 加入了visual.h @bingogyz(orz) 代码:https://blog. ...

  5. NAND FLASH驱动框架以及程序实现

    1.NAND FLASH的硬件连接: 实验用的NAND FLASH芯片为K9F2G08U0C,它是三星公司的存储芯片,它的大小为256M.它的接线图如下所示: 它的每个引脚的分别为LDATA0-LDA ...

  6. 使用tableExport.js直接导出web页面上的table

    1,需要导入两个js文件,一个tableExport.js,另一个是jquery.base64.js,前一个文件是导出数据和核心类库,后一个是为了避免导出中文时乱码的js文件,如果你导出的数据没有中文 ...

  7. SpringBoot整合WEB开发--(一)处理JSON返回数据

    1.使用默认的json转换HttpessageConverter Json是目前主流的前后端数据传输方式,SpringMVC中使用消息转化器HttpMessageConverter对JSON的转换提供 ...

  8. ts中的类

    TypeScript 除了实现了所有 ES6 中的类的功能以外,还添加了一些新的用法(部分ES7). 一.ES6中类的主要用法: 1.使用 class 定义类,使用 constructor 定义构造函 ...

  9. python3爬取百度知道的问答并存入数据库(MySQL)

    一.链接分析: 以"Linux"为搜索的关键字为例: 首页的链接为:https://zhidao.baidu.com/search?lm=0&rn=10&pn=0& ...

  10. GIT如何根据历史记录回退代码

    ps: 因为使用这种方式回退后,回退的目标版本之后提交的代码都没了,所以建议先把当前代码打个tag 首先找到分支的提交记录 git log 将代码回退到历史版本 git reset --hard 0f ...