0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一文详解CKS32K148微控制器的LPI2C模块

中科芯MCU ? 来源:中科芯MCU ? 2025-07-16 14:16 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

MCU微课堂

CKS32K148 LPI2C

第六十期 2025.07.14

LPI2C(Low Power Inter-Integrated Circuit)是CKS32K148微控制器中的一个低功耗I2C接口模块。CKS32K148款MCU存在LPI2C0、LPI2C1两个LPI2C,支持标准模式(100 kbps)、快速模式(400 kbps)、快速+模式(1Mbps)和高速模式(3.4 Mbps)通信速率。

主要特性

兼容性:支持 I2C 总线标准模式、快速模式、快速+模式、从机模式下的高速模式 (HS)。

低功耗:支持低功耗模式。

多主模式:支持多主操作,包括同步和仲裁机制。

中断和 DMA 支持:提供中断和 DMA 支持,减少 CPU 负载。

可配置性:可配置广播呼叫、7 位或 10 位地址模式。可选择SOSC、SIRC、FIRC、SPLL时钟源,支持时钟延长、时序可通过寄存器灵活配置。

错误检测:支持总线忙检测、仲裁丢失、FIFO错误、端口低电平超时、位错误检测。

主机特性

4字深度的 命令/发送/接收FIFO

命令 FIFO 等待空闲 I2C 总线:在启动传输之前,命令 FIFO 会等待 I2C 总线空闲

命令 FIFO 支持启动(重复)START 和 STOP 条件:可以发起一个或多个主接收器传输

STOP 条件可以从命令 FIFO生成,也可在发送 FIFO为空时自动生成

主机请求输入:用于控制 I2C总线传输的启动时间

灵活的接收数据匹配功能:可以在数据匹配时生成中断,并丢弃不需要的数据

标志位和可选中断:用于指示重复 START 条件、STOP 条件、仲裁丢失、意外的 NACK 以及命令字错误

支持可配置的总线空闲超时和引脚低电平超时:增强总线的鲁棒性和可靠性

从机特性

独立的 I2C 从机寄存器:减少因主/从切换带来的软件开销

支持 7 位或 10 位地址、地址范围、SMBus 警报和通用呼叫地址:提供灵活的地址配置和通信功能

发送/接收数据寄存器支持中断或 DMA 请求:便于高效的数据收发

软件可控制的 ACK 或 NACK:支持在 ACK/NACK 位上进行可选的时钟拉伸

可配置的时钟拉伸:避免发送 FIFO 下溢和接收 FIFO 上溢错误

标志位和可选中断:用于指示数据包结束、STOP 条件或位错误检测

主机/从机传输数据

CKS32K148系列MCU的LPI2C框图如下所示:

7f456b88-604a-11f0-baa5-92fbcf53809c.png

图1 LPI2C框图

LPI2C 主机和从机控制器逻辑相互独立,用于在 I2C 总线上分开执行所有主/从模式传输任务。这种独立性使得主/从控制器能够高效地管理总线通信,提高了系统的灵活性和性能。

LPI2C端口

LPI2C在不同外部条件下支持不同端口配置模式,通过MCFGR1[26:24]寄存器配置。

开漏支持:LPI2C主设备默认将SDA和SCL引脚配置为开漏模式。

高速模式支持:高速模式的支持也取决于具体的设备,并且要求SCL引脚支持I2C规范中所需的电流源上拉。

超快速模式支持:LPI2C主设备还支持使用SDA和SCL引脚实现I2C超快速模式所需的仅输出推挽功能。支持超快速模式还需要设置MCFGR1[IGNACK]位。

推挽式双线支持:LPI2C主设备还支持推挽式双线配置,如果LPI2C是唯一的主设备且总线上的所有I2C引脚电压相同,则可以支持部分高速模式。

推挽式四线支持:推挽式4线配置将SCL/SDA引脚用于输入数据;SCLS/SDAS引脚用于输出数据,且极性可配置。注意在使用此四线配置时,LPI2C主设备逻辑和LPI2C从设备逻辑无法连接到单独的I2C总线。

LPI2C主机传输

当LPI2C被启用时,它会持续监控I2C总线,以检测总线是否处于空闲状态(通过MSR[BBF]标志位)。当检测到总线空闲超时(由 MCFGR2[BUSIDLE] 配置)或者STOP条件时,I2C总线将被视为空闲。

在I2C总线空闲后,如果发送 FIFO不为空,并且主机请求被触发或禁用,LPI2C主控制器将启动I2C总线上的传输。这一过程包括以下步骤:

等待总线空闲时间

等待的时间= (MCCR0[CLKLO] + 1) * 预分频器 (MCFGR1[PRESCALE])。

发送 START 条件和地址字节

使用主时钟配置寄存器 0 (MCCR0) 中的时序配置发送 START 条件和地址字节;如果配置为高速模式传输,则使用主时钟配置寄存器 1 (MCCR1) 中的时序配置。

执行主发送或主接收传输

根据发送 FIFO 的配置执行主发送或主接收传输。

在最后一次主接收传输中发送 NACK

除非发送 FIFO 中的下一个命令也是接收数据命令且发送 FIFO 不为空,否则在最后一次主接收传输中发送 NACK。

发送重复 START 或 STOP 条件

根据发送 FIFO 和/或 MCFGR1[AUTOSTOP] 的配置发送重复 START 或 STOP 条件。

当 LPI2C 主控制器被禁用时(无论是由于 MCR[MEN] 被清除还是由于模式进入自动禁用),LPI2C 将继续清空发送 FIFO(在发送 FIFO 为空后,LPI2C 会自动生成 STOP 条件)直到发送 STOP 条件。

LPI2C从机传输

当LPI2C被启用前可对从机的地址进行匹配设置:支持 7 位或 10 位地址模式,地址可以配置匹配范围。

等待主机的 START 条件:从机监控 I2C 总线,等待主机发送 START 条件和从机地址。

地址匹配:如果接收到的地址与从机配置的地址匹配,从机发送 ACK 响应,然后LPI2C从机会自动执行从机发送(slave-transmit)或从机接收(slave-receive)传输。

发送、接收数据:从机通过发送数据寄存器 STDR 发送数据;通过接收数据寄存器SRDR接收主机发送的数据。

处理接收完成:如果检测到 STOP 条件或数据包结束,从机可以触发中断或标志位,通知软件处理接收到的数据。

LPI2C主机时序配置说明

LPI2C通讯时,时序参数必须配置为满足 I2C 规范的要求;这将取决于所支持的模式和 LPI2C 功能时钟频率。以下表格提供了不同模式下寄存器时序配置示例:

表1 寄存器时序配置

7f4e039c-604a-11f0-baa5-92fbcf53809c.png

LPI2C主从通讯实例

1. 配置LPI2C时钟

CLOCK_DRV_Init(&clockMan1_InitConfig0);

其中“clockMan1_InitConfig0”中包含对SIRC、FIRC、SOSC、PLL、以及LPI2C外设(在peripheralClockConfig0结构体内)的时钟配置。

peripheral_clock_config_t peripheralClockConfig0[NUM_OF_PERIPHERAL_CLO CKS_0] = {

...

{

.clockName = LPI2C1_CLK,

.clkGate = true,

.clkSrc=CLK_SRC_SIRC_DIV2,//LPI2C的时钟选择:SOSC/SIRC/FIRC/SPLL

.frac = MULTIPLY_BY_ONE,

.divider = DIVIDE_BY_ONE,

},

...

}

2. 配置LPI2C 引脚

PINS_DRV_Init(NUM_OF_CONFIGURED_PINS0, g_pin_mux_InitConfigArr0);

其中“g_pin_mux_InitConfigArr0”内对LPI2C引脚进行配置:

pin_settings_config_t g_pin_mux_InitConfigArr0[NUM_OF_CONFIGURED_PINS0] = {

...

{//LPI2C SDA引脚设置

.base = PORTC,

.pinPortIdx = 31U,

.pullConfig = PORT_INTERNAL_PULL_UP_ENABLED,

.driveSelect = PORT_LOW_DRIVE_STRENGTH,

.passiveFilter = false,

.mux = PORT_MUX_ALT4,

.pinLock = false,

.intConfig = PORT_DMA_INT_DISABLED,

.clearIntFlag = false,

.gpioBase = NULL,

.digitalFilter = false,

},

{//LPI2C SCK引脚设置

.base = PORTE,

.pinPortIdx = 1U,

.pullConfig = PORT_INTERNAL_PULL_UP_ENABLED,

.driveSelect = PORT_LOW_DRIVE_STRENGTH,

.passiveFilter = false,

.mux = PORT_MUX_ALT4,

.pinLock = false,

.intConfig = PORT_DMA_INT_DISABLED,

.clearIntFlag = false,

.gpioBase = NULL,

.digitalFilter = false,

},

...

}

下表显示了LPI2C0、LPI2C1的PIN脚在MCU中的资源分配:

表2 LPI2C0外设引脚复用

7f65f402-604a-11f0-baa5-92fbcf53809c.png

表3 LPI2C1外设引脚复用

7f6f6f14-604a-11f0-baa5-92fbcf53809c.png

3. LPI2C作为主机收发数据

LPI2C作为主机FAST模式400K速率配置从机地址50,设置参数如下:

lpi2c_master_user_config_t lpi2c1_MasterConfig0 = {

.slaveAddress = 50U,//地址配置

.is10bitAddr = false,//十位地址配置

.operatingMode = LPI2C_FAST_MODE,//模式配置

.baudRate = 400000UL,//波特率设置

.transferType = LPI2C_USING_INTERRUPTS,//传输方式

.dmaChannel = 0U,//若使能了DMA,则DMA设置的通道

.masterCallback = NULL,//中断函数

.callbackParam = NULL

};

LPI2C_DRV_MasterInit(INST_LPI2C1,&lpi2c1_MasterConfig0,&lpi2c1MasterState);//LPI2C作为主机初始化

LPI2C_DRV_MasterSendDataBlocking(INST_LPI2C1, masterTxBuffer, BUFF_SIZE, true, OSIF_WAIT_FOREVER);//LPI2C作为主机发送数据

while(!((LPI2C1->MSR)&LPI2C_MSR_SDF_MASK))//停止位检测

{

LPI2C_DRV_MasterReceiveDataBlocking(INST_LPI2C1,masterRxBuffer, BUFF_SIZE, true, OSIF_WAIT_FOREVER);//LPI2C作为主机接收数据

}

1. LPI2C作为从机收发数据

LPI2C作为从机,地址设置50,配置中断接收,设置参数如下:

lpi2c_slave_user_config_t lpi2c1_SlaveConfig0 = {

.slaveAddress = 50U,//从机地址

.is10bitAddr = false,//十位地址配置

.operatingMode = LPI2C_FAST_MODE,//模式配置

.slaveListening = true,//监听模式

.transferType = LPI2C_USING_INTERRUPTS,//中断传输

.dmaChannel = 0U,//若配置了DMA,则从机DMA的通道

.slaveCallback = lpi2c1_SlaveCallback0,//从机中断函数

.callbackParam = NULL

};

LPI2C_DRV_SlaveInit(INST_LPI2C1, &lpi2c1_SlaveConfig0, &lpi2c1SlaveState);//从机初始化

中断内进行数据收发:

void lpi2c1_SlaveCallback0(i2c_slave_event_t slaveEvent,void *userData)

{

uint32_t instance;

instance = (uint32_t)userData;

switch(slaveEvent)

{

case I2C_SLAVE_EVENT_RX_REQ://从机接收数据

LPI2C_DRV_SlaveSetRxBuffer(instance,slaveRxBuffer, BUFF_SIZE);

break;

case I2C_SLAVE_EVENT_TX_REQ://从机发送数据

LPI2C_DRV_SlaveSetTxBuffer(instance, slaveTxBuffer, BUFF_SIZE);

break;

case I2C_SLAVE_EVENT_TX_EMPTY://发送完成

case I2C_SLAVE_EVENT_RX_FULL://接收完成

break;

case I2C_SLAVE_EVENT_STOP:

SendOK = true;

break;

}

}

至此,LPI2C模块简单的主机从机特性及主机从机传输机制讲述完毕。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 微控制器
    +关注

    关注

    48

    文章

    7960

    浏览量

    155539
  • mcu
    mcu
    +关注

    关注

    146

    文章

    18001

    浏览量

    368014
  • 接口
    +关注

    关注

    33

    文章

    9019

    浏览量

    153831
  • fifo
    +关注

    关注

    3

    文章

    402

    浏览量

    44848

原文标题:MCU微课堂|CKS32K148 LPI2C

文章出处:【微信号:中科芯MCU,微信公众号:中科芯MCU】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    详解微控制器

    微控制器也称作微型计算机、微型控制器或微机,它是单集成电路组成的小型计算机,内部包括个相对简单的中央处理、时钟、定时
    发表于 09-09 16:22 ?2866次阅读
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>详解</b><b class='flag-5'>微控制器</b>

    中科芯CKS32F030K6T6 高性能32位RISC内核MCU 程序兼容STM32F030K6T6

    32 位定时个高级控制 PWM 定时CKS32F030xx 系列微控制器工作在-40
    发表于 03-05 16:23

    请问如何在RTD5.0中设置S32K312的Lpi2c速度?

    我们正在与 S32K312 起开发项目,并获得 I2C 速度问题。我通过参考手册设置 Lpi2c 参数,并且 通过 GUI 获得正确的速度 1Mbit/s (
    发表于 03-17 08:04

    FRDM-MCXN947在初始化lpI2C时, I2C无法正常工作怎么解决?

    我正在使用 FRDM-MCXN947 开发板,发现在初始化 lpI2C 时, I2C 无法正常工作。我的配置如图所示。 我使用的配置基于演示。您能帮我检查下问题可能是什么吗?谢谢。
    发表于 03-25 06:32

    K32L2系列微控制器资料分享

    K32L2系列微控制器宣传手册
    发表于 12-12 06:44

    LPI2C如何在tx fifo计数为0时继续发送时钟?

    你好!我正在使用 I2C 与电机驱动通信的自定义应用程序中使用 RT1010。LPI2C模块的根时钟为8MHz(由24MHz时钟导出),I2C
    发表于 03-17 06:54

    如果LPI2C可以低功耗运行,怎么知道LPI2C运行在stop模式?

    如果LPI2C可以低功耗运行(比如stop模式)(Doze模式开启),我怎么知道LPI2C运行在stop模式?程序应该停在进入STOP的位置?
    发表于 03-22 07:49

    如何使用lpi2c0_SlaveCallback0函数?

    大家好,我想低估 LPI2C 从机回调 void lpi2c0_SlaveCallback0(i2c_slave_event_t slaveEvent,void *userData);用户数
    发表于 03-29 06:19

    请问S32K148 LPI2C主控如何支持时钟延展功能?

    我们想使用 S32K148 LPI2C 配置 ADI A2B 网络,需要 I2C master 支持时钟延展功能。S32K148
    发表于 04-06 06:36

    imxrt1052使用LPI2C_MasterTransferNonBlocking API时的i2c传输模式卡在irq_callback中怎么解决?

    NXP developers,当我使用MCUXpresso Config Tools v12.1配置LPI2C为传输模式,然后使用LPI2C
    发表于 04-11 08:39

    S32K148微控制器是否支持带PHY的MII模式?

    我正在使用 S32K148 微控制器,它是否支持带 PHY 的 MII 模式?需要做什么设置才能在 MII 模式下工作?TX_CLK 和 RX_CLK 应该配置为 2.5MHz/25MHz 吗?
    发表于 04-17 08:43

    有没有办法配置lpi2c来嗅探总线并将所有数据存储在缓冲区中?

    lpi2c 配置为从设备,给它个任意地址,并将回调配置为在线路上检测到任何内容时执行。问题是回调例程似乎只在 i2c 帧指向我的嗅探节点(相同的从属地址)时触发。否则,即使在总线
    发表于 04-28 08:50

    为什么无法在LPI2C4上发送数据?

    LPI2C 驱动程序(版本 2.4.1)。 我按如下方式配置了引脚: 然后单击 Project Explorer &gt; Open Peripherals 并添加
    发表于 05-18 06:05

    S32K148如何计算微控制器最坏情况下的电流消耗?

    (μA/MHz) 是什么意思吗。这是否意味着每 1Mhz IC 将消耗 719mA?(我知道我错了,如果是那样的话,电流将是巨大的!!!! ) 般来说,我们如何计算微控制器最坏情况下的电流消耗。 #S32K148
    发表于 06-09 07:48

    昂科烧录支持CETC中科芯的32位微控制器CKS32F051K8U

    芯片烧录领导者昂科技术近期宣布了其烧录软件的最新迭代,并公布了系列新增兼容芯片型号。在此次更新中,中科芯(CETC)推出的32位微控制器CKS32F051K8U已被昂科加密烧录设备AP8000所
    的头像 发表于 04-15 22:08 ?266次阅读
    昂科烧录<b class='flag-5'>器</b>支持CETC中科芯的32位<b class='flag-5'>微控制器</b><b class='flag-5'>CKS32F051K</b>8U