S32K1XX_IIC通信之AT24C02

本文章介绍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的时序要求发送的波形。
如图为写数据波形
在这里插入图片描述
如图为读数据波形
在这里插入图片描述

波形时序,可以参照如下图所示
写数据:起始信号 + 器件地址+写指令 +应答 + 芯片内部地址 +应答+数据+应答+停止信号
读数据:起始信号 + 器件地址 + 写指令 + 应答 + 芯片内部地址 + 应答 +起始信号 +器件地址 + 读指令 +应答 + 回复数据 + 应答 + 停止信号

在这里插入图片描述

  • 21
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值