完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
一、概述 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 模块主要包括时钟发生器、输入滤波器、地址比较器、协议控制逻辑、仲裁和同步逻辑、以及相关寄存器等。 CW32L083 支持用户灵活选择 GPIO 作为 I2C 通信引脚,如下表所示: 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)+停止信号,即可完成指定字节写入操作。 页写操作时序:起始信号+器件地址(7bit)+读写指示(1bit)+存储空间地址(8bit)+写入数据(8bit*8)+停止信号,即可完成指定地址(必须是页起始地址)的页写入操作。 随机读操作时序:起始信号+器件地址(7bit)+读写指示(1bit)+存储空间地址(8bit)+重复起始信号+器件地址(7bit)+读写指示(1bit),之后器件会返回1字节数据,主机收到后发送停止信号,即可完成指定字节读取操作。 顺序读操作时序:和随机读时序类似,只是在主机接收到1字节数据后,不发送停止信号,而是继续发送时钟进行下一个字节数据的接收,直到所有所需读取的数据全部读取,之后再发送停止信号。 四、硬件连接 如下图所示,MCU和EEPROM通过I2C总线互连。 五、实例演示:MCU采用页写和顺序读操作时序完成EERPOM的访问。 1.I2C读写EEPROM芯片中断函数(I2C分为I2C1和I2C2) void I2c1EepromReadWriteInterruptFunction(void) {
} 2.设置系统时钟 void RCC_Configuration(void) {
} 3.设置GPIO口 void GPIO_Configuration(void) {
} 4.配置嵌套矢量中断控制器 void NVIC_Configuration(void) {
} void I2C1_IRQHandler(void) {
} 5.定义常量 #define I2C1_SCL_GPIO_PORT CW_GPIOB #define I2C1_SCL_GPIO_PIN GPIO_PIN_10 #define I2C1_SDA_GPIO_PORT CW_GPIOB #define I2C1_SDA_GPIO_PIN GPIO_PIN_11 //EEPROM内部地址 uint8_t u8Addr = 0x00; //地址字节 #define WRITELEN 8 //写数据长度 #define READLEN 8 //读数据长度 #define WriteReadCycle 35 //写读次数,每次写入数据为n+i(n为次数,i=0~7) uint8_t u8Senddata[8] = {0x66,0x02,0x03,0x04,0x05,0x60,0x70,0x20}; uint8_t u8Senddata2[8] = {0x55,0xAA,0xAA,0x55,0x55,0xAA,0x55,0xAA}; uint8_t u8Recdata[16]= {0x00}; uint8_t u8SendLen=0; uint8_t u8RecvLen=0; uint8_t SendFlg = 0,Comm_flg = 0; uint8_t u8recvflg=0; uint8_t u8State = 0; uint8_t receivedflag = 0; //读取完成标志 6.主程序:利用I2C接口,采用中断方式读写EEPROM芯片(CW24C02)。 int32_t main(void) {
} 7.程序流程 程序完成I2C主设备配置后,先将u8Senddata数组中的内容写入到EEPROM的第1页(CW24C02每页8字节):发送START信号后,I2C模块会产生状态改变中断,在中断服务程序中根据不同状态值进行不同处理,直到完成CW24C02的页写模式所有数据字节以及STOP信号发送,发送完成后置写操作流程完成标志。主循环中判断到写操作流程完成后,启动从EERROM的第1页数据读取流程:发送启动信号后,I2C模块会产生状态改变中断,在中断服务程序中根据不同状态值进行不同处理,直到完成CW24C02的顺序读模式所有数据字节发送及读取,在发送完STOP信号后置读操作流程完成标志。主循环中判断读操作流程完成后,初始化u8Senddata数组内容,重复下一次测试过程。完成WriteReadCycle变量设置的测试次数后退出。 |
|
相关推荐 |
|
只有小组成员才能发言,加入小组>>
CW32L010安全低功耗MCU,树立M0+产品行业新标杆!
680 浏览 0 评论
866 浏览 0 评论
1301 浏览 0 评论
1189 浏览 0 评论
933 浏览 0 评论
2400浏览 1评论
973浏览 1评论
【CW32饭盒派开发板试用体验】与CW32饭盒派的第一次亲密接触
356浏览 1评论
238浏览 0评论
357浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-19 12:38 , Processed in 0.915896 second(s), Total 42, Slave 35 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号