本文章介绍K32K144的IIC通信的驱动搭建,如果是纯小白,对IIC通信不了解的,建议先去查看IIC相关协议内容。
我会利用常见的EEPROM,AT24C02模块,搭建IIC驱动,验证功能。实现往AT24C02里面存数据,以及读取数据。
首先是芯片PIN配置与外设配置方面
S32K144仅有一个LPI2C模块,这里我选择引脚映射到PTA3-SCL PTA2-SDA。下面的“方向”自动设定为INPUT/OUTPUT,即输入输出功能复用。
再外设配置中,在DRIVER中选择lpi2c
Name表示配置信息,后续代码中会生成相同名字的结构体,根据喜好与要求命名即可
Read Only表示const修饰的结构体,里面的信息不可改,可以不勾选
Slave address表示从机地址,AC24C02的地址bit3-bit6为1010,bit0-bit2对应引脚的A1,A2,A3的状态,原理图中默认接地,为000,即1010000,16进制表示为0X50
10-bit slave addres表示是否为10位地址,AT24C02为普通的8位地址,此处不勾选
I2C Operating mode 表示工作模式位标准模式或者快速模式,此处选择普通模式,如果需要速度很快,可以选择快速模式
Baudrate为通信波特率,经过调试之后,50K速率即50 000比较合适,波形比较完整,根据实际需求调节
LPI2C transfer表示传输方式,此处选用中断传输
DMA Channel 没有选择,写0
回调函数可根据实际需求选择
简单介绍一下AT24C02模块,这是网上购买的一块现成模块,跳线帽控制A1,A2,A3的电平状态,如果使用多个AD24C02模块,根据实际需求配置其地址,防止与其他IIC设备地址重复,WP为写保护位,给高电平使能,就成了只读状态,不可写。此处也是默认接地。
简单看一下代码部分,实现对某一个地址的读写。
初始化部分:时钟初始化,GPIO初始化,IIC初始化
使用LPI2C_DRV_MasterInit函数时,里面传入IIC通道为“0”,结构体,最后一个形参也是包含的部分信息,为了编译通过,可以声明但不赋值
LPI2C_DRV_MasterSendDataBlocking函数为发送写信号,里面会包含地址并便宜运算,我理解为发送读取信号,传入的形参为:通道,数据,数据字节长度,是否带停止信号,延时时间。
LPI2C_DRV_MasterReceiveDataBlocking为发送读取信号,参数与上面类似。
#include "sdk_project_config.h"
#include <string.h>
#include <stdint.h>
#include <stdbool.h>
void AT24C02_READ_1(unsigned char address,unsigned char *receivedata) //读取数据
{
unsigned char addr= address; //读取的地址
LPI2C_DRV_MasterSendDataBlocking(0,&addr,1,0,2000); //发送起始信号+读取地址 不加停止信号
LPI2C_DRV_MasterReceiveDataBlocking(0,receivedata,1,1,2000); //发送起始信号+结束信号,读取回来的数据
}
void AT24C02_WRITE_1(unsigned char address,unsigned char *data)
{
unsigned char a[2] = {0};
a[0] = address;
a[1] = data[0];
LPI2C_DRV_MasterSendDataBlocking(0,&a[0],2,1,2000); //发送起始信号+写入地址 + 1字节数据 + 结束信号
}
unsigned char rec_data = 0; //接收的值
unsigned char trans_data = 1; //写入的值
int main(void)
{
CLOCK_DRV_Init(&clockMan1_InitConfig0);
PINS_DRV_Init(NUM_OF_CONFIGURED_PINS0, g_pin_mux_InitConfigArr0);
lpi2c_master_state_t temp;
LPI2C_DRV_MasterInit(0,&lpi2c0_MasterConfig0,&temp); //IIC初始化
while(1)
{
AT24C02_WRITE_1(0x00,&trans_data); //往地址0X00中写入1
int a = 114* 100;
while(a--); //写完数据之后,需要一定延时
AT24C02_READ_1(0x00,&rec_data); //读取地址0X00中的值
}
}
效果展示:
代码是先写再读进行验证,可以发现读到的数与写入的符合。
如果为波形解析,按照AT24C02的时序要求发送的波形。
如图为写数据波形
如图为读数据波形
波形时序,可以参照如下图所示
写数据:起始信号 + 器件地址+写指令 +应答 + 芯片内部地址 +应答+数据+应答+停止信号
读数据:起始信号 + 器件地址 + 写指令 + 应答 + 芯片内部地址 + 应答 +起始信号 +器件地址 + 读指令 +应答 + 回复数据 + 应答 + 停止信号