MCU微課堂
CKS32K148 LPI2C
第六十期 2025.07.14
LPI2C(Low Power Inter-Integrated Circuit)是CKS32K148微控制器中的一個低功耗I2C接口模塊。CKS32K148款MCU存在LPI2C0、LPI2C1兩個LPI2C,支持標(biāo)準(zhǔn)模式(100 kbps)、快速模式(400 kbps)、快速+模式(1Mbps)和高速模式(3.4 Mbps)通信速率。
主要特性
兼容性:支持 I2C 總線標(biāo)準(zhǔn)模式、快速模式、快速+模式、從機模式下的高速模式 (HS)。
低功耗:支持低功耗模式。
多主模式:支持多主操作,包括同步和仲裁機制。
中斷和 DMA 支持:提供中斷和 DMA 支持,減少 CPU 負載。
可配置性:可配置廣播呼叫、7 位或 10 位地址模式。可選擇SOSC、SIRC、FIRC、SPLL時鐘源,支持時鐘延長、時序可通過寄存器靈活配置。
錯誤檢測:支持總線忙檢測、仲裁丟失、FIFO錯誤、端口低電平超時、位錯誤檢測。
主機特性
4字深度的 命令/發(fā)送/接收FIFO
命令 FIFO 等待空閑 I2C 總線:在啟動傳輸之前,命令 FIFO 會等待 I2C 總線空閑
命令 FIFO 支持啟動(重復(fù))START 和 STOP 條件:可以發(fā)起一個或多個主接收器傳輸
STOP 條件可以從命令 FIFO生成,也可在發(fā)送 FIFO為空時自動生成
主機請求輸入:用于控制 I2C總線傳輸?shù)膯訒r間
靈活的接收數(shù)據(jù)匹配功能:可以在數(shù)據(jù)匹配時生成中斷,并丟棄不需要的數(shù)據(jù)
標(biāo)志位和可選中斷:用于指示重復(fù) START 條件、STOP 條件、仲裁丟失、意外的 NACK 以及命令字錯誤
支持可配置的總線空閑超時和引腳低電平超時:增強總線的魯棒性和可靠性
從機特性
獨立的 I2C 從機寄存器:減少因主/從切換帶來的軟件開銷
支持 7 位或 10 位地址、地址范圍、SMBus 警報和通用呼叫地址:提供靈活的地址配置和通信功能
發(fā)送/接收數(shù)據(jù)寄存器支持中斷或 DMA 請求:便于高效的數(shù)據(jù)收發(fā)
軟件可控制的 ACK 或 NACK:支持在 ACK/NACK 位上進行可選的時鐘拉伸
可配置的時鐘拉伸:避免發(fā)送 FIFO 下溢和接收 FIFO 上溢錯誤
標(biāo)志位和可選中斷:用于指示數(shù)據(jù)包結(jié)束、STOP 條件或位錯誤檢測
主機/從機傳輸數(shù)據(jù)
CKS32K148系列MCU的LPI2C框圖如下所示:
圖1 LPI2C框圖
LPI2C 主機和從機控制器邏輯相互獨立,用于在 I2C 總線上分開執(zhí)行所有主/從模式傳輸任務(wù)。這種獨立性使得主/從控制器能夠高效地管理總線通信,提高了系統(tǒng)的靈活性和性能。
LPI2C端口
LPI2C在不同外部條件下支持不同端口配置模式,通過MCFGR1[26:24]寄存器配置。
開漏支持:LPI2C主設(shè)備默認將SDA和SCL引腳配置為開漏模式。
高速模式支持:高速模式的支持也取決于具體的設(shè)備,并且要求SCL引腳支持I2C規(guī)范中所需的電流源上拉。
超快速模式支持:LPI2C主設(shè)備還支持使用SDA和SCL引腳實現(xiàn)I2C超快速模式所需的僅輸出推挽功能。支持超快速模式還需要設(shè)置MCFGR1[IGNACK]位。
推挽式雙線支持:LPI2C主設(shè)備還支持推挽式雙線配置,如果LPI2C是唯一的主設(shè)備且總線上的所有I2C引腳電壓相同,則可以支持部分高速模式。
推挽式四線支持:推挽式4線配置將SCL/SDA引腳用于輸入數(shù)據(jù);SCLS/SDAS引腳用于輸出數(shù)據(jù),且極性可配置。注意在使用此四線配置時,LPI2C主設(shè)備邏輯和LPI2C從設(shè)備邏輯無法連接到單獨的I2C總線。
LPI2C主機傳輸
當(dāng)LPI2C被啟用時,它會持續(xù)監(jiān)控I2C總線,以檢測總線是否處于空閑狀態(tài)(通過MSR[BBF]標(biāo)志位)。當(dāng)檢測到總線空閑超時(由 MCFGR2[BUSIDLE] 配置)或者STOP條件時,I2C總線將被視為空閑。
在I2C總線空閑后,如果發(fā)送 FIFO不為空,并且主機請求被觸發(fā)或禁用,LPI2C主控制器將啟動I2C總線上的傳輸。這一過程包括以下步驟:
等待總線空閑時間
等待的時間= (MCCR0[CLKLO] + 1) * 預(yù)分頻器 (MCFGR1[PRESCALE])。
發(fā)送 START 條件和地址字節(jié)
使用主時鐘配置寄存器 0 (MCCR0) 中的時序配置發(fā)送 START 條件和地址字節(jié);如果配置為高速模式傳輸,則使用主時鐘配置寄存器 1 (MCCR1) 中的時序配置。
執(zhí)行主發(fā)送或主接收傳輸
根據(jù)發(fā)送 FIFO 的配置執(zhí)行主發(fā)送或主接收傳輸。
在最后一次主接收傳輸中發(fā)送 NACK
除非發(fā)送 FIFO 中的下一個命令也是接收數(shù)據(jù)命令且發(fā)送 FIFO 不為空,否則在最后一次主接收傳輸中發(fā)送 NACK。
發(fā)送重復(fù) START 或 STOP 條件
根據(jù)發(fā)送 FIFO 和/或 MCFGR1[AUTOSTOP] 的配置發(fā)送重復(fù) START 或 STOP 條件。
當(dāng) LPI2C 主控制器被禁用時(無論是由于 MCR[MEN] 被清除還是由于模式進入自動禁用),LPI2C 將繼續(xù)清空發(fā)送 FIFO(在發(fā)送 FIFO 為空后,LPI2C 會自動生成 STOP 條件)直到發(fā)送 STOP 條件。
LPI2C從機傳輸
當(dāng)LPI2C被啟用前可對從機的地址進行匹配設(shè)置:支持 7 位或 10 位地址模式,地址可以配置匹配范圍。
等待主機的 START 條件:從機監(jiān)控 I2C 總線,等待主機發(fā)送 START 條件和從機地址。
地址匹配:如果接收到的地址與從機配置的地址匹配,從機發(fā)送 ACK 響應(yīng),然后LPI2C從機會自動執(zhí)行從機發(fā)送(slave-transmit)或從機接收(slave-receive)傳輸。
發(fā)送、接收數(shù)據(jù):從機通過發(fā)送數(shù)據(jù)寄存器 STDR 發(fā)送數(shù)據(jù);通過接收數(shù)據(jù)寄存器SRDR接收主機發(fā)送的數(shù)據(jù)。
處理接收完成:如果檢測到 STOP 條件或數(shù)據(jù)包結(jié)束,從機可以觸發(fā)中斷或標(biāo)志位,通知軟件處理接收到的數(shù)據(jù)。
LPI2C主機時序配置說明
LPI2C通訊時,時序參數(shù)必須配置為滿足 I2C 規(guī)范的要求;這將取決于所支持的模式和 LPI2C 功能時鐘頻率。以下表格提供了不同模式下寄存器時序配置示例:
表1 寄存器時序配置
LPI2C主從通訊實例
1. 配置LPI2C時鐘
CLOCK_DRV_Init(&clockMan1_InitConfig0);
其中“clockMan1_InitConfig0”中包含對SIRC、FIRC、SOSC、PLL、以及LPI2C外設(shè)(在peripheralClockConfig0結(jié)構(gòu)體內(nèi))的時鐘配置。
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”內(nèi)對LPI2C引腳進行配置:
pin_settings_config_t g_pin_mux_InitConfigArr0[NUM_OF_CONFIGURED_PINS0] = {
...
{//LPI2C SDA引腳設(shè)置
.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引腳設(shè)置
.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外設(shè)引腳復(fù)用
表3 LPI2C1外設(shè)引腳復(fù)用
3. LPI2C作為主機收發(fā)數(shù)據(jù)
LPI2C作為主機FAST模式400K速率配置從機地址50,設(shè)置參數(shù)如下:
lpi2c_master_user_config_t lpi2c1_MasterConfig0 = {
.slaveAddress = 50U,//地址配置
.is10bitAddr = false,//十位地址配置
.operatingMode = LPI2C_FAST_MODE,//模式配置
.baudRate = 400000UL,//波特率設(shè)置
.transferType = LPI2C_USING_INTERRUPTS,//傳輸方式
.dmaChannel = 0U,//若使能了DMA,則DMA設(shè)置的通道
.masterCallback = NULL,//中斷函數(shù)
.callbackParam = NULL
};
LPI2C_DRV_MasterInit(INST_LPI2C1,&lpi2c1_MasterConfig0,&lpi2c1MasterState);//LPI2C作為主機初始化
LPI2C_DRV_MasterSendDataBlocking(INST_LPI2C1, masterTxBuffer, BUFF_SIZE, true, OSIF_WAIT_FOREVER);//LPI2C作為主機發(fā)送數(shù)據(jù)
while(!((LPI2C1->MSR)&LPI2C_MSR_SDF_MASK))//停止位檢測
{
LPI2C_DRV_MasterReceiveDataBlocking(INST_LPI2C1,masterRxBuffer, BUFF_SIZE, true, OSIF_WAIT_FOREVER);//LPI2C作為主機接收數(shù)據(jù)
}
1. LPI2C作為從機收發(fā)數(shù)據(jù)
LPI2C作為從機,地址設(shè)置50,配置中斷接收,設(shè)置參數(shù)如下:
lpi2c_slave_user_config_t lpi2c1_SlaveConfig0 = {
.slaveAddress = 50U,//從機地址
.is10bitAddr = false,//十位地址配置
.operatingMode = LPI2C_FAST_MODE,//模式配置
.slaveListening = true,//監(jiān)聽模式
.transferType = LPI2C_USING_INTERRUPTS,//中斷傳輸
.dmaChannel = 0U,//若配置了DMA,則從機DMA的通道
.slaveCallback = lpi2c1_SlaveCallback0,//從機中斷函數(shù)
.callbackParam = NULL
};
LPI2C_DRV_SlaveInit(INST_LPI2C1, &lpi2c1_SlaveConfig0, &lpi2c1SlaveState);//從機初始化
中斷內(nèi)進行數(shù)據(jù)收發(fā):
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://從機接收數(shù)據(jù)
LPI2C_DRV_SlaveSetRxBuffer(instance,slaveRxBuffer, BUFF_SIZE);
break;
case I2C_SLAVE_EVENT_TX_REQ://從機發(fā)送數(shù)據(jù)
LPI2C_DRV_SlaveSetTxBuffer(instance, slaveTxBuffer, BUFF_SIZE);
break;
case I2C_SLAVE_EVENT_TX_EMPTY://發(fā)送完成
case I2C_SLAVE_EVENT_RX_FULL://接收完成
break;
case I2C_SLAVE_EVENT_STOP:
SendOK = true;
break;
}
}
至此,LPI2C模塊簡單的主機從機特性及主機從機傳輸機制講述完畢。
-
微控制器
+關(guān)注
關(guān)注
48文章
7951瀏覽量
154961 -
mcu
+關(guān)注
關(guān)注
146文章
17978瀏覽量
366676 -
接口
+關(guān)注
關(guān)注
33文章
9000瀏覽量
153712 -
fifo
+關(guān)注
關(guān)注
3文章
401瀏覽量
44806
原文標(biāo)題:MCU微課堂|CKS32K148 LPI2C
文章出處:【微信號:中科芯MCU,微信公眾號:中科芯MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
一文詳解微控制器

中科芯CKS32F030K6T6 高性能32位RISC內(nèi)核MCU 程序兼容STM32F030K6T6
請問如何在RTD5.0中設(shè)置S32K312的Lpi2c速度?
FRDM-MCXN947在初始化lpI2C時, I2C無法正常工作怎么解決?
LPI2C如何在tx fifo計數(shù)為0時繼續(xù)發(fā)送時鐘?
如果LPI2C可以低功耗運行,怎么知道LPI2C運行在stop模式?
如何使用lpi2c0_SlaveCallback0函數(shù)?
請問S32K148 LPI2C主控如何支持時鐘延展功能?
imxrt1052使用LPI2C_MasterTransferNonBlocking API時的i2c傳輸模式卡在irq_callback中怎么解決?
S32K148微控制器是否支持帶PHY的MII模式?
有沒有辦法配置lpi2c來嗅探總線并將所有數(shù)據(jù)存儲在緩沖區(qū)中?
為什么無法在LPI2C4上發(fā)送數(shù)據(jù)?
S32K148如何計算微控制器最壞情況下的電流消耗?
昂科燒錄器支持CETC中科芯的32位微控制器CKS32F051K8U

評論