【 NXP S32K 】FLEXIO I2C 模块介绍与建立例程

一、 前言

       本文主要介绍 NXP S32K116 FLEXIO I2C 模块的功能和特点 ,然后介绍如何在 S32 Design Studio 中创建一个基于 S32K116 SDK 的 FLEXIO I2C Project 来演示 FLEXIO I2C 功能 ,并且应用 FLEXIO I2C 于 0.96 寸 OLED 屏幕。 


二、FLEXIO 概述

       针对外设接口数量不能满足要求的 ,可以使用 FLEXIO 模块 , FLEXIO 可以用于实现 UART、 SPI、 I2C 及其他串行接口,为客户设计解决方案提供了更多的灵活性和通信可靠性。 

       FLEXIO 由 4 组移位器(Shifter)和 4 组定时器(Timer)组成。

       移位器(Shifter)32 位移位寄存器具有发送,接收和数据匹配的功能。

       定时器(Timer)16 位计时器支持各种内部 / 外部各种触发,重置,启用和禁用条件功能。

       下面给出图是 FLEXIO 计时器和移位器配置框图。


三、FLEXIO I2C 概述

      对于 FLEXIO I2C 则使用到两个定时器 、两个移位器以及两个引脚 ,一个计时器用于生成 SCL 时钟输出 。一个计时器用于控制移位器 ,第二个移位器用于发送和接收 。当接收时 ,发射机以三态输出 0xFF 。FLEXIO 在每个字节后面插入一个停止位来生成 / 验证位 ACK / NACK 。在启用 SCL 时钟生成之前 FLEXIO 等待对传输数据缓冲区的第一次写入 。数据传输支持使用 DMA 控制器和移位错误标志(设置在发送不足或接收溢出)。
     
      下表为 FLEXIO I2C 寄存器介绍 :

      SHIFTCFGn          : 逻辑 0 启用启动位,逻辑 1 启用停止位 。

      SHIFTCTLn           : 使用定时器 1 配置引脚 0 发送使能开漏 。

      SHIFTCFG(n+1)   : 启动位已禁用,停止位已启用,逻辑 0 用于ACK/NACK 检测。

      SHIFTCTL(n+1)    : 使用定时器 1 配置引脚 0 在时钟下降沿输入数据 。

      TIMCMPn             : 配置 2 字传输波特率除以 4 的灵活时钟。Set TIMCMP[15:8] = (字数x 18) + 1。Set TIMCMP[7:0] = (波特率分频器/ 2) - 1。

      TIMCFGn              : 配置起始位、停止位、高触发时启用、比较时禁用、输出等于引脚时复位。初始时钟状态为逻辑 0 不受复位影响。

      TIMCTLn               : 配置双 8 位计数器使用引脚 1 输出使能 (SCL开漏),移位器 0 标志作为倒置触发器。

      TIMCMP(n+1)      : 配置 8 位转移。Set TIMCMP[15:0] = (位数x 2) - 1。

      TIMCFG(n+1)       : 启用定时器 0 时启用,禁用定时器0时禁用,启用开始位和停止位,缩减引脚输入。

      TIMCTL(n+1)        : 配置 16 位计数器使用倒引脚1输入 (SCL)。

      SHIFTBUFn           : 要传输的数据可以从 SHIFTBUFBBS[7:0] 写入,使用 Shifter 状态标志来指示数据何时可以使用中断或 DMA 请求写入数据。

      SHIFTBUF(n+1)    : 接收到的数据可以从 SHIFTBUFBIS[7:0] 读取,使用 Shifter 状态标志来指示何时可以使用中断或 DMA 请求读取数据。


四、I2C 通信概述

      I2C 总线是由 Philips 公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。

      I2C 总线上的数据可以传输 在标准模式下速率可达 100kbit /s,在快速模式下速率可达 400kbit /s,在高速模式下最高可达 3.4 Mbit/s。

      I2C 通信的起始和停止条件及重复起始条件为 :

              开始条件 : 当 SCL 为高时,SDA 线上从高到低的转换。

              停止条件 : 当 SCL 为高时,SDA 线上从低到高的转换。


      在 SDA 数据线上的每个字节必须是 8 位长。但每次传输的字节数量没有限制。每个字节后面必须有一个响应位(ACK/NACK)。数据首先用最有效位 ( MSB ) ,数据在 SCL 高电平周期时保持稳定,数据的高低电平翻转变化发生在 SCL 低电平时 。


五、S32K116 FLEXIO I2C 例程的建立

      5.1 打开 S32 Design Studio ,在菜单栏中点击 File -> New -> S32DS Project from Example 创建 SDK 工程 。

   


      5.2 在弹出窗口中选择 S32K116 的 FLEXIO I2C 例程 ,这里选择 S32DS S32K1xx RTM v3.0.0 Example Projects -> S32K116 -> commuincation -> flexio_i2c_s32k116 例程作为演示 。

     
      5.3 双击 Components -> flexio_i2c:flexio_i2c 打开 FLEXIO I2C 组件 PE 设置界面 。



      5.4 将 FLEXIO I2C 组件 PE 设置里的波特率值修改为 500000 Baudrate (Hz) ,即设置 FLEXIO I2C 的波特率为 500K 。




      5.5 创建的工程是基于 SDK 的例程 ,需要配置后选中创建的工程 ,在菜单栏中选择 Project -> Generate Processor Expert Code 生成工程完整代码 。




六、应用于 OLED 屏幕

      6.1  在主机写了从机地址 +‘0’(write) 之后 , 从机应答 ,后面可以接着写数据 ,从机再应答 ,最后是停止位 。

     
      6.2 市面上 SSD 系列芯片核心驱动的 0.96寸 OLED 屏幕 ,写入命令的地址为 0x00 ,写入数据的地址为 0x40 。

            如下图逻辑分析仪分析使用 FLEXIO I2C 例程进行 I2C 通信 ,在主机写入 OLED 设备地址 0x3C + '0' (write) 之后写入 OLED 命令地址数据 0x00 以及数据 0x10 。

   

      6.3 该芯片通常有 3 种寻址方式,这里采用的是页寻址,页寻址方式如下图箭头所示,共8页,128列 。 





      6.4 将每页 128 Byte 显存数据写入数组 OLED_GRAM ,再通过 FLEXIO I2C 一次性传输 ,这样可以减少 I2C 开始和停止的所占用的大部分时间 。

//更新显存到OLED
void OLED_Refresh_Line(void)
{
uint8_t i,n;
uint8_t temp[128];

for(i=0;i<8;i++)
{
OLED_WR_Byte(0xb0+i,OLED_CMD); //设置行起始地址
OLED_WR_Byte(0x00,OLED_CMD); //设置低列起始地址
OLED_WR_Byte(0x10,OLED_CMD); //设置高列起始地址

for(n=0;n<128;n++)
{
temp[n] = OLED_GRAM[n][i];
}

I2C_Master_Send(INST_FLEXIO_I2C, OLED_Salve_Address, Data_Address, temp, 128U, TIMEOUT);
}
}

     
      6.5 在 FLEXIO I2C 波特率为 500 K/s 的条件下 , 逻辑分析仪分析数据 ,刷一帧图形耗时约 25 ms ,该 FLEXIO I2C 驱动下 OLED 屏幕约有着 30 FPS 的刷新率 。




七、参考资料


【 NXP I2C标准协议2014年第6版 】
      https://www.nxp.com.cn/docs/en/user-guide/UM10204.pdf

【 I2C简介】 
      https://www.wpgdadatong.com/blog/detail?BID=B2671

【 S32K 开发指南 】S32 Design Studio 编码工具 Processor Expert 简单介绍 
      https://www.wpgdadatong.com/blog/detail?BID=B2049


★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论