S32K144(18)LPI2C

本文详细介绍了LPI2C(Low-Power Inter-Integrated Circuit)模块,包括2线和4线接法,信号方向,以及一系列的寄存器配置,如MasterControlRegister、MasterStatusRegister等。通过示例代码展示了初始化和传输数据的过程,揭示了LPI2C在低功耗I2C通信中的应用。
摘要由CSDN通过智能技术生成

1、简介

LPI2C可以用来实现2线或4线I2C串行总线。

2、信号方向

Signal

Name

2-Wire Scheme4-Wire Scheme
SCLLPI2C clock lineSCLIn 4-wire mode, this is the SCL input pin
SDALPI2C data lineSDAIn 4-wire mode, this is the SDA input pin
HREQHost requestif host request is asserted and the I2C bus is idle, then it will initiate an LPI2C  master transfer
SCLSSecondary I2C clock lineNot UsedIn 4-wire mode, this is the SCLS output pin. If LPI2C master/slave are configured to use separate pins, then this the LPI2C slave SCL pin
SDASSecondary I2C data lineNot UsedIn 4-wire mode, this is the SDAS output pin. If LPI2C master/slave are configured to use separate pins, then this the LPI2C slave SDA pin

2.1、2-wire接法

2.2、4-wire接法

3、寄存器

与SPI极度相似

3.1、Version ID Register (VERID)

版本id寄存器

3.2、Parameter Register (PARAM)

主机接收和发送FIFO大小

3.3、Master Control Register (MCR)

0

MEN

主机使能

1

RST

软件复位

2

DOZEN

Doze模式使能

3

DEGEN

调试模式使能

8

RTF

复位发送FIFO

9

RRF

复位接收FIFO

3.4、 Master Status Register (MSR)

0

TDF

发送数据标志

0:没有请求发送数据

1:请求发送数据

1

RDF

接收数据标志

0:没有准备好的接收数据

1:接收数据就绪

8

EPF

结束包标志

9

SDF

停止检测标志

10

NDF

NACK检测标志

11

ALF

仲裁标志

12

FEF

FIFO错误标志

13

PLTF

引脚低电平超时标志

14

DMF

数据匹配标志

24

BBF

主机忙标志

25

BBF

总线忙标志

3.5、 Master Interrupt Enable Register (MIER)

0

TDIE

发送数据中断

1

RDIE

接收数据中断

8

EPIE

结束包中断

9

SDIE

停止检测中断

10

NDIE

NACK检测中断

11

ALIE

仲裁中断

12

FEIE

FIFO错误中断

13

PLTIE

引脚低电平超时中断

14

DMIE

数据匹配中断

3.6、 Master DMA Enable Register (MDER)

接收数据DMA使能

3.7、Master Configuration Register 0 (MCFGR0)

0

HREN

主机请求使能

1

HRPOL

配置主机请求引脚电平

2

HRSEL

主机请求选择

8

CIRFIFO

循环FIFO使能

9

RDMO

只接收数据匹配

3.8、 Master Configuration Register 1 (MCFGR1)

 

0-2

PRESCALE

分频设置

8

AUTOSTOP

自动停止条件

9

IGNACK

设置是否接收ACK、NACK

10

TIMECFG

超时操作

16-18

MATCFG

匹配设置

24-26

PINCFG

引脚设置

 3.9、Master Configuration Register 2 (MCFGR2)

0-11

BUSIDLE

总线idle超时

16-19

FILTSCL

故障过滤SCL

24-27

FILTSDA

故障过滤SDA

3.10、 Master Configuration Register 3 (MCFGR3)

8-19

PINLOW

低电平超时时间

3.11、Master Data Match Register (MDMR)

匹配0/1的值

3.12、Master Clock Configuration Register 0 (MCCR0/1)

0-5

CLKLO

时钟低电平周期

0-5

CLKHI

时钟高电平周期

16-21

SETHOLD

启动延时

24-29

DATAVD

数据有效延时

3.13、Master FIFO Control Register (MFCR)

接收和发送的FIFO 水印配置

3.14、Master FIFO Status Register (MFSR)

接收和发送的FIFO计数

3.15、Master Transmit Data Register (MTDR)

0-7

DATA

发送数据

8-10

CMD

数据命令

3.16、Master Receive Data Register (MRDR)

0-7

DATA

接收数据

14

RXEMPTY

接收FIFO是否为空

3.17、Slave Control Register (SCR)

3.18、Slave Status Register (SSR)

3.19、Slave Interrupt Enable Register (SIER)

3.20、Slave Interrupt Enable Register (SIER)

3.21、Slave Configuration Register 1 (SCFGR1)

3.22、Slave Configuration Register 2 (SCFGR2)

3.23、Slave Address Match Register (SAMR)

3.24、Slave Address Status Register (SASR)

3.25、Slave Transmit ACK Register (STAR)

3.26、Slave Transmit Data Register (STDR)

3.27、Slave Receive Data Register (SRDR)

从机与主机基本一样的内容

4、代码搬运工

void LPI2C_init(void)
{
	/* Clk src: SIRCDIV2_CLK
	 * Enable clock for LPI2C0 */
    PCC->PCCn[PCC_LPI2C0_INDEX]	|= PCC_PCCn_PCS(2)
								| PCC_PCCn_CGC_MASK;

	/* Prescale = 4
	 * Ignore NACK */
    LPI2C0->MCFGR1	= LPI2C_MCFGR1_PRESCALE(2)|LPI2C_MCFGR1_IGNACK_MASK;
    /* SCL_freq = Input_freq / (2^PRESCALER * (CLKLO + CLKHI + 2)) */
    LPI2C0->MCCR0	= LPI2C_MCCR0_CLKLO(18)
					| LPI2C_MCCR0_CLKHI(6)
					| LPI2C_MCCR0_SETHOLD(6)
					| LPI2C_MCCR0_DATAVD(3);
	/* Transmitter Water mark set to 0
	 * Receiver Water mark set to 3 */
    LPI2C0->MFCR = LPI2C_MFCR_TXWATER(0)
                  |LPI2C_MFCR_RXWATER(3);

    /* Enable LPI2C as master */
    LPI2C0->MCR |= LPI2C_MCR_MEN_MASK
            | LPI2C_MCR_DBGEN_MASK;
}


void LPI2C_Transmit (void)
{
	LPI2C0->MTDR = (0x05<<8)|((0x1E<<1)|0);
}

 

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个基本的S32K144 LPI2C的驱动的代码框架,供您参考: ```c #include "S32K144.h" // 定义I2C时钟频率 #define I2C_CLOCK_FREQ 100000 // 100 kHz // 定义I2C读写操作标志 #define I2C_WRITE 0 #define I2C_READ 1 // 定义I2C传输状态标志 #define I2C_IDLE 0 #define I2C_BUSY 1 // 定义I2C错误代码 #define I2C_OK 0 #define I2C_ERROR -1 // 定义I2C传输结构体 typedef struct { uint8_t addr; // 7位I2C设备地址 uint8_t dir; // 读写方向 uint8_t *data; // 数据缓冲区指针 uint32_t len; // 数据长度 uint32_t index; // 当前传输数据的下标 uint8_t status; // 传输状态 uint8_t error; // 错误代码 } i2c_transfer_t; // 定义LPI2C模块指针 LPI2C_Type *i2c = LPI2C0; // 定义I2C传输结构体实例 i2c_transfer_t i2c_transfer; // I2C初始化函数 void i2c_init() { // 使能LPI2C时钟 PCC->PCCn[PCC_LPI2C0_INDEX] |= PCC_PCCn_CGC_MASK; // 设置LPI2C引脚复用 PORTD->PCR[8] = PORT_PCR_MUX(2) | PORT_PCR_ODE_MASK; // SCL PORTD->PCR[9] = PORT_PCR_MUX(2) | PORT_PCR_ODE_MASK; // SDA // 重置LPI2C模块 i2c->MCR |= LPI2C_MCR_RST_MASK; while (i2c->MCR & LPI2C_MCR_RST_MASK); // 配置LPI2C时钟 uint32_t clock_freq = (uint32_t)(CLOCK_GetBusClkFreq() / 1000000); i2c->MCCR0 = (clock_freq / (5 * I2C_CLOCK_FREQ)) - 1; i2c->MCCR1 = (clock_freq / (5 * I2C_CLOCK_FREQ)) - 1; // 配置LPI2C控制寄存器 i2c->MCR |= LPI2C_MCR_MEN_MASK; // 使能LPI2C模块 i2c->MCFGR1 = LPI2C_MCFGR1_PRESCALE(0); // 设置预分频器 i2c->MCFGR2 = LPI2C_MCFGR2_BUSIDLE(10); // 设置总线空闲时间 i2c->MCFGR3 = LPI2C_MCFGR3_PINLOW(10) | LPI2C_MCFGR3_SDAHOLD(10); // 配置SDA低电平时间和SDA保持时间 i2c->MCR |= LPI2C_MCR_FRZ_MASK; // 冻结LPI2C模块 } // 发起I2C传输函数 int i2c_transfer(uint8_t addr, uint8_t dir, uint8_t *data, uint32_t len) { // 判断是否有其他传输正在进行 if (i2c_transfer.status == I2C_BUSY) { return I2C_ERROR; } // 保存传输信息 i2c_transfer.addr = (addr << 1) | dir; i2c_transfer.dir = dir; i2c_transfer.data = data; i2c_transfer.len = len; i2c_transfer.index = 0; i2c_transfer.status = I2C_BUSY; i2c_transfer.error = I2C_OK; // 配置LPI2C传输 i2c->MTDR = i2c_transfer.addr; i2c->MCR &= ~LPI2C_MCR_FRZ_MASK; // 解冻LPI2C模块 i2c->MCR |= LPI2C_MCR_TX_MASK; // 设置为发送模式 i2c->MCR &= ~LPI2C_MCR_MEN_MASK; // 禁止LPI2C模块 i2c->MCR |= LPI2C_MCR_MEN_MASK; // 使能LPI2C模块 return I2C_OK; } // LPI2C中断服务函数 void LPI2C0_IRQHandler() { // 判断是否是传输完成中断 if (i2c->MSR & LPI2C_MSR_MBF_MASK) { // 判断是否是读取模式 if (i2c_transfer.dir == I2C_READ) { i2c_transfer.data[i2c_transfer.index++] = i2c->MRDR; } else { // 判断是否还有数据需要发送 if (i2c_transfer.index < i2c_transfer.len) { i2c->MTDR = i2c_transfer.data[i2c_transfer.index++]; } else { // 传输完成,禁用LPI2C中断 i2c_transfer.status = I2C_IDLE; i2c->MIER &= ~LPI2C_MIER_TDIE_MASK; } } } // 判断是否是传输错误中断 if (i2c->MSR & LPI2C_MSR_NDF_MASK) { i2c_transfer.status = I2C_IDLE; i2c_transfer.error = I2C_ERROR; i2c->MIER &= ~LPI2C_MIER_TDIE_MASK; } } ``` 这是一个基本的I2C驱动框架,实现了基本的读写操作和错误处理。需要注意的是,该代码只是一个框架,实际使用时还需要根据具体的需求进行修改和优化。同时,该代码中使用了LPI2C模块来实现I2C通信,如果您使用的是别的I2C控制器,代码需要进行相应的修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值