i.MX RT1010之FlexIO模拟SSI外设
恩智浦的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时,需要注意三点:
- 由于FlexIO同步延迟,串行输入数据的建立时间为1.5个FlexIO时钟周期,此时SSI的最大时钟频率应为FlexIO时钟频率的四分之一。
- 由于FlexIO同步延迟,串行输出数据的输出有效时间为2.5个FlexIO时钟周期,此时SSI的最大波特率应为FlexIO时钟频率的六分之一。
- 除了本文给出的Timer和SHIFTER的配置外,读者也可以利用其它配置模拟出SSI接口,这个方法不是唯一的。
至此,i.MX RT1010之FlexIO模拟SSI外设介绍完毕。
i.MX RT1010之FlexIO模拟SSI外设的更多相关文章
- i.MX RT1010之FlexIO模拟I2S外设
恩智浦的i.MX RT1010是跨界处理器产品,作为i.MX RT跨界MCU系列的一个新的切入点,i.MX RT1010是成本最低的LQFP封装方式与i.MX RT系列产品一贯的高性能和易用性的结合产 ...
- 痞子衡嵌入式:飞思卡尔i.MX RTyyyy系列MCU外设那些事(2)- 善变的FlexRAM
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RTyyyy系列MCU的FlexRAM外设. 本文是外设系列第二篇,上一篇讲的是离内核最近的高速缓存L1 Cache, ...
- 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(11.3)- FlexSPI NOR连接方式大全(RT1010)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RT1010的FlexSPI NOR启动的连接方式. 在写完 <FlexSPI NOR启动连接方式(RT1015/ ...
- ios设备app作为蓝牙外设端
苹果手机可以作为蓝牙外设端,被蓝牙中央端来扫描连接交互数据,实现模拟蓝牙外设硬件.通过阅读CoreBluetooth库,可以找到一个CBPeripheralManager的类,该类主要的作用就是允许你 ...
- STM32f10xxx 之 GPIO口配置
背景 配置stm32f103使其完成PWM输出的过程中,在配置GPIO口的时候,按照习惯配置GPIO口的speed为50MHZ,突然就意识到,为什么大部分例程习惯配置为50MHZ,而不是其它值,即有了 ...
- ARM1138@库函数速查
1. GPIO库函数 可实现的功能: 获得/设置指定管脚的方向(输入.输出)和模式(硬件控制) 获取/设置指定管脚的配置(驱动强度2/4/8/8_SCmA.管脚模式:推挽(弱上拉/弱下拉)/开漏(弱上 ...
- 第04节-BLE协议抓包演示
在上几篇博客中,形象的讲解了BLE各个层的作用,各个层的数据结构.本篇博客将研究BLE协议抓包.在实际开发中,有一个中央设备(central)和一个外设(Peripheral).所谓中央设备就是指它可 ...
- STM32F103ZET6 GPIO的使用
1.GPIO简介 STM32F103ZET6有多个GPIO组,如GPIOA.GPIOB.GPIOC...等等.每个GPIO组具有16个IO口. GPIO组的寄存器都是类似的,每个GPIO组都有2个32 ...
- 看 AWS 如何通过 Nitro System 构建竞争优势
目录 目录 目录 前言 Amazon Nitro System Overview AWS EC2 的虚拟化技术演进之路 Nitro Hypervisor Nitro Cards Nitro Contr ...
随机推荐
- JDBC——ResultSet结果集对象
ResultSet结果集对象,封装结果.它是怎么做到封装结果的呢? 游标,类似指针索引最初指在“列名”上,要取到数据就需要让游标向下移动移动后就指向了第一行数据,然后通过一些方法把第一行的每一列都取出 ...
- 0002 增加APP配置
创建好工程后的第一步就是配置APP,目前有两个APP,配置APP的步骤如下: 01 APP目录配置 01.1 在APP目录下创建Templates目录,用于存储模板文件 01.2 在APP目录下创建v ...
- 解决wxpy获取不到指定群聊对象的情况
我们可以通过Bot.friends 以及Bot.groups 来获取到所有的好友以及聊天群,这里需要注意的是,聊天群需要保存到通讯录中,不然可能会出现找不到聊天群的情况. 摘自:http://www. ...
- AspxDashBorad_OnDashboardLoaded 获取对应的DashboardParameter
protected void ASPxDashboardViewerThrend_OnDashboardLoaded(object sender, DashboardLoadedWebEventArg ...
- Java内存管理(1)——垃圾收集
其它语言(如C语言)要求程序员显式地分配内存.释放内存. 程序需要内存时分配内存,不需要时释放内存. 但是这种做法常常引起内存泄漏.所谓内存泄漏,就是由于某种原因使分配的内存始终没有得到释放.如果该任 ...
- Git 时光穿梭机
git log 提交日志 git reflog 命令日志 git status 查看状态 管理修改 git diff 工作区与暂存区 git diff master 工作区与版本库 git diff ...
- util之Map
1.定义 Map<String, Integer> map = new HashMap<String,Integer>(); 2.判断map中是否存在某个键的值: if(map ...
- 设置canvas的背景成白色
解决方案一:将透明的pixel设成白色 因为png图片的背景都是透明的,所以我们可以寻找透明的pixel,然后将其全部设置成白色,核心代码如下: JavaScript Code复制内容到剪贴板 // ...
- 第三十四篇 玩转数据结构——哈希表(HashTable)
1.. 整型哈希函数的设计 小范围正整数直接使用 小范围负整数整体进行偏移 大整数,通常做法是"模一个素数" 2.. 浮点型哈希函数的设计 转成整型进行处理 3.. 字符串 ...
- 【StarUML】 活动图
StarUML中的活动图本质上是流程图,活动图相对来说,更加专业,它有对信号的处理,对状态动作.数据区别表示,使得更清晰地了解控制流的走向. 1.基本元素 a.活动状态图(Activity).动作状态 ...