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

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

3天内不再提示

CW32单片机I2C接口读写EEPROM芯片介绍

jf_pJlTbmA9 来源:武汉芯源半导体 作者:武汉芯源半导体 2023-11-09 17:42 次阅读

一、概述

CW32L083 内部集成 2 个 I2C 控制器,能按照设定的传输速率(标准,快速,高速)将需要发送的数据按照 I2C 规范串行发送到 I2C 总线上,或从总线上接收数据,并对通信过程中的状态进行检测,另外还支持多主机通信中的总线冲突和仲裁处理。

二、主要功能

• 支持主机发送 / 接收,从机发送 / 接收四种工作模式

• 支持时钟延展 ( 时钟同步 ) 和多主机通信冲突仲裁

• 支持标准 (100Kbps)/ 快速 (400Kbps)/ 高速 (1Mbps) 三种工作速率

• 支持 7bit 寻址功能

• 支持 3个从机地址

• 支持广播地址

• 支持输入信号噪声过滤功能

• 支持中断状态查询功能

1.协议介绍

I2C 总线使用两根信号线(数据线 SDA 和时钟线 SCL)在设备间传输数据。SCL 为单向时钟线,固定由主机驱动。SDA 为双向数据线,在数据传输过程中由收发两端分时驱动。I2C 总线上可以连接多个设备,所有设备在没有进行数据传输时都处于空闲状态(未寻址从机接收模式),任一设备都可以作为主机发送 START 起始信号来开始数据传输,在 STOP 停止信号出现在总线上之前,总线一直处于 被占用状态。I2C 通信采用主从结构,并由主机发起和结束通信。主机通过发送 START 起始信号来发起通信,之后发送 SLA+W/R 共 8bit 数据(其中,SLA 为 7bit 从机地址,W/R 为读写位),并在第 9个SCL 时钟释放 SDA 总线, 对应的从机在第 9个SCL 时钟占用 SDA 总线并输出 ACK 应答信号,完成从机寻址。此后根据主机发送的第 1 字 节的 W/R 位来决定数据通信的发端和收端,发端每发送 1个字节数据,收端必须回应 1个ACK 应答信号。数据传输完成后,主机发送 STOP 信号结束本次通信。

2.功能框图

I2C 模块主要包括时钟发生器、输入滤波器、地址比较器、协议控制逻辑、仲裁和同步逻辑、以及相关寄存器等。

wKgZomQ2GqKAZh-xAAGGV44_XJ4988.jpg

CW32L083 支持用户灵活选择 GPIO 作为 I2C 通信引脚,如下表所示:

wKgaomQ2GqKALtozAADlg1I4piY840.jpg

3.I2C中断

I2C 控制寄存器 I2Cx_CR 的 SI 位域为中断标志位。当 I2C 状态寄存器 I2Cx_STAT 的 STAT 位域值发生改变(变成 0xF8 除外)时,I2Cx_CR.SI 标志位就会被置位,同时产生中断请求。在用户 I2C 中断服务程序中,应查询 I2C 状态寄存器 I2Cx_STAT 的 STAT 位域值获取 I2C 总线的状态,以确定中断产生原因。设置 I2Cx_CR.SI 为 0 清除该标志位。

4.工作模式

I2C 控制器支持 4 种工作模式:主机发送模式、主机接收模式、从机发送模式、从机接收模式。另外还支持广播 接收模式,其工作方式和从机接收模式类似。

三、EEPROM(CW24C02AD)

1.功能简介

CW24C02是一个2Kbit的串行EEPROM存储芯片,可存储256个字节数据。芯片内部分为32页,每页8字节。工作电压范围为1.7V到5.5V,I2C接口时钟频率为 1MHz (5V,3V),400 KHz (1.7V)。器件地址为1010 A2 A1 A0,对于我们单板A2 A1 A0引脚全部接GND,故器件地址为1010000,即0x50。器件内部存储空间地址长度8 bit。

2.读写时序

字节写操作时序:起始信号+器件地址(7bit)+读写指示(1bit)+存储空间地址(8bit)+写入数据(8bit)+停止信号,即可完成指定字节写入操作。

wKgZomQ2Gw2AZLzkAABj0zN-tdE419.jpg

页写操作时序:起始信号+器件地址(7bit)+读写指示(1bit)+存储空间地址(8bit)+写入数据(8bit*8)+停止信号,即可完成指定地址(必须是页起始地址)的页写入操作。

wKgaomQ2GxuASO6tAACc9-EuvGU005.jpg

随机读操作时序:起始信号+器件地址(7bit)+读写指示(1bit)+存储空间地址(8bit)+重复起始信号+器件地址(7bit)+读写指示(1bit),之后器件会返回1字节数据,主机收到后发送停止信号,即可完成指定字节读取操作。

wKgaomQ2GqKAGMlKAACmS_kzOVY593.jpg

顺序读操作时序:和随机读时序类似,只是在主机接收到1字节数据后,不发送停止信号,而是继续发送时钟进行下一个字节数据的接收,直到所有所需读取的数据全部读取,之后再发送停止信号。

四、硬件连接

如下图所示,MCU和EEPROM通过I2C总线互连。

wKgZomQ2GqKAZrYsAACJV-4diG4208.jpg

五、实例演示:MCU采用页写和顺序读操作时序完成EERPOM的访问。

1.I2C读写EEPROM芯片中断函数(I2C分为I2C1和I2C2)

voidI2c1EepromReadWriteInterruptFunction(void)
{
u8State=I2C_GetState(CW_I2C1);//I2C:获取状态寄存器函数
switch(u8State)
{
case0x08://发送完START信号
I2C_GenerateSTART(CW_I2C1,DISABLE);//发送START信号
I2C_Send7bitAddress(CW_I2C1,I2C_SLAVEADDRESS,0X00);//做主时发送从机地址字节
break;
case0x10://发送完重复起始信号
I2C_GenerateSTART(CW_I2C1,DISABLE);
if(0==SendFlg)
{
I2C_Send7bitAddress(CW_I2C1,I2C_SLAVEADDRESS,0X00);//写命令
}
else
{
I2C_Send7bitAddress(CW_I2C1,I2C_SLAVEADDRESS,0X01);//读命令,eeprom随机读
}
break;
case0x18://发送完SLA+W/R字节
I2C_GenerateSTART(CW_I2C1,DISABLE);
I2C_SendData(CW_I2C1,u8Addr);//发送访问EEPROM的目标地址字节
break;
case0x20://发送完SLA+W后从机返回NACK
case0x38://主机在发送SLA+W阶段或者发送数据阶段丢失仲裁或者主机在发送SLA+R阶段或者回应NACK阶段丢失仲裁
case0x30://发送完一个数据字节后从机返回NACK
case0x48://发送完SLA+R后从机返回NACK
I2C_GenerateSTOP(CW_I2C1,ENABLE);
I2C_GenerateSTART(CW_I2C1,ENABLE);
break;
case0x58://接收到一个数据字节,且NACK已回复
u8Recdata[u8RecvLen++]=I2C_ReceiveData(CW_I2C1);//所有数据读取完成,NACK已发送
receivedflag=1;
I2C_GenerateSTOP(CW_I2C1,ENABLE);//发送停止条件
break;
case0x28://发送完1字节数据:发送EEPROM中memory地址也会产生,发送后面的数据也会产生
if(0==SendFlg)
{
if(u8SendLenCR_f.STA=1;//setstart//发送重复START信号,START生成函数改写后,会导致0X10状态被略过,故此处不调用函数
I2C_GenerateSTOP(CW_I2C1,DISABLE);
}
break;
case0x40://发送完SLA+R信号,开始接收数据
u8RecvLen=0;
if(READLEN>1)
{
I2C_AcknowledgeConfig(CW_I2C1,ENABLE);//读取数据超过1个字节才发送ACK
}
break;
case0x50://接收完一字节数据,在接收最后1字节数据之前设置AA=0;
u8Recdata[u8RecvLen++]=I2C_ReceiveData(CW_I2C1);
if(u8RecvLen==READLEN-1)
{
I2C_AcknowledgeConfig(CW_I2C1,DISABLE);;
}
break;
}
I2C_ClearIrq(CW_I2C1);
}

2.设置系统时钟

voidRCC_Configuration(void)
{
CW_SYSCTRL->APBEN1_f.I2C1=1U;
}

3.设置GPIO口

voidGPIO_Configuration(void)
{
GPIO_InitTypeDefGPIO_InitStructure={0};
CW_SYSCTRL->AHBEN_f.GPIOA=1;
CW_SYSCTRL->AHBEN_f.GPIOB=1;
CW_SYSCTRL->AHBEN_f.GPIOC=1;
CW_SYSCTRL->AHBEN_f.GPIOD=1;
CW_SYSCTRL->AHBEN_f.GPIOE=1;
CW_SYSCTRL->AHBEN_f.GPIOF=1;

PB10_AFx_I2C1SCL();
PB11_AFx_I2C1SDA();
GPIO_InitStructure.Pins=I2C1_SCL_GPIO_PIN|I2C1_SDA_GPIO_PIN;
GPIO_InitStructure.Mode=GPIO_MODE_OUTPUT_OD;
GPIO_Init(I2C1_SCL_GPIO_PORT, GPIO_InitStructure);
}

4.配置嵌套矢量中断控制器

voidNVIC_Configuration(void)
{
__disable_irq();
NVIC_EnableIRQ(I2C1_IRQn);
__enable_irq();
}
voidI2C1_IRQHandler(void)
{
I2c1EepromReadWriteInterruptFunction();
}

5.定义常量

#defineI2C1_SCL_GPIO_PORTCW_GPIOB
#defineI2C1_SCL_GPIO_PINGPIO_PIN_10
#defineI2C1_SDA_GPIO_PORTCW_GPIOB
#defineI2C1_SDA_GPIO_PINGPIO_PIN_11
//EEPROM内部地址
uint8_tu8Addr=0x00;//地址字节
#defineWRITELEN8//写数据长度
#defineREADLEN8//读数据长度
#defineWriteReadCycle35//写读次数,每次写入数据为n+i(n为次数,i=0~7)
uint8_tu8Senddata[8]={0x66,0x02,0x03,0x04,0x05,0x60,0x70,0x20};
uint8_tu8Senddata2[8]={0x55,0xAA,0xAA,0x55,0x55,0xAA,0x55,0xAA};
uint8_tu8Recdata[16]={0x00};
uint8_tu8SendLen=0;
uint8_tu8RecvLen=0;
uint8_tSendFlg=0,Comm_flg=0;
uint8_tu8recvflg=0;
uint8_tu8State=0;
uint8_treceivedflag=0;//读取完成标志

6.主程序:利用I2C接口,采用中断方式读写EEPROM芯片(CW24C02)。

int32_tmain(void)
{
I2C_InitTypeDefI2C_InitStruct={0};
uint16_ttempcnt=0;
RCC_Configuration();//时钟初始化
GPIO_Configuration();//IO口初始化
//I2C初始化
I2C_InitStruct.I2C_Baud=0x01;//500K=(8000000/(8*(1+1)),波特率计数器配置
I2C_InitStruct.I2C_BaudEn=ENABLE;//波特率计数器使能
I2C_InitStruct.I2C_FLT=DISABLE;//=WriteReadCycle)//测试次数完成,退出
{
break;
}
}
while(1);
}

7.程序流程

程序完成I2C主设备配置后,先将u8Senddata数组中的内容写入到EEPROM的第1页(CW24C02每页8字节):发送START信号后,I2C模块会产生状态改变中断,在中断服务程序中根据不同状态值进行不同处理,直到完成CW24C02的页写模式所有数据字节以及STOP信号发送,发送完成后置写操作流程完成标志。主循环中判断到写操作流程完成后,启动从EERROM的第1页数据读取流程:发送启动信号后,I2C模块会产生状态改变中断,在中断服务程序中根据不同状态值进行不同处理,直到完成CW24C02的顺序读模式所有数据字节发送及读取,在发送完STOP信号后置读操作流程完成标志。主循环中判断读操作流程完成后,初始化u8Senddata数组内容,重复下一次测试过程。完成WriteReadCycle变量设置的测试次数后退出。

来源:武汉芯源半导体

审核编辑:汤梓红

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

    关注

    6001

    文章

    43973

    浏览量

    620834
  • EEPROM
    +关注

    关注

    9

    文章

    927

    浏览量

    80314
  • I2C接口
    +关注

    关注

    1

    文章

    119

    浏览量

    24849
收藏 人收藏

    评论

    相关推荐

    基于I2C串行总线在单片机系统中的数据

    本帖最后由 luna 于 2011-3-3 12:06 编辑 简要介绍I2C串行总线原理及AT24CXX系列串行EEPROM的特点。着重阐述了利用I2C串行总线和AT24CXX
    发表于 03-02 14:36

    i2cEEPROM读写,计数

    i2cEEPROM读写,计数,附程序代码
    发表于 11-30 15:01

    I2C接口EEPROM烧写软件介绍以及源码下载

    本软件可以通过Ginkgo I2C适配器对EEPROM芯片进行读写数据,当然也可以自己修改程序用于自己的硬件。软件功能简介: 支持多通道操作,硬件模式支持
    发表于 12-13 10:37

    如何使用高速通用I2C接口单片机相连接?

    本文介绍一种 采用Philips公司带I2C接口的USB接口芯片PDIUSBD11进行USB接口
    发表于 04-22 06:28

    I2C协议以及I2C读写EEPROM

    I2C协议以及I2C读写EEPROM实验文章目录I2C协议以及I2C
    发表于 08-23 08:25

    单片机I2C协议资料分享

    关于STM32学习分享第七章 I2C协议(读写EEPROM)文章目录关于STM32学习分享前言二、代码1.i2c.c2.i2c.h3.main.c总结前言开始!开始!
    发表于 01-25 08:14

    CW32单片机I2C接口读写EEPROM芯片介绍

    u8recvflg=0;uint8_t u8State = 0;uint8_t receivedflag = 0; //读取完成标志6.主程序:利用I2C接口,采用中断方式读写EEPROM
    发表于 04-12 10:45

    CH32V103基础教程37-I2C-软件模拟I2C读写EEPROM

    前面章节第14章已经进行过硬件IIC读写EEPROM的实验,本章教程将使用软件模拟IIC读写EEPROM,并通过串口调试助手将读写结果打印显
    发表于 04-23 16:04

    CW32饭盒派开发板试用体验】+初识CW32饭盒派开发板

    盼星星,盼月亮,终于收到了CW32饭盒派开发板。回想起那天答复参加活动邮件发出去的那一刻,就在期盼。 以前也了解过CW32单片机,这是一款非常优秀的32位单片机。外部资源也丰富。这回的
    发表于 05-29 15:51

    CW32单片机在智能马桶的应用介绍

    和调节。本文将介绍CW32单片机在智能马桶的详细应用。 图:CW32的智能马桶控制板 CW32单片机
    发表于 12-20 10:06

    I2C串行EEPROM与PICmicro单片机接口设计

    I2C串行EEPROM与PICmicro单片机接口设计说明。
    发表于 05-11 10:24 7次下载

    CW32单片机低电压检测器的使用介绍

    CW32单片机低电压检测器的使用介绍
    的头像 发表于 09-18 10:56 621次阅读
    <b class='flag-5'>CW32</b><b class='flag-5'>单片机</b>低电压检测器的使用<b class='flag-5'>介绍</b>

    CW32单片机UART波特率设置介绍

    CW32单片机UART波特率设置介绍
    的头像 发表于 10-24 17:35 492次阅读
    <b class='flag-5'>CW32</b><b class='flag-5'>单片机</b>UART波特率设置<b class='flag-5'>介绍</b>

    CW32单片机UART基本数据收发功能介绍

    CW32单片机UART基本数据收发功能介绍
    的头像 发表于 10-24 16:50 408次阅读
    <b class='flag-5'>CW32</b><b class='flag-5'>单片机</b>UART基本数据收发功能<b class='flag-5'>介绍</b>

    CW32单片机在智能马桶的应用介绍

    和调节。本文将介绍CW32单片机在智能马桶的详细应用。图:CW32的智能马桶控制板CW32单片机
    的头像 发表于 12-20 10:09 257次阅读
    <b class='flag-5'>CW32</b><b class='flag-5'>单片机</b>在智能马桶的应用<b class='flag-5'>介绍</b>